Workflows, Workers - Schedule Workflow instances directly from your Workflow binding
You can now attach cron schedules directly to a Workflow binding in wrangler.jsonc. Each scheduled run creates a new Workflow instance automatically, so you do not need to define a separate Worker with a scheduled handler just to trigger your Workflow on an interval.
For example, you can configure hourly, every-15-minute, or weekday schedules on the same Workflow:
<div><div><span>{</span></div></div><div><div><span> </span><span>"</span><span>workflows</span><span>"</span><span>:</span><span> </span><span>[</span></div></div><div><div><span> </span><span>{</span></div></div><div><div><span> </span><span>"</span><span>name</span><span>"</span><span>:</span><span> </span><span>"my-scheduled-workflow"</span><span>,</span></div></div><div><div><span> </span><span>"</span><span>binding</span><span>"</span><span>:</span><span> </span><span>"MY_WORKFLOW"</span><span>,</span></div></div><div><div><span> </span><span>"</span><span>class_name</span><span>"</span><span>:</span><span> </span><span>"MyScheduledWorkflow"</span><span>,</span></div></div><div><div><span> </span><span>"</span><span>schedules</span><span>"</span><span>:</span><span> </span><span>[</span><span>"0 * * * *"</span><span>,</span><span> </span><span>"*/15 * * * *"</span><span>,</span><span> </span><span>"0 9 * * MON-FRI"</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></div></div>
Cron workloads get all the same benefits of Workflows with built-in retries, multi-step durable execution, and configurable timeouts of Workflows.
<div><div><span>import </span><span>{</span></div></div><div><div><span><span> </span></span><span>WorkflowEntrypoint</span><span>,</span></div></div><div><div><span><span> </span></span><span>WorkflowEvent</span><span>,</span></div></div><div><div><span><span> </span></span><span>WorkflowStep</span><span>,</span></div></div><div><div><span>}</span><span> from </span><span>"cloudflare:workers"</span><span>;</span></div></div><div><div>
</div></div><div><div><span>// Runs automatically on each cron schedule defined for the MY_WORKFLOW binding in wrangler.jsonc.</span></div></div><div><div><span>export</span><span> </span><span>class</span><span> </span><span>MyScheduledWorkflow</span><span> </span><span>extends</span><span> </span><span>WorkflowEntrypoint</span><span><</span><span>Env</span><span>></span><span> </span><span>{</span></div></div><div><div><span> </span><span>async</span><span> </span><span>run</span><span>(</span><span>event</span><span>:</span><span> </span><span>WorkflowEvent</span><span>,</span><span> </span><span>step</span><span>:</span><span> </span><span>WorkflowStep</span><span>)</span><span> </span><span>{</span></div></div><div><div><span> </span><span>const</span><span> </span><span>data</span><span> </span><span>=</span><span> </span><span>await</span><span> </span><span>step</span><span>.</span><span>do</span><span>(</span><span>"fetch source data"</span><span>,</span><span> </span><span>async</span><span> </span><span>()</span><span> </span><span>=></span><span> </span><span>{</span></div></div><div><div><span><span> </span></span><span>return</span><span> </span><span>await</span><span> </span><span>fetchSourceData</span><span>()</span><span>;</span></div></div><div><div><span> </span><span>}</span><span>)</span><span>;</span></div></div><div><div>
</div></div><div><div><span> </span><span>// If this step fails, only this step is retried with the custom logic below</span></div></div><div><div><span> </span><span>await</span><span> </span><span>step</span><span>.</span><span>do</span><span>(</span></div></div><div><div><span> </span><span>"process and store results"</span><span>,</span></div></div><div><div><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>5</span><span>,</span><span> delay</span><span>:</span><span> </span><span>"30 seconds"</span><span>,</span><span> backoff</span><span>:</span><span> </span><span>"exponential"</span><span> </span><span>},</span></div></div><div><div><span><span> </span></span><span>timeout</span><span>:</span><span> </span><span>"10 minutes"</span><span>,</span></div></div><div><div><span> </span><span>},</span></div></div><div><div><span> </span><span>async</span><span> </span><span>()</span><span> </span><span>=></span><span> </span><span>{</span></div></div><div><div><span> </span><span>await</span><span> </span><span>processAndStore</span><span>(</span><span>data</span><span>)</span><span>;</span></div></div><div><div><span> </span><span>},</span></div></div><div><div><span><span> </span></span><span>)</span><span>;</span></div></div><div><div><span> </span><span>}</span></div></div><div><div><span>}</span></div></div>
This makes it easier to build recurring, scheduled jobs such as database backups, invoice generation, report aggregation, and cleanup tasks without wiring up a separate Cron Trigger entrypoint.
For more information, refer to Trigger Workflows.
Fetched June 19, 2026



