# Schedule a job

Put a run on a cron schedule, and understand what happens when runs collide or the platform restarts.

Every run in a job carries a schedule field. Leave it blank and the run is on-demand: it executes only when someone triggers it. Fill it in and the platform fires it for you.

![The jaffle-orders job page showing its hourly schedule, full load strategy and next run, with Edit, Pause schedule and Add schedule controls.](demos/guides/jobs-schedule-a-job-light.png)
{mode="true" class="guide-image"}

## The format

A standard five-field cron expression, interpreted in the project's time zone (UTC until an owner or admin sets one in the project's settings):

```text
0 * * * *     every hour, on the hour
30 2 * * *    every day at 02:30 project time
0 6 * * 1     every Monday at 06:00 project time
```

Schedules are validated when you save them. An expression the platform cannot parse is rejected at that moment, with an error, rather than being accepted and then never firing. A saved schedule is therefore a schedule that will fire.

## Time zone and daylight saving

Set the project's time zone in its settings, and a schedule follows that zone's daylight saving: a daily 02:30 stays 02:30 local time all year. A time that does not exist on the day the clocks go forward fires at the jump, and a time that occurs twice when they go back fires once. A project left on UTC does not follow any daylight saving.

## When a run is still going

If the previous execution of that run has not finished when the next slot comes due, the slot is skipped rather than queued behind it. Long runs cannot stack up, and a slow day does not turn into a backlog that runs all night.

If you see slots being skipped regularly, the schedule is asking for more than the run can deliver. Lengthen the interval.

## When the platform was not running

Missed slots are not backfilled one by one. If slots came due while the platform was unavailable, the run fires once when the platform is back, and the schedule then continues from the next slot. Recovery never bursts a queue of catch-up runs at your source and your data platform at once.

For a full load this is usually fine, since the next execution reads everything anyway.

## Next

[Run and follow a job](/docs/guides/jobs/run-and-follow-a-job/).
