n8n Schedule Trigger and cron expressions
Updated 2026-10-21 · 5 min read
The n8n Schedule Trigger starts a workflow at fixed intervals or on a cron expression. It covers everything from "every 5 minutes" to "9:00 on the first Monday of the quarter". This page is a cron reference for n8n: the syntax n8n accepts, a table of expressions to copy, the timezone rules, and the newer settings for runs missed while the instance was down.
Moving scheduled workflows off Pipedream? The cutover steps (avoiding double runs while both platforms are live) are in Pipedream schedules to n8n.
Intervals or cron
The node's Trigger Interval offers Seconds, Minutes, Hours, Days, Weeks, Months, and Custom (Cron) (docs).
| Interval | Fields |
|---|---|
| Seconds | Seconds Between Triggers |
| Minutes | Minutes Between Triggers |
| Hours | Hours Between Triggers, Trigger at Minute |
| Days | Days Between Triggers, Trigger at Hour, Trigger at Minute |
| Weeks | Weeks Between Triggers, Trigger on Weekdays, Trigger at Hour, Trigger at Minute |
| Months | Months Between Triggers, Trigger at Day of Month, Trigger at Hour, Trigger at Minute |
| Custom (Cron) | Expression |
Use the interval fields when they express what you mean; they are easier to read for the next person. Use cron for ranges and lists ("every hour from 9 to 17", "1st and 15th").
One Schedule Trigger can hold several Trigger Rules, for example 8:00 on weekdays and 10:00 on weekends, in one node.
Cron syntax in n8n
n8n accepts the usual five fields plus an optional leading seconds field:
┌ second (optional)
│ ┌ minute
│ │ ┌ hour
│ │ │ ┌ day of month
│ │ │ │ ┌ month
│ │ │ │ │ ┌ day of week (Sun-Sat)
* * * * * *
So 0 9 * * 1-5 and 0 0 9 * * 1-5 both mean 9:00 on weekdays. If you get "Invalid cron expression", remove the seconds column and validate the rest on crontab.guru, as the common issues page suggests.
Expressions to copy
| Schedule | Expression |
|---|---|
| Every 10 seconds | */10 * * * * * |
| Every 5 minutes | */5 * * * * |
| Every 15 minutes during office hours | */15 9-17 * * 1-5 |
| Every hour on the hour | 0 * * * * |
| Every hour, 9:00 to 17:00 | 0 9-17 * * * |
| Daily at 6:00 | 0 6 * * * |
| Daily at 9:30 on weekdays | 30 9 * * 1-5 |
| Twice a day, 8:00 and 20:00 | 0 8,20 * * * |
| Every Monday at noon | 0 12 * * 1 |
| Every 3 days at midnight | 0 0 */3 * * |
| 1st of every month at midnight | 0 0 1 * * |
| 1st and 15th at 7:00 | 0 7 1,15 * * |
| Quarterly, 1st of Jan/Apr/Jul/Oct | 0 0 1 1,4,7,10 * |
| Sunday 23:59 | 59 23 * * 0 |
Rows for every 10 seconds, every 5 minutes, hourly, 9:00 to 17:00, daily at 6:00, Monday noon, every 3 days, monthly and quarterly come from the n8n docs; the rest are standard cron.
Cron can't express "last day of the month". Schedule daily and add an If node that checks {{ $now.plus({ days: 1 }).day === 1 }}.
Timezones
The trigger uses (docs):
- The workflow timezone, if set in Workflow Settings.
- Otherwise the instance timezone. Self-hosted default:
America/New_York, changed withGENERIC_TIMEZONE. n8n Cloud tries to detect the owner's timezone at sign-up and falls back to GMT.
Most "runs at the wrong time" reports are a self-hosted instance still on New York time. Set it once in your Docker config:
environment:
- GENERIC_TIMEZONE=Europe/Berlin
- TZ=Europe/Berlin
Set the workflow timezone explicitly for anything business-critical. That way, moving the workflow to another instance doesn't shift it.
Note that the Wait node is different: it always uses server time and ignores workflow timezone settings.
Publishing and changes
- The workflow must be published, or the schedule never fires.
- Interval and expression changes apply only after you publish a new version.
- Variables used in the expression are evaluated at publish time. Changing a variable later doesn't change the schedule until you republish.
- The schedule counts from publication. The docs' example: an hourly schedule due at 12:00, changed to every 2 hours and republished at 11:30, runs next at 13:30.
The durable scheduler and missed runs
From n8n 2.45.0 (beta as of October 21, 2026; stable is 2.44.x), Schedule Triggers use the durable scheduler by default, as long as N8N_USE_WORKFLOW_PUBLICATION_SERVICE stays at its default. On earlier versions it is off unless you set N8N_SCHEDULER_ENABLED=true, and the missed-run settings below have no effect without it. N8N_SCHEDULER_TRIGGER_NODE_MODE=legacy keeps the old clock-aligned timing. Two visible effects:
- Seconds and Minutes intervals run at uniform intervals measured from publication, not on clock boundaries. "Every 15 minutes" published at 10:07 runs at 10:22, 10:37 and so on. If you need :00, :15, :30, :45, use cron
*/15 * * * *; cron keeps its clock timing. - Missed runs can be caught up. In the node's Settings tab (nodes added from n8n 2.36):
| If Execution Is Missed | Behavior |
|---|---|
| Don't Run Missed Executions (default) | Skip, resume on schedule |
| Run the Most Recent Missed Execution | One catch-up run at the latest missed time |
| Run the Most Recent Missed Execution Per Rule | One catch-up per trigger rule |
Missed Execution Grace Period (Seconds) sets how late a run may start before it counts as missed; 0 means the instance setting N8N_SCHEDULER_MISFIRE_GRACE (60 seconds by default). For a nightly report, "Run the Most Recent Missed Execution" is usually right: a restart at 02:00 shouldn't mean no report.
Long and overlapping runs
If a run takes longer than the interval, the next one may start while the first is still going. Make scheduled jobs idempotent: mark processed records (for example in a Data table) so an overlap doesn't process them twice. For heavy jobs on self-hosted n8n, queue mode moves executions to workers so the main instance stays responsive.
Add an error workflow to every scheduled workflow. Nobody watches a 3 a.m. job; without an alert, a broken schedule fails silently for days.
From Pipedream schedules
Pipedream's schedule trigger offered "every N minutes/hours/days" and cron expressions tied to any timezone (Pipedream triggers). Two details to carry over: the timezone (Pipedream's was set on the trigger; in n8n set it in Workflow Settings) and the cron string itself, which you can paste as is in most cases.
Our converter creates a Schedule Trigger for every timer-triggered workflow; check the frequency and timezone on each after import. The converter report lists them, and the code step checker covers the code steps. The report and 1 workflow are free. Full export: $3 per workflow, $19 minimum — coming soon.
Not affiliated with Pipedream or n8n.
FAQ
- Does n8n cron use 5 or 6 fields?
- Both work. n8n accepts a sixth, leading field for seconds, which is optional. A standard 5-field expression like 0 9 * * 1-5 runs at 9:00 on weekdays.
- Why does my n8n schedule run at the wrong time?
- The trigger uses the workflow timezone if set, otherwise the instance timezone. Self-hosted instances default to America/New_York; set GENERIC_TIMEZONE or the workflow's Timezone setting.
- Why doesn't my Schedule Trigger run at all?
- The workflow must be published. Changes to the interval also take effect only after you publish a new version.
- What happens to runs missed while n8n was down?
- From n8n 2.36 the node's If Execution Is Missed setting decides: skip them (default), run the most recent one, or run the most recent one per rule. It needs the durable scheduler, on by default from 2.45.0.
- Can I run an n8n workflow every 10 seconds?
- Yes, with the Seconds interval or the cron expression */10 * * * * *. Check your plan's execution limits before scheduling that often on n8n Cloud.
Related
Sources
- https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.scheduletrigger
- https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.scheduletrigger/common-issues
- https://docs.n8n.io/deploy/host-n8n/configure-n8n/durable-scheduler
- https://docs.n8n.io/deploy/host-n8n/configure-n8n/basic-configuration/use-environment-variables/timezone-and-localization
- https://pipedream.com/docs/workflows/building-workflows/triggers