Scheduling n8n Workflows with Cron and Schedules
Master the Schedule Trigger and Cron node in n8n. Timezones, drift, missed runs, and the difference between Schedule and Interval.
Key takeaways
- Set GENERIC_TIMEZONE on the n8n instance — the Schedule Trigger inherits it.
- Use cron expressions for anything more complex than 'every N minutes'.
- On self-hosted, missed runs during downtime do not auto-replay. Add a catch-up step.
- Use Interval only for sub-minute polling; Schedule for everything else.
Most workflows in production are scheduled. The Schedule Trigger looks simple but hides several footguns around timezones, missed runs, and trigger drift. Here is how to use it without surprises.
Schedule Trigger vs Interval vs Cron node
Schedule Trigger is the modern unified node — use it. Interval is legacy and only useful for sub-minute polling. The Cron node is deprecated in favor of Schedule Trigger's cron mode.
Timezones — the silent bug factory
n8n reads timezones in this priority: workflow setting > GENERIC_TIMEZONE env > UTC. Always set GENERIC_TIMEZONE on the instance. For multi-region teams, override per-workflow.
Missed runs
If n8n was down during a scheduled run, that run is lost. For daily report workflows this is fine; for invoicing it is not. Pattern: store last_run_at in Postgres and on each run, replay any missed intervals.
Frequently asked questions
- Can I run a workflow every 30 seconds?
- Use the Interval node. Below that, consider a webhook-driven architecture instead.
- What does the cron expression '0 9 * * 1-5' mean?
- 9:00 AM every weekday (Monday–Friday).