{"id":539,"date":"2026-06-05T15:00:00","date_gmt":"2026-06-05T15:00:00","guid":{"rendered":"https:\/\/wordpress.securinsight.ca\/index.php\/2026\/06\/05\/workflows-rollback-support-now-available-in-workflows-3\/"},"modified":"2026-06-05T15:00:00","modified_gmt":"2026-06-05T15:00:00","slug":"workflows-rollback-support-now-available-in-workflows-3","status":"publish","type":"post","link":"https:\/\/wordpress.securinsight.ca\/index.php\/2026\/06\/05\/workflows-rollback-support-now-available-in-workflows-3\/","title":{"rendered":"Workflows &#8211; Rollback support now available in Workflows"},"content":{"rendered":"<p><a href=\"https:\/\/developers.cloudflare.com\/workflows\/\">Workflows<\/a> now supports saga-style rollbacks,  allowing you to add compensating logic to each <code>step.do()<\/code> in case of downstream failures. If the instance fails, the rollback handlers will execute in reverse <code>step-start<\/code> order.<\/p>\n<p>This is useful for multi-step operations that touch external systems, such as inventory reservations, payment authorization, ticket creation, or infrastructure provisioning. Instead of writing all cleanup logic in a top-level <code>catch<\/code>, you can keep each compensating action next to the step it undoes.<\/p>\n<p>Rollback handlers support their own retry and timeout configuration, and Workflows now exposes rollback outcomes in instance status responses. Workflows analytics also emits rollback lifecycle events, making it easier to distinguish a forward execution failure from a rollback failure when debugging production workflows.<\/p>\n<ul>\n<li>\n<p>JavaScript<\/p>\n<div>\n<div>\n<figure>\n<pre data-language=\"js\"><code class=\"language-js\"><div><div><span>await<\/span><span> <\/span><span>step<\/span><span>.<\/span><span>do<\/span><span>(<\/span><\/div><\/div><div><div><span>  <\/span><span>\"provision resource\"<\/span><span>,<\/span><\/div><\/div><div><div><span>  <\/span><span>async<\/span><span> <\/span><span>()<\/span><span> <\/span><span>=&gt;<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>    <\/span><span>const<\/span><span> <\/span><span>resource<\/span><span> <\/span><span>=<\/span><span> <\/span><span>await<\/span><span> <\/span><span>provisionResource<\/span><span>()<\/span><span>;<\/span><\/div><\/div><div><div><span>    <\/span><span>return<\/span><span> <\/span><span>{<\/span><span> resourceId<\/span><span>:<\/span><span> <\/span><span>resource<\/span><span>.<\/span><span>id<\/span><span> <\/span><span>};<\/span><\/div><\/div><div><div><span>  <\/span><span>},<\/span><\/div><\/div><div><div><span>  <\/span><span>{<\/span><\/div><\/div><div><div><span>    <\/span><span>rollback<\/span><span>:<\/span><span> <\/span><span>async<\/span><span> <\/span><span>({<\/span><span> <\/span><span>output<\/span><span> <\/span><span>})<\/span><span> <\/span><span>=&gt;<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>      <\/span><span>const<\/span><span> <\/span><span>{<\/span><span> <\/span><span>resourceId<\/span><span> <\/span><span>}<\/span><span> <\/span><span>=<\/span><span> <\/span><span>output<\/span><span>;<\/span><\/div><\/div><div><div><span>      <\/span><span>await<\/span><span> <\/span><span>deleteResource<\/span><span>(<\/span><span>resourceId<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div><span>    <\/span><span>},<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>rollbackConfig<\/span><span>:<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span><span>      <\/span><\/span><span>retries<\/span><span>:<\/span><span> <\/span><span>{<\/span><span> limit<\/span><span>:<\/span><span> <\/span><span>3<\/span><span>,<\/span><span> delay<\/span><span>:<\/span><span> <\/span><span>\"15 seconds\"<\/span><span>,<\/span><span> backoff<\/span><span>:<\/span><span> <\/span><span>\"linear\"<\/span><span> <\/span><span>},<\/span><\/div><\/div><div><div><span><span>      <\/span><\/span><span>timeout<\/span><span>:<\/span><span> <\/span><span>\"2 minutes\"<\/span><span>,<\/span><\/div><\/div><div><div><span>    <\/span><span>},<\/span><\/div><\/div><div><div><span>  <\/span><span>},<\/span><\/div><\/div><div><div><span>)<\/span><span>;<\/span><\/div><\/div><\/code><\/pre>\n<div>\n<div><\/div>\n<\/div>\n<div><\/div>\n<\/figure>\n<\/div><\/div>\n<\/li>\n<li>\n<p>TypeScript<\/p>\n<div>\n<div>\n<figure>\n<pre data-language=\"ts\"><code class=\"language-ts\"><div><div><span>await<\/span><span> <\/span><span>step<\/span><span>.<\/span><span>do<\/span><span>(<\/span><\/div><\/div><div><div><span>  <\/span><span>\"provision resource\"<\/span><span>,<\/span><\/div><\/div><div><div><span>  <\/span><span>async<\/span><span> <\/span><span>()<\/span><span> <\/span><span>=&gt;<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>    <\/span><span>const<\/span><span> <\/span><span>resource<\/span><span> <\/span><span>=<\/span><span> <\/span><span>await<\/span><span> <\/span><span>provisionResource<\/span><span>()<\/span><span>;<\/span><\/div><\/div><div><div><span>    <\/span><span>return<\/span><span> <\/span><span>{<\/span><span> resourceId<\/span><span>:<\/span><span> <\/span><span>resource<\/span><span>.<\/span><span>id<\/span><span> <\/span><span>};<\/span><\/div><\/div><div><div><span>  <\/span><span>},<\/span><\/div><\/div><div><div><span>  <\/span><span>{<\/span><\/div><\/div><div><div><span>    <\/span><span>rollback<\/span><span>:<\/span><span> <\/span><span>async<\/span><span> <\/span><span>({<\/span><span> <\/span><span>output<\/span><span> <\/span><span>})<\/span><span> <\/span><span>=&gt;<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>      <\/span><span>const<\/span><span> <\/span><span>{<\/span><span> <\/span><span>resourceId<\/span><span> <\/span><span>}<\/span><span> <\/span><span>=<\/span><span> <\/span><span>output<\/span><span> <\/span><span>as<\/span><span> <\/span><span>{<\/span><span> <\/span><span>resourceId<\/span><span>:<\/span><span> <\/span><span>string<\/span><span><span> <\/span><span>};<\/span><\/span><\/div><\/div><div><div><span>      <\/span><span>await<\/span><span> <\/span><span>deleteResource<\/span><span>(<\/span><span>resourceId<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div><span>    <\/span><span>},<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>rollbackConfig<\/span><span>:<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span><span>      <\/span><\/span><span>retries<\/span><span>:<\/span><span> <\/span><span>{<\/span><span> limit<\/span><span>:<\/span><span> <\/span><span>3<\/span><span>,<\/span><span> delay<\/span><span>:<\/span><span> <\/span><span>\"15 seconds\"<\/span><span>,<\/span><span> backoff<\/span><span>:<\/span><span> <\/span><span>\"linear\"<\/span><span> <\/span><span>},<\/span><\/div><\/div><div><div><span><span>      <\/span><\/span><span>timeout<\/span><span>:<\/span><span> <\/span><span>\"2 minutes\"<\/span><span>,<\/span><\/div><\/div><div><div><span>    <\/span><span>},<\/span><\/div><\/div><div><div><span>  <\/span><span>},<\/span><\/div><\/div><div><div><span>)<\/span><span>;<\/span><\/div><\/div><\/code><\/pre>\n<div>\n<div><\/div>\n<\/div>\n<div><\/div>\n<\/figure>\n<\/div><\/div>\n<\/li>\n<\/ul>\n<p>Refer to <a href=\"https:\/\/developers.cloudflare.com\/workflows\/build\/workers-api\/#rollback-options\">rollback options<\/a> to learn more.<\/p>","protected":false},"excerpt":{"rendered":"<p>Workflows now supports saga-style rollbacks, allowing you to add compensating logic to each step.do() in case of downstream failures. If the instance fails, the rollback handlers will execute in reverse step-start order. This is useful for multi-step operations that touch external systems, such as inventory reservations, payment authorization, ticket creation, or infrastructure provisioning. Instead of [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-539","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/posts\/539","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/comments?post=539"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/posts\/539\/revisions"}],"wp:attachment":[{"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/media?parent=539"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/categories?post=539"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/tags?post=539"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}