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:
{
"workflows": [
{
"name": "my-scheduled-workflow",
"binding": "MY_WORKFLOW",
"class_name": "MyScheduledWorkflow",
"schedules": ["0 * * * *", "*/15 * * * *", "0 9 * * MON-FRI"],
},
],
}Cron workloads get all the same benefits of Workflows with built-in retries, multi-step durable execution, and configurable timeouts of Workflows.
import {
WorkflowEntrypoint,
WorkflowEvent,
WorkflowStep,
} from "cloudflare:workers";
// Runs automatically on each cron schedule defined for the MY_WORKFLOW binding in wrangler.jsonc.
export class MyScheduledWorkflow extends WorkflowEntrypoint<Env> {
async run(event: WorkflowEvent, step: WorkflowStep) {
const data = await step.do("fetch source data", async () => {
return await fetchSourceData();
});
// If this step fails, only this step is retried with the custom logic below
await step.do(
"process and store results",
{
retries: { limit: 5, delay: "30 seconds", backoff: "exponential" },
timeout: "10 minutes",
},
async () => {
await processAndStore(data);
},
);
}
}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.