Module 4: Your First Workflow
Schedule Trigger (Run on a Schedule)
Capsule overview
The Manual Trigger works when there's a human available to press Play. But most useful automations run without humans: the daily report that arrives at 8am without anyone asking for it, the inventory sync that runs every hour to your database, the backup that happens at 3am while everyone sleeps.
For all of that, there's the Schedule Trigger — a node that acts like a clock that presses Play on its own, on a schedule or interval you define. You tell it "run every 5 minutes" or "every Monday at 9am" or "the first day of every month at midnight," and it takes care of it without you touching it again.
In this capsule you'll configure the Schedule Trigger in its two modes (friendly intervals and cron expressions), understand how the timezone works, run your workflow several times automatically, and verify the executions in the history. You'll see your workflow running on its own for the first time — the moment where n8n starts to feel less like a tool and more like a machine.
By the end you'll be able to configure Schedule for 90% of the recurring automation patterns that exist in the real world, without needing to write cron.
What you'll learn
By the end of this capsule you'll be able to:
- ✅ Add a Schedule Trigger to a workflow
- ✅ Configure friendly intervals (every N minutes, hours, days, weeks)
- ✅ Configure specific times (every day at 8am, Mondays at 9am)
- ✅ Read and write basic cron expressions for advanced cases
- ✅ Configure the correct timezone to avoid runs at the wrong time
- ✅ Verify automatic executions in the history
Mental model: the clock that presses Play on its own
Remember the Manual Trigger: you press Play. The Schedule Trigger is the same, but the finger that presses is a clock.
The Schedule Trigger is an alarm clock with a thousand configurable alarms.
You tell it "ring every hour" or "ring on Mondays at 9am" and it rings on its own. When it rings, it presses Play on your workflow. When the run finishes, it goes back to waiting for the next alarm.
This changes your mindset from "I'm going to run the workflow" to "the workflow is going to run, I just decide when".
When to use the Schedule Trigger (professional relevance)
Schedule is the heart of repetitive automation. The most common patterns:
| Pattern | Typical frequency | Concrete example |
|---|---|---|
| Reports | Daily or weekly | Every Monday 8am: send the previous week's sales report |
| Data sync | Every hour or every N minutes | Every 30 min: copy leads from Tally to HubSpot |
| Recurring notifications | Daily | Every day 9am: pending-task list to Slack |
| Backups | Daily or weekly | Every night 3am: back up the database to Google Drive |
| Cleanup | Monthly | Day 1 of each month: delete records older than 90 days |
| Health checks | Every N minutes | Every 15 min: verify that external services are up |
In real work, Schedule + Webhook represent ~80% of production triggers. Schedule covers predictable recurring things; Webhook covers what reacts to events.
Step 1: Change the trigger from Manual to Schedule
You'll use the same workflow [TUTORIAL-M04] My first real workflow. If it has the Manual Trigger from capsule 03, you'll replace it with Schedule.
To replace it:
- Right-click the Manual Trigger on the canvas
- Delete (or the
Delete/Backspacekey) - Click the placeholder or
Add first step - Search:
Schedule - Click
Schedule Trigger
Now you have:
┌─────────────────────────────┐ ┌─────────────────────┐
│ [⏰] Schedule Trigger │ → │ Set │
│ (not configured) │ │ (message, time) │
└─────────────────────────────┘ └─────────────────────┘
If the connection to the Set was cut when you deleted the Manual, reconnect (Schedule's output → Set's input).
Step 2: Configure the interval (friendly mode)
Double-click the Schedule Trigger to open its editor. n8n offers you two modes:
"Trigger Interval" mode (recommended for most cases)
It's the friendly mode: you configure intervals in natural language.
Parameters:
- Trigger Interval: a dropdown with options
Seconds— every N seconds (rare, almost never use it in production)Minutes— every N minutesHours— every N hoursDays— every day at a specific timeWeeks— specific days of the weekMonths— a specific day of the monthCustom (Cron)— for advanced cases (we cover it below)
For this practice, configure:
Trigger Interval: Minutes
Minutes Between Triggers: 1
(1 minute is aggressive for real production, but perfect for this practice because you'll see executions fast.)
Click Back to canvas. Save the workflow.
Step 3: Activate the workflow so Schedule works
Here's the critical difference from the Manual Trigger:
The Schedule Trigger does NOT run automatically just because you saved. It needs the workflow to be ACTIVE.
To activate:
- Top-right corner of the editor → the
Inactive/Activetoggle - Click it to switch to
Active - The indicator changes (typically from gray to green)
This is what capsule 06 covers in depth. For now, retain:
- Workflow Inactive: Schedule doesn't fire. The workflow is saved but "off."
- Workflow Active: Schedule fires according to its configuration. The workflow is "on."
Step 4: Wait and verify automatic executions
With the workflow Active and configured to 1 minute, it will start running on its own.
How to verify:
- Go back to the main Workflows menu (left sidebar)
- Click your workflow
- In the workflow's top menu → the
Executionstab (or "Executions") - You'll see a list of recent executions with a timestamp
Wait 2-3 minutes. Look at the list again. You should see 2-3 new executions, separated by ~1 minute each.
✓ Success — 2026-05-13 10:45:00
✓ Success — 2026-05-13 10:44:00
✓ Success — 2026-05-13 10:43:00
Your workflow is running on its own! 🎉
Click any execution to see the detail: input/output of each node, just like when you run it manually.
Important: deactivate the workflow now (toggle Active → Inactive) so it stops running every minute. If you leave it, it will keep running and flood your history. You'll reactivate it in later capsules when you need it.
More realistic configurations
Every 1 minute was to see results fast. In real production, the typical intervals are:
Every N minutes (fast sync)
Trigger Interval: Minutes
Minutes Between Triggers: 15 // or 30, 60
Good for: data syncs, polling of external APIs, health checks.
Every N hours
Trigger Interval: Hours
Hours Between Triggers: 6 // 4 times a day
Good for: moderate updates, intermediate aggregations.
Daily at a specific time
Trigger Interval: Days
Trigger At Hour: 8
Trigger At Minute: 0
Good for: daily reports, morning notifications, nightly jobs.
Weekly on specific days
Trigger Interval: Weeks
Trigger On Weekdays: Monday, Friday
Trigger At Hour: 9
Trigger At Minute: 0
Good for: weekly reports, end/start-of-week reminders.
Monthly
Trigger Interval: Months
Trigger At Day Of Month: 1
Trigger At Hour: 0
Trigger At Minute: 0
Good for: month-end closings, monthly cleanups, recurring billing.
Advanced mode: Cron expressions
For patterns that don't fit the presets, n8n allows cron expressions. It's a standard syntax used by Unix systems for decades.
Activate:
Trigger Interval: Custom (Cron)
Cron Expression: [write here]
Basic cron syntax
A cron expression has 5 fields separated by spaces:
┌──────────── minute (0-59)
│ ┌────────── hour (0-23)
│ │ ┌──────── day of month (1-31)
│ │ │ ┌────── month (1-12)
│ │ │ │ ┌──── day of week (0-6, 0=Sunday)
│ │ │ │ │
* * * * *
Each field accepts:
*— any value5— a specific value*/5— every 5 units (every 5 minutes, every 5 hours, etc.)1-5— a range (from 1 to 5)1,3,5— a list (1, 3, and 5)
Practical examples
| Cron | Meaning |
|---|---|
0 8 * * * | Every day at 8:00 |
0 */2 * * * | Every 2 hours (on the hour) |
0 9 * * 1-5 | Monday to Friday at 9am |
30 14 * * 1 | Every Monday at 14:30 |
0 0 1 * * | Day 1 of each month at midnight |
*/15 * * * * | Every 15 minutes |
When to use cron vs the friendly interval?
- Use the friendly interval when you can — it's more readable, less error-prone.
- Use cron when the pattern is complex: "Monday at 9am" is friendly; "Monday and Thursday at 9am AND 3pm" requires cron.
Useful tool: crontab.guru translates cron to human language and vice versa. If you have to write a complex cron, validate it there first.
Timezone: the trap that breaks schedules
A Schedule configured for "8am" means nothing without a timezone. If your workflow is in UTC and you're in Mexico City (UTC-6), "8am UTC" is "2am" on your clock.
In n8n, the timezone is configured per workflow:
- Inside the workflow, top menu →
Settings(or the gear icon) - Look for
Timezone - By default: the system timezone or UTC
- Change to the correct timezone (
America/Mexico_City,America/Bogota,Europe/Madrid, etc.)
When it matters:
- Daily reports at a specific time for your team
- Notifications that must arrive during business hours
- Nightly processes (when it's "night" depends on the timezone)
When it doesn't matter as much:
- Short intervals (every 15 min): the timezone is irrelevant because it runs 96 times a day regardless of the offset
- Purely internal processes with no human component
Recommended habit: whenever you configure a Schedule with a human time (8am, 9am, etc.), verify the workflow's timezone first. It's the #1 source of "the report arrived at 2am instead of 8am."
Common traps and mistakes
Mistake 1 (conceptual): "I configured Schedule but it doesn't run"
What happens: You add Schedule, configure every 5 minutes, wait, it doesn't run.
Why it happens: The workflow is Inactive. Schedule only fires when the workflow is Active.
How to detect it: Look at the toggle in the top-right corner. If it says Inactive, that's the problem.
How to fix it:
- Click the toggle to switch to
Active - Wait for the configured interval
- Verify in
Executions
Variant: you ran it with Execute Workflow from the editor (Test mode) and it "worked," but then it doesn't run on its own. That's expected — Test mode ignores Schedule and runs once. For it to run on its own, activate the workflow.
Mistake 2: Badly written cron expression
What happens: You write 8 0 * * * meaning "8am" but you put the fields backwards. n8n interprets it as "minute 8 of hour 0" → runs at 00:08, not at 8:00.
Why it happens: The order of cron fields is counterintuitive (minute before hour).
How to detect it: Look at the first executions in Executions. If the timestamps don't match your intention, there's an error.
How to fix it:
- Paste your cron into crontab.guru
- Read the result in human language
- If it doesn't match what you want, fix it
Mnemonic to remember the order: "Minute, Hour, Day, Month, Weekday" → from smaller to larger unit (except weekday at the end).
Mistake 3: Interval too frequent
What happens: You configure every 1 second or every 5 seconds. The workflow runs so often that:
- You flood the history (thousands of executions per hour)
- If you call external APIs, you hit rate limits
- In n8n Cloud, you burn through your execution quota quickly
Why it happens: For "real time" it seems intuitive to set the lowest possible interval. But no real case needs to run every second.
How to detect it:
- Your history has >100 executions per hour
- The following nodes start failing with rate-limit errors
- Your n8n Cloud plan approaches its execution limit
How to fix it:
- For near-real-time sync: every 1-5 minutes is usually enough
- For "fast but not urgent": every 15-30 minutes
- For "within the day": every 1-4 hours
- For "once a day": configure a daily time
Rule: if in doubt, start with a longer interval and lower it if you need to. Raising the interval later is harder.
Mistake 4 (conceptual): Not accounting for timezone in human schedules
What happens: You configure Trigger At Hour: 8 (Days mode) thinking "8am." The workflow is in UTC. You're in UTC-5. The workflow runs at 8am UTC = 3am your time.
Why it happens: n8n by default uses the system timezone or UTC. If you never configured it, it's wrong.
How to detect it: Schedule executions appear at times that don't match your intention.
How to fix it:
- Workflow Settings → Timezone → your time zone
- Re-verify the configured time
Exercise: Configure 3 different Schedules
Goal: Practice the 3 modes most used in real production.
You'll create 3 simple workflows (with Schedule + a Set node like before) and configure Schedule in each with a different pattern. Don't activate them all at once — just verify the correct configuration.
| # | Required pattern | Recommended mode |
|---|---|---|
| 1 | Every 30 minutes | Trigger Interval = Minutes |
| 2 | Every day at 8:30am in your timezone | Trigger Interval = Days |
| 3 | Every Monday and Thursday at 9am | Custom (Cron) |
For each one, write the exact configuration you'd set.
See configurations
Workflow 1: Every 30 minutes
Trigger Interval: Minutes
Minutes Between Triggers: 30
(It can also be done as cron: */30 * * * *. But the friendly mode is more readable.)
Workflow 2: Every day at 8:30am
Trigger Interval: Days
Trigger At Hour: 8
Trigger At Minute: 30
And critical: verify that the Workflow Settings → Timezone is in your timezone (America/Mexico_City, America/Bogota, etc.). If it's in UTC, 8:30 will be at a different real time.
Workflow 3: Monday and Thursday at 9am
Trigger Interval: Custom (Cron)
Cron Expression: 0 9 * * 1,4
Cron breakdown:
0→ minute 09→ hour 9 (9am)*→ any day of the month*→ any month1,4→ days 1 (Monday) and 4 (Thursday) of the week
(Remember: in cron, the week is 0-6 with 0=Sunday, 1=Monday, ..., 6=Saturday. Some systems also use 7=Sunday.)
Verify with crontab.guru: paste 0 9 * * 1,4 and it should translate to "At 09:00 on Monday and Thursday".
Closing question: what would the cron be for "the first business day of each month at 7am"?
See answer
Short answer: there's no direct cron for "first business day." Cron doesn't understand "business day."
Common strategy:
- Configure
0 7 1-3 * 1-5→ "every minute 0 of hour 7, on days 1, 2, 3 of the month, if they fall on Monday to Friday" - Combine with an IF node that checks whether it already ran this month and, if so, does nothing
It's a case where Schedule alone isn't enough and is complemented with logic (M07).
What you learn from this: Schedule covers 90% of patterns. For the remaining 10% (calendar logic, business days, holidays), you combine Schedule with IF/Switch nodes in M07.
Summary and next step
- The Schedule Trigger is a clock that fires your workflow on a schedule or interval
- It has 2 modes: Trigger Interval (friendly) and Custom Cron (advanced)
- Common patterns: every N minutes, every N hours, daily at a specific time, weekly on specific days, monthly
- Cron has 5 fields: minute, hour, day of month, month, day of week
- Timezone is configured per workflow in Settings — critical for human schedules
- The workflow must be Active for Schedule to fire in production
- Start with long intervals and lower them only if you need to
- crontab.guru translates cron to human and vice versa
Before moving on you should be able to:
- Configure a Schedule with a simple interval (every N minutes/hours)
- Configure a daily Schedule at a specific time
- Read a 5-field cron expression
- Activate a workflow and verify automatic executions in the history
What's next (capsule 05):
You have Manual (you fire it) and Schedule (the clock fires it). You're missing the third fundamental trigger: Webhook — the one that fires when an external service calls you.
Webhook is what connects n8n to the world: forms, apps, integrations, your own backends. Any external event you want to listen to goes through Webhook. And even though it sounds technical, you'll have it running in 10 minutes.
Additional resources
- Schedule Trigger Documentation - Official documentation.
- Cron Expression Guide - Cron ↔ human translator.
- Timezone Configuration - Workflow settings.
- Workflow Activation - How Active vs Inactive works.
Created: May 13, 2026 Version: 1.0