# Goodbye, cron-only Worker! Schedule Workflows straight from the binding

Hey there, it's Shiichan! Today I found a nice little update that removes the tedious "spin up a whole Worker just to run something on a schedule" chore, so let me walk you through it.

## What was announced?

From Cloudflare's Changelog, it's a new way to use [Workflows](https://developers.cloudflare.com/workflows/). Until now, if you wanted a Workflow to run on an interval, you had to set up a separate [Workers](https://developers.cloudflare.com/workers/) scheduled handler (a cron trigger) and kick off the Workflow from there.

Now you can write cron schedules **directly** on the Workflow binding in `wrangler.jsonc`. When the time comes, a new Workflow instance is created and runs automatically.

## The story so far

Even if all you wanted was a periodic run, you needed:

- a dedicated scheduling Worker, and
- glue code inside its scheduled handler to invoke the Workflow.

That "bridge" part was extra plumbing for what was really just "run this every hour."

## What changes

Now you just add `schedules` to the binding. And you can list multiple cron patterns on the same Workflow. In the example I saw, one binding had these three:

- `0 * * * *` ... every hour, on the hour
- `*/15 * * * *` ... every 15 minutes
- `0 9 * * MON-FRI` ... 9am on weekdays

So periodic jobs like database backups, invoice generation, report aggregation, and cleanup tasks can run while keeping everything Workflows is good at: built-in retries, durable multi-step execution, and configurable timeouts.

## Dive Deep

The setup in `wrangler.jsonc` is just this:

```json
{
  "workflows": [
    {
      "name": "my-scheduled-workflow",
      "binding": "MY_WORKFLOW",
      "class_name": "MyScheduledWorkflow",
      "schedules": ["0 * * * *", "*/15 * * * *", "0 9 * * MON-FRI"]
    }
  ]
}
```

Then you write a class extending `WorkflowEntrypoint` with a `run()` method, and it gets called automatically on each schedule. Inside, you use `step.do()` to configure per-step `retries` (limit, delay, backoff) and `timeout`. If a step fails, only that step is retried per your config, so it stays robust.

For the full details on triggering, check the [Trigger Workflows](https://developers.cloudflare.com/workflows/build/trigger-workflows/) developer guide.

## Wrap-up

- You can put cron schedules **directly** on a Workflow binding via `schedules`
- No more separate scheduling Worker (scheduled handler)
- One Workflow can carry multiple cron patterns
- Each schedule automatically spins up a new Workflow instance

If you build periodic batch jobs on Cloudflare, or want to, this one lands nicely. Looks like you can try it Monday with just a small edit to `wrangler.jsonc`!
