# How to migrate Pipedream workflows to n8n

> Source: https://workflowexit.com/pipedream-to-n8n · Updated 2026-10-13

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](/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](https://pipedream.com/docs/workflows/export-workflows)). 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.delay` or `$.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](/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](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/) 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](https://docs.n8n.io/deploy/host-n8n/configure-n8n/basic-configuration/configuration-examples/enable-modules-in-code-node/)).

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](/pipedream-code-steps-n8n-cloud).

## Step 4: Map triggers

| Pipedream trigger | n8n node | Notes |
|---|---|---|
| HTTP / Webhook | [Webhook](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.webhook/) | New URL. Set Respond to "Using 'Respond to Webhook' Node" if the workflow calls `$.respond`. |
| Schedule (every N, or cron) | [Schedule Trigger](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.scheduletrigger/) | 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](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.respondtowebhook/) 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](/apps). |

Expressions in configured props follow the same pattern. A Pipedream prop like this:

```text
{{steps.trigger.event.body.email}}
```

becomes this n8n expression, assuming the Webhook node is named `trigger`:

```text
{{ $('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](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/common-issues/) also note that `import` statements are not supported, so modules are loaded with `require`.

A small step:

```javascript
// Pipedream
export default defineComponent({
  async run({ steps, $ }) {
    const email = steps.trigger.event.body.email;
    $.export("domain", email.split("@")[1]);
    return { email };
  },
});
```

```javascript
// 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](/pipedream-code-steps-n8n-cloud).

## Step 7: Recreate credentials, secrets and variables

Nothing secret survives the export. For each workflow:

1. Create an n8n credential for every connected account and select it on the matching nodes.
2. Re-enter redacted secret props, either in a credential or as an n8n [Variable](https://docs.n8n.io/build/code-in-n8n/define-custom-variables/). Variables are available on n8n Cloud Pro and Enterprise, and on self-hosted Business and Enterprise.
3. Move Pipedream environment variables into Variables, or into `$env` on self-hosted n8n. Since n8n 2.0, `N8N_BLOCK_ENV_ACCESS_IN_NODE` defaults to `true`, so Code nodes cannot read environment variables unless you change that ([n8n 2.0 breaking changes](https://docs.n8n.io/changelog/v20-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](https://docs.n8n.io/build/manage-workflows/export-and-import/)):

- **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/workflows` with an `X-N8N-API-KEY` header. The [n8n API](https://docs.n8n.io/connect/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

1. Publish one workflow at a time. Use the Webhook node's test URL first, then the production URL.
2. 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.
3. Update each webhook sender to the new n8n production URL.
4. Watch the n8n Executions list for a few days, then disable the Pipedream workflow.
5. Note that workflow static data is only saved for published workflows started by a trigger or webhook, not for manual test runs ([n8n docs](https://docs.n8n.io/build/code-in-n8n/cookbook/built-in-methods-and-variables-examples/getworkflowstaticdata/)). Counters and dedup keys will look empty while testing in the editor.

## Guides for each part of the move

- [Export on the Free or Basic plan](/export-pipedream-workflows-free-plan): GitHub Sync, the REST API and a local CLI when the Export button isn't available.
- [GitHub Sync repositories](/pipedream-github-sync-to-n8n): what `workflow.yaml` contains and how to convert it.
- [If/else, switch and filter blocks](/pipedream-if-else-switch-to-n8n): If, Switch, Merge and Loop Over Items, and how the rules are kept.
- [HTTP triggers and webhooks](/pipedream-http-trigger-to-n8n-webhook): new URLs, authorization and custom responses.
- [Schedules](/pipedream-schedule-to-n8n): cron, intervals and time zones.
- [Python code steps](/pipedream-python-steps-to-n8n): what runs on n8n Cloud and on self-hosted n8n.
- [Node.js code steps on n8n Cloud](/pipedream-code-steps-n8n-cloud) and [data stores and File Store files](/pipedream-data-stores).

## 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](/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`, `this` props, data stores (on workflow static data) and `@pipedream/platform` axios (on `this.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.md` with 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](/pricing). If you are still deciding where to go, read [Pipedream vs n8n](/pipedream-vs-n8n) and the [alternatives comparison](/pipedream-alternatives), or start with the [free report](/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.
