Skip to content
MoveWorkflows

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):

  1. The workflow timezone, if set in Workflow Settings.
  2. Otherwise the instance timezone. Self-hosted default: America/New_York, changed with GENERIC_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