Skip to content

Changelog

New updates and improvements at Cloudflare.

hero image

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:

JSONC
{
"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.

TypeScript
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.