How to migrate Pipedream workflows to n8n
Updated October 13, 2026
n8n cannot read a Pipedream export directly, so a migration means converting each workflow into n8n's own JSON format: export your Pipedream projects, map every trigger, step and expression to an n8n node, rewrite or wrap code steps, recreate credentials, then import and cut over. Plan to finish before Pipedream Workflows stops running on March 31, 2027, because all Workflows data is deleted by April 30, 2027.
The steps below work whether you do the conversion by hand or with a tool. The last section explains which parts Workflow Exit automates.
Before you start
You need three things:
- The workflow definitions. The official project export ZIP, a GitHub Sync repo, or workflow JSON pulled from Pipedream's REST API. See how to export Pipedream workflows.
- An n8n instance. n8n Cloud, or self-hosted n8n 2.x. The choice depends mostly on your code steps (step 3).
- Access to every connected app. Credentials do not transfer, so someone has to log in to Slack, Google, Stripe and the rest to authorize n8n.
Pipedream Workflows has been in maintenance mode since September 30, 2026. Nothing new will ship for Workflows, so there is no reason to wait.
Step 1: Export each Pipedream project
In Pipedream, open the project, select Settings, click Export Workflows, and download project_export-<project_id>.zip from the project's File Store (Pipedream docs). The ZIP contains a manifest.json plus one JSON file per workflow with triggers, steps, code, configured props and branch contents.
Read manifest.json before anything else. Its warnings list names every secret prop that was replaced with <redacted>, and the status field shows workflows that were skipped because they were never deployed or the export hit its 500 workflow or 256 MB limit.
Step 2: Inventory and triage
Sort workflows into three groups before converting anything:
- Straightforward: HTTP or schedule trigger, app actions, small code steps without npm imports.
- Needs rework: code steps that import npm packages, use data stores, call
$.flow.delayor$.flow.suspend, or read connected-account tokens in code. - Manual: email triggers, private event sources, private components whose code is not in the export.
The free migration report does this sort for you. Drop the ZIP on the page and it rates each workflow and lists the npm packages, environment variables, redacted secrets and connected accounts involved. It runs in your browser, and the export is not uploaded.
Step 3: Choose n8n Cloud or self-hosted
This decision is mostly about npm. On n8n Cloud, the Code node can only use two modules, crypto and moment, and Python code cannot import any library, not even the standard library. Self-hosted n8n can allow any installed package through NODE_FUNCTION_ALLOW_EXTERNAL (n8n docs).
If most of your imports are HTTP clients (axios, got, node-fetch) and date libraries, n8n Cloud is fine: n8n has this.helpers.httpRequest and Luxon built in. If you depend on SDKs, parsers or Python libraries, self-hosting saves a lot of rewriting. The details are in Pipedream code steps on n8n Cloud.
Step 4: Map triggers
| Pipedream trigger | n8n node | Notes |
|---|---|---|
| HTTP / Webhook | Webhook | New URL. Set Respond to "Using 'Respond to Webhook' Node" if the workflow calls $.respond. |
| Schedule (every N, or cron) | Schedule Trigger | Uses the workflow timezone, or the instance timezone if none is set. |
| Form | n8n Form Trigger | The form URL changes. Check field names and required flags. |
| Email (unique Pipedream address) | IMAP Email or Gmail Trigger | The address changes. Manual step. |
| App event source (e.g. new row, new issue) | The app's n8n trigger node, if one exists | Otherwise a Schedule Trigger plus an HTTP Request that polls the API. |
| Private custom source | None | Rebuild by hand. Only the component key is exported. |
Step 5: Map steps, branches and expressions
This is the core concept mapping. Most of it is mechanical once you know the equivalents.
| Pipedream concept | n8n equivalent | Notes |
|---|---|---|
steps.trigger.event |
$('trigger').first().json |
For webhooks, the request body is under .body. |
steps.x.$return_value |
Output item of node x |
A converted Code node can keep the value under a $return_value key. |
$.export("name", value) |
A field on the node's output item | Read it with $('x').first().json.name. |
$.respond({ status, headers, body }) |
Respond to Webhook node | The Webhook node must be set to respond through it. |
$.flow.exit() / End Workflow action |
return [] in a Code node, or an If node |
No output items means downstream nodes don't run. |
$.flow.delay(ms) / Delay action |
Wait node, Resume: After Time Interval | For $.flow.delay in code, split the step at the call. |
$.flow.suspend() |
Wait node, Resume: On Webhook Call | Send $execution.resumeUrl where you used Pipedream's resume URL. |
$.flow.trigger(workflowId, payload) |
Execute Sub-workflow node | The called workflow needs an Execute Sub-workflow Trigger. |
| If/Else block | If node (two branches) or Switch node (more) | Pipedream runs the first matching branch. |
| Switch block | Switch node | Keep rule order, it decides which branch runs. |
Data store (data_store prop, $.service.db) |
Workflow static data or Data Tables | Static data is per workflow; Data Tables are shared within a project. |
process.env.NAME |
$vars.NAME or $env.NAME |
$vars needs a plan with Variables; $env is self-hosted only. |
Connected account (this.slack.$auth) |
n8n credential on a node | Code nodes can't read credentials. |
Secret prop (<redacted>) |
Credential or Variable | Values must be re-entered. |
$.send.http / $.send.email |
HTTP Request / Send Email node | |
Registry action (e.g. slack-send-message) |
The matching n8n app node, or HTTP Request | See the app-by-app notes. |
Expressions in configured props follow the same pattern. A Pipedream prop like this:
{{steps.trigger.event.body.email}}
becomes this n8n expression, assuming the Webhook node is named trigger:
{{ $('trigger').first().json.body.email }}
Keep n8n node names identical to the Pipedream step names. It keeps expressions readable and makes $('step_name') references line up one to one.
Step 6: Convert code steps
Each Pipedream Node.js step is an export default defineComponent({ ... }) with a run({ steps, $ }) method. An n8n Code node is a function body that reads earlier nodes with $('name') and must return an array of items, each shaped { json: { ... } }. The n8n Code node docs also note that import statements are not supported, so modules are loaded with require.
A small step:
// Pipedream
export default defineComponent({
async run({ steps, $ }) {
const email = steps.trigger.event.body.email;
$.export("domain", email.split("@")[1]);
return { email };
},
});
// n8n Code node (Run Once for All Items)
const email = $('trigger').first().json.body.email;
return [{ json: { domain: email.split("@")[1], $return_value: { email } } }];
Larger steps need more: HTTP clients replaced with this.helpers.httpRequest, date libraries replaced with Luxon, process.env replaced with Variables, data stores replaced with static data. Before-and-after examples for each are in what breaks in code steps on n8n Cloud.
Step 7: Recreate credentials, secrets and variables
Nothing secret survives the export. For each workflow:
- Create an n8n credential for every connected account and select it on the matching nodes.
- Re-enter redacted secret props, either in a credential or as an n8n Variable. Variables are available on n8n Cloud Pro and Enterprise, and on self-hosted Business and Enterprise.
- Move Pipedream environment variables into Variables, or into
$envon self-hosted n8n. Since n8n 2.0,N8N_BLOCK_ENV_ACCESS_IN_NODEdefaults totrue, so Code nodes cannot read environment variables unless you change that (n8n 2.0 breaking changes).
n8n Code nodes cannot access credentials by design. If a Pipedream code step used this.github.$auth.oauth_access_token, the clean fix is to move that API call into an HTTP Request node that uses an n8n GitHub credential.
Step 8: Import into n8n
n8n gives you several ways in (export and import docs):
- Editor: workflow menu, Import from File, one JSON at a time.
- Server CLI (self-hosted):
n8n import:workflow --input=workflow.json. n8n now recommends its separate n8n CLI and package format for moving workflows between instances, and plans to deprecate the Server CLI import commands at an unscheduled date. - Public REST API:
POST /api/v1/workflowswith anX-N8N-API-KEYheader. The n8n API is available on n8n Cloud Starter, Pro and Enterprise and on all self-hosted editions, but not on the Cloud free trial.
Imported workflows start unpublished. In n8n 2.x you publish a workflow instead of toggling it active.
Step 9: Test, run in parallel, cut over
- Publish one workflow at a time. Use the Webhook node's test URL first, then the production URL.
- Replay saved sample events and compare outputs with what Pipedream produced. Event history is not in the export, so save samples before you need them.
- Update each webhook sender to the new n8n production URL.
- Watch the n8n Executions list for a few days, then disable the Pipedream workflow.
- Note that workflow static data is only saved for published workflows started by a trigger or webhook, not for manual test runs (n8n docs). Counters and dedup keys will look empty while testing in the editor.
What Workflow Exit automates
Workflow Exit is an independent tool, not affiliated with Pipedream, Workday or n8n. It automates steps 2 to 6 and step 8, and turns step 7 into a checklist.
Free report. Upload the export ZIP, a GitHub Sync repo or REST API workflow JSON. The report runs entirely in your browser and gives each workflow a traffic light (converts automatically, needs an AI rewrite or quick check, or needs manual work), with triggers and their n8n equivalents, actions with and without automatic mapping, npm packages and whether n8n Cloud can run them, environment variables, redacted secrets, connected accounts to recreate, data stores and File Store data to save before April 30, 2027, an hours estimate and a recommended destination.
Paid conversion. For each workflow you get importable n8n workflow JSON:
- Webhook, Schedule Trigger or Form Trigger for the trigger.
- If and Switch nodes for if/else and switch blocks, a Wait node for delays, Respond to Webhook for
$.respond. - Code steps converted into n8n Code nodes with a compatibility layer that rebuilds
steps,$.export,$.flow.exit,thisprops, data stores (on workflow static data) and@pipedream/platformaxios (onthis.helpers.httpRequest). The layer was tested by running converted workflows in n8n 2.x. - Prop expressions rewritten, for example
{{steps.trigger.event.body.email}}to{{ $('trigger').first().json.body.email }}. - Optional AI rewrite of code steps that import npm packages n8n Cloud can't load.
- A
CHECKLIST.mdwith credentials to create, n8n Variables for redacted secrets, webhook URLs to change and cutover steps, plus a README and a bulk import script that uses the n8n public API.
What it does not do: it cannot move credentials, data store contents or event history, it cannot keep your webhook URLs, and email triggers and private sources stay manual.
Pricing is one-time: Starter $49 for up to 25 workflows, Team $149 for up to 100, Agency $399 for up to 500, first workflow free. Details on the pricing page. If you are still deciding where to go, read Pipedream vs n8n and the alternatives comparison, or start with the free report and let the numbers decide.
Frequently asked questions
Can n8n import a Pipedream export directly?+
No. As of October 2026 n8n has no importer for Pipedream exports. n8n imports its own workflow JSON (nodes and connections), so each Pipedream workflow has to be converted into that format first, by hand or with a converter.
Do Pipedream code steps run in n8n without changes?+
Not as written. n8n Code nodes don't provide steps, $.export, $.respond or data store props, don't support import statements, and on n8n Cloud can only require crypto and moment. Code needs either a rewrite or a compatibility layer that rebuilds the Pipedream helpers.
Will my webhook URLs stay the same after moving to n8n?+
No. Pipedream HTTP triggers use *.m.pipedream.net URLs or a Pipedream custom domain. n8n Webhook nodes get new URLs on your n8n instance, so every service that sends webhooks must be updated during cutover.
Should I migrate to n8n Cloud or self-hosted n8n?+
n8n Cloud works well if your code steps only use HTTP calls, dates and plain JavaScript. If many steps rely on npm packages, SDKs or Python libraries, self-hosted n8n lets you install and allow those modules with NODE_FUNCTION_ALLOW_EXTERNAL.
How do I move Pipedream connected accounts to n8n?+
You can't transfer them. The export only contains an authProvisionId, and Pipedream deletes tokens by April 30, 2027. Create a matching credential in n8n for each app and select it on the nodes that need it.
How much does an automated Pipedream to n8n conversion cost?+
Workflow Exit's report is free. Conversion is a one-time payment: Starter $49 for up to 25 workflows, Team $149 for up to 100, Agency $399 for up to 500. The first workflow is converted free.