Workflows - Workflows rollback handlers now include step context
- Announced
- Tags
- Workflows
- Severity
- info, set by
reef/rss-rule-v1 - Source
- https://developers.cloudflare.com/changelog/post/2026-06-16-rollback-options/
<p><a href="https://developers.cloudflare.com/workflows/">Workflows</a> makes it easier to build reliable multi-step applications that can recover when downstream systems fail. Rollback handlers now receive the original <a href="https://developers.cloudflare.com/workflows/build/step-context/">step context</a> via a <code>ctx</code> object for the step being rolled back. This includes <code>ctx.step.name</code>, <code>ctx.step.count</code>, <code>ctx.attempt</code>, and the step <code>config</code> with defaults applied.</p> <p>The <a href="https://developers.cloudflare.com/workflows/build/workers-api/#workflowstepconfig">step configuration</a> includes the retry and timeout settings used for that step, so you can customize your step recovery logic according to those fields.</p> <figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-140thh"> step.</span><span class="nb-shiki-1t8gfj">do</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "create charge"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-140thh"> () </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> charge</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> createCharge</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> { chargeId: charge.id };</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> rollback</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> ({ </span><span class="nb-shiki-1jdh33">ctx</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">output</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">error</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // output is the value returned by the step being rolled back.</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-dzsirb">chargeId</span><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-140thh"> output </span><span class="nb-shiki-1itgoe">as</span><span class="nb-shiki-140thh"> { </span><span class="nb-shiki-1jdh33">chargeId</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-dzsirb"> string</span><span class="nb-shiki-140thh"> };</span></span> <span class="line"><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> refundCharge</span><span class="nb-shiki-140thh">(chargeId, {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // ctx is the original step context, including step name, count, attempt, and config.</span></span> <span class="line"><span class="nb-shiki-140thh"> reason: </span><span class="nb-shiki-mdbnqw">${</span><span class="nb-shiki-140thh">ctx</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">step</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">name</span><span class="nb-shiki-mdbnqw">}: ${</span><span class="nb-shiki-140thh">error</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">message</span><span class="nb-shiki-mdbnqw">}</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> rollbackConfig: {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // rollbackConfig controls retries and timeout for the rollback handler.</span></span> <span class="line"><span class="nb-shiki-140thh"> retries: { limit: </span><span class="nb-shiki-dzsirb">3</span><span class="nb-shiki-140thh">, delay: </span><span class="nb-shiki-mdbnqw">"30 seconds"</span><span class="nb-shiki-140thh">, backoff: </span><span class="nb-shiki-mdbnqw">"linear"</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> timeout: </span><span class="nb-shiki-mdbnqw">"5 minutes"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">);</span></span></code></pre></figure> <p>Refer to <a href="https://developers.cloudflare.com/workflows/build/workers-api/#rollback-options">rollback options</a> to learn more.</p>
The text above is the source's. reef added the severity, the dates it could read from the text, and the endpoints and scopes named in code.