How to move a Pipedream schedule trigger to n8n
Updated October 13, 2026
Use n8n's Schedule Trigger. A Pipedream cron expression goes into a Custom (Cron) rule unchanged, and an "every N minutes, hours or days" schedule becomes the matching interval rule. Two things need care. The first is the time zone: n8n has no per-trigger time zone, so set the workflow's time zone to the one Pipedream used. The second is intervals that n8n can't express in one rule, such as every 90 minutes or every 36 hours. Then publish the workflow, because schedules only fire on published workflows, compare a few runs, and turn off the Pipedream copy so the job doesn't run twice. Pipedream stops running workflows on March 31, 2027.
Pipedream and n8n schedules side by side
| Pipedream Schedule trigger | n8n Schedule Trigger | |
|---|---|---|
| Modes | Every N days, hours or minutes, or a cron expression | Seconds, minutes, hours, days, weeks, months, or Custom (Cron), with several rules per node |
| Time zone | Set on the schedule | One per workflow, or the instance default |
| Cron format | Five fields | Five fields, or six with a leading seconds field |
| Manual run | Run Now | Run the workflow from the editor |
| Run history | Job History in the inspector | The Executions list |
| Event data | timestamp in epoch seconds, timezone_configured, timezone_utc, interval_seconds, cron |
timestamp as an ISO date in the workflow's time zone, plus readable fields such as Day of week, Hour and Timezone |
Interval rules have limits: 1 to 59 seconds, 1 to 59 minutes, 1 to 23 hours and 1 to 31 days.
Cron schedules
- Add a Schedule Trigger and set Trigger Interval to Custom (Cron).
- Paste the Pipedream expression as it is, for example
0 9 * * 1-5for 9:00 on weekdays. - Open Workflow Settings and set the time zone to the one Pipedream used, such as
America/Chicago. - Publish. n8n rejects an invalid expression at this point.
Keep the same named time zone rather than converting the times to UTC. A cron expression in America/Chicago follows daylight saving time. A UTC version runs an hour off for part of the year.
Interval schedules
Pipedream's "Every" option stores an interval in seconds. Most intervals map to one n8n rule:
| Pipedream | n8n rule |
|---|---|
| Every 30 seconds | Seconds, 30 |
| Every 15 minutes | Minutes, 15 |
| Every 2 hours | Hours, 2 |
| Every 7 days | Days, 7 |
Hours rules also have a Trigger at Minute setting, and days rules add Trigger at Hour. Set them to the time you want the runs to land on.
Intervals outside those limits need more than one rule, or a workaround. Workflow Exit handles them this way:
- Whole minutes that divide a day evenly become exact cron rules, one per minute of the hour. Every 90 minutes becomes two rules in the same Schedule Trigger:
0 0,3,6,9,12,15,18,21 * * *
30 1,4,7,10,13,16,19,22 * * *
- Anything else gets the nearest interval n8n can express, plus a note in the migration checklist. Every 36 hours becomes every day, and every 150 seconds becomes every 2 minutes.
If the exact interval matters, run more often and skip the runs that come too early. This Code node, placed right after an hourly Schedule Trigger, lets a run through only when about 36 hours have passed since the last one:
// Run Once for All Items. Static data is saved only on published, triggered runs.
const state = $getWorkflowStaticData('global');
const now = Date.now();
const every = 36 * 60 * 60 * 1000;
const margin = 5 * 60 * 1000; // allow runs that fire a few minutes early
if (state.lastRun && now - state.lastRun < every - margin) {
return []; // too early: nothing after this node runs
}
state.lastRun = now;
return [{ json: { ranAt: new Date(now).toISOString() } }];
For intervals that don't divide an hour or a day evenly, such as every 45 minutes or every 5 hours, compare the first few run times in the Executions list with Pipedream's Job History after you publish.
Time zones
The Schedule Trigger has no time zone of its own. It uses the workflow's time zone from Workflow Settings, or else the instance's. A self-hosted instance defaults to America/New_York. n8n Cloud tries to detect the owner's time zone at sign-up and falls back to GMT.
Two details catch people out:
- Editor import drops the time zone. Importing a workflow file in the n8n editor ignores the file's settings, the time zone included. Importing through n8n's public API keeps them. Workflow Exit writes the time zone into each converted workflow, and its
import-to-n8n.mjsscript imports through the API. If you import files in the editor instead, set the time zone again. - Dates in code. In a Code node,
$nowand Luxon'sDateTime.now()use the workflow's time zone, but plain JavaScript dates andIntluse the server's for local times. Use Luxon for anything that depends on local time.
Workflows with more than one schedule
A Pipedream workflow can have several triggers, including several schedules. An n8n Schedule Trigger can hold several rules, and each rule fires on its own. Two Pipedream schedules in the same time zone can therefore become two rules in one Schedule Trigger, for example 0 9 * * 1-5 for weekday mornings and 0 11 * * 0,6 for weekends. If a later step needs to know which one fired, check the Day of week or Hour field in the trigger's output.
Schedules in different time zones need separate n8n workflows, because the time zone belongs to the workflow. Workflow Exit keeps each Pipedream trigger as its own node, named trigger, trigger_2 and so on, and gives the workflow the first time zone it finds, so split those workflows after converting.
Steps that read the schedule event
Pipedream gave a scheduled run an event with an epoch timestamp and ready-made date strings. n8n's Schedule Trigger outputs an ISO timestamp in the workflow's time zone, plus readable fields. With the trigger node named trigger, the common fields map like this:
| Pipedream | n8n expression |
|---|---|
steps.trigger.event.timezone_configured.iso8601.timestamp |
$('trigger').first().json.timestamp |
steps.trigger.event.timezone_utc.iso8601.timestamp |
DateTime.fromISO($('trigger').first().json.timestamp).toUTC().toISO() |
steps.trigger.event.timezone_configured.iso8601.date |
DateTime.fromISO($('trigger').first().json.timestamp).toISODate() |
steps.trigger.event.timestamp |
Math.floor(DateTime.fromISO($('trigger').first().json.timestamp).toSeconds()) |
steps.trigger.event.timezone_configured.timezone |
DateTime.fromISO($('trigger').first().json.timestamp).zoneName |
Workflow Exit rewrites these expressions, and converted code steps get Pipedream's event shape back through the compatibility layer. Code you write by hand that did new Date(event.timestamp * 1000) needs a change, because n8n's timestamp is a date string, not a number.
Test before you turn off Pipedream
- Run it once by hand from the editor to check every step. Workflow static data isn't saved on manual runs, so counters and cursors look empty here. See saving Pipedream data stores for state that has to carry over.
- Plan for the overlap. If both copies run, every email, row and message goes out twice. Either point the n8n copy at test destinations for a day, or disable the Pipedream workflow right after the n8n one's first good run.
- Publish the n8n workflow. The Schedule Trigger only starts firing now.
- Compare run times. Check the first few runs in the Executions list against Pipedream's Job History.
- Disable the Pipedream workflow well before March 31, 2027.
Missed runs. If your n8n instance is down when a run is due, the default scheduler skips that run. From n8n 2.36, with the durable scheduler, the Schedule Trigger's settings can run the most recent missed execution instead. That matters for daily and weekly jobs.
Where the schedule settings come from
The official export includes schedule settings in full. A GitHub Sync repository keeps only the trigger's ID, so the cron or interval and the time zone have to come from the Pipedream UI. When the schedule isn't in the input, Workflow Exit sets the Schedule Trigger to every hour and adds a checklist item to enter the real one. The GitHub Sync guide lists what else the YAML leaves out.
The free migration report lists every schedule in your export with its cron expression or interval, and flags workflows whose schedule isn't in the input. It runs in your browser. For the rest of the move, see the Pipedream to n8n guide, or compare plans for the automatic conversion.
Frequently asked questions
Can I paste a Pipedream cron expression into n8n?+
Yes. A five-field cron expression works unchanged in the Schedule Trigger's Custom (Cron) interval. Set the workflow's time zone to the one Pipedream used, or the runs shift.
Why does my n8n schedule run at the wrong hour?+
n8n uses the workflow's time zone, or the instance's when none is set. Importing a workflow file in the n8n editor drops the workflow settings, including the time zone, so set it again after the import.
How do I run a workflow every 90 minutes in n8n?+
A single interval rule can't do it, because the minutes interval stops at 59. Add two cron rules to one Schedule Trigger: 0 0,3,6,9,12,15,18,21 * * * and 30 1,4,7,10,13,16,19,22 * * *.
Does the Schedule Trigger fire before I publish the workflow?+
No. Scheduled runs start once the workflow is published. Before that you can only run it by hand from the editor.
Will n8n catch up on runs it missed while it was down?+
Not by default. From n8n 2.36, with the durable scheduler turned on, the Schedule Trigger's settings can run the most recent missed execution.