Migrate Pipedream workflows to n8n: step by step
Published · Last updated · Facts checked against Pipedream's and n8n's docs on November 11, 2026

Pipedream Workflows shuts down on March 31, 2027. Export each project as JSON, then rebuild every workflow in n8n: Webhook or Schedule Trigger nodes for triggers, app nodes for actions, the Code node for Node.js and Python steps, and credentials for connected accounts.
Pipedream announced that Pipedream Workflows and String will shut down on March 31, 2027 (Pipedream docs). Workflows is in maintenance mode: no new signups or subscriptions and no new features. All Workflows data is deleted by April 30, 2027. Pipedream Connect is not affected.
n8n has a node or setting for almost every Pipedream building block, but nothing converts one into the other. This guide maps each Pipedream concept to its n8n equivalent, walks through the move, and ends with a small workflow shown both ways, with an n8n file you can import.
Pipedream to n8n: what maps to what
Each name links to that product's own documentation. We checked every link on November 11, 2026.
| What | Pipedream | n8n | Watch out for |
|---|---|---|---|
| Trigger | HTTP / Webhook trigger | Webhook node | n8n gives each Webhook node a test URL and a production URL. The production URL works once you publish the workflow. |
| Trigger | Return HTTP response action or $.respond() | Respond to Webhook node | Set the Webhook node's Respond option to Using 'Respond to Webhook' Node. |
| Trigger | Schedule trigger (Every or Cron Expression) | Schedule Trigger node | Intervals from seconds to months, or a Custom (Cron) rule. The workflow must be published to run. |
| Trigger | App-based triggers (event sources) | The app's trigger node | If the app has no trigger node in n8n, point the app's webhook at a Webhook node. |
| Step | Pre-built actions | App nodes | For an API with no n8n node, use the HTTP Request node. |
| Code | Node.js code step | Code node, JavaScript | Different input and output shape, and different npm package rules. See the gotchas below. |
| Code | Python code step | Code node, Python (native) | Native Python is stable as of n8n 2. On n8n Cloud it cannot import any Python library. |
| Config | Environment variables (process.env) | Custom variables ($vars) | Read-only strings. Only on n8n Cloud Pro and Enterprise, or self-hosted Business and Enterprise. |
| Config | Connected accounts | Credentials | Pipedream never exports tokens, so you connect each account again in n8n. |
| Data | Data stores (key-value) | Data tables and the Data Table node | Tables with rows and columns, 200 MiB per instance by default. A Code node cannot read them directly. |
| Errors | Error notifications and the $errors stream | Error workflow with the Error Trigger node | Pick the error workflow in each workflow's settings. One error workflow can serve many workflows. |
| Errors | Auto-retry (Advanced plan) | Retry On Fail node setting | Pipedream retries up to 8 times over 10 hours. n8n caps Max Tries at 5 and the wait at 5,000 ms. |
| Flow | If/Else and Switch | If and Switch nodes | The Pipedream export lists the steps inside each branch, so you can rebuild the branches one to one. |
Also see the n8n Switch node (for Pipedream's Switch), the Error Trigger node, the Data Table node and the node settings page, which lists Retry On Fail and the On Error options.
Step by step: from Pipedream to n8n before March 31, 2027
1. Export every Pipedream project
- Open the project in the Pipedream dashboard and select Settings.
- Click Export Workflows at the bottom of the settings panel. Pipedream builds the archive in the background.
- Open File Store in the project and download
project_export-<project_id>.zip. Your plan must include File Stores.
Export runs one project at a time, up to 500 workflows or 256 MB per export. Each project can hold one export; to export again, delete the old zip first (export docs).
2. Make a list of what you have to rebuild
The zip holds a manifest.json and one JSON file per workflow with its triggers, steps, code, configured props and control flow branches. In the manifest:
warningsnames every secret prop and connected account you must re-enter.skipped_never_deployedmeans the workflow was never deployed, so there is nothing to export.truncated: truemeans the export hit a limit. Move some workflows to another project and export that one too.
The export does not contain secret values, connected account tokens, environment variables, event history, data store contents, File Store files or the code of private multi-file components. Copy environment variable names, download data store and File Store data, and keep the source of private components before April 30, 2027.
3. Recreate it in n8n
- Create the credentials first, one per Pipedream connected account and per API key you kept in an environment variable.
- Move non-secret config into custom variables if your plan has them. Keys allow letters, numbers and underscores, up to 50 characters, and values up to 1,000 characters.
- Rebuild each workflow node by node with the table above: trigger first, then each step in order, then the If and Switch branches.
- Rewrite each code step for the n8n Code node. Read input from
$inputor$jsoninstead ofsteps, and return items. - Recreate data stores as data tables. A data table tab can import a CSV.
- Create one error workflow that starts with the Error Trigger node, and select it under Settings > Error workflow in each rebuilt workflow.
4. Test with real payloads
In n8n, open the Webhook node, select Listen for test event, and send the same request your app sends to Pipedream to the test URL (n8n workflow development). Copy a few real events from Pipedream's event history before it is gone, and compare the output of each node with the matching Pipedream step. A Schedule Trigger only fires on its own once the workflow is published, so run it by hand while you test.
5. Cut over
- Publish the n8n workflow. n8n registers the production webhook URL when you publish.
- Change every sender (app webhook settings, forms, your own code) from the Pipedream endpoint to the n8n production URL.
- Watch the n8n Executions tab for a few days. Production runs show there, not on the canvas.
- Turn the Pipedream workflow off in its settings once traffic has moved, and keep it as a reference until March 31, 2027.
Example: a new-lead webhook that posts to Slack
A form or app sends each new lead as JSON. The workflow cleans up the fields in a code step and posts one line to a Slack channel. The same three steps, in each tool.
In Pipedream
- Trigger: HTTP / Webhook. The request body arrives as
steps.trigger.event.body. - Node.js code step named
normalize_lead:
export default defineComponent({
async run({ steps, $ }) {
const lead = steps.trigger.event.body ?? {}
const email = String(lead.email ?? '').trim().toLowerCase()
const name = String(lead.name ?? '').trim() || 'Unknown'
const company = String(lead.company ?? '').trim() || 'n/a'
return { email, name, company, slackText: `New lead: ${name} (${email}) from ${company}` }
},
})- A Slack action that sends a message to
#new-leads, with the text set to{{steps.normalize_lead.$return_value.slackText}}and the Slack account connected to the step.
In n8n
- Webhook node, POST, path
new-lead. n8n hands the request on as{ body, headers, params, query }, so the lead is in$json.body. - Code node in JavaScript, Run Once for All Items. Same logic, but it reads
$input.all()and returns a list of items with ajsonkey (n8n data structure). - Slack node, Message > Send, channel
#new-leads, text{{ $json.slackText }}. The file turns off the node's Include Link to Workflow option, so the message holds only the lead.
Download the workflow: pipedream-to-n8n-lead-to-slack.json. In n8n, use Import from File from the editor menu, or copy the JSON below and paste it on the canvas (n8n import docs). It holds no credentials. After import, open the Slack node and pick your Slack credential (Slack credentials).
{
"name": "Pipedream migration example: new lead webhook to Slack",
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "new-lead",
"options": {}
},
"id": "1a028272-e210-42f1-a09a-7efd4f41fec3",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
0,
0
],
"webhookId": "3ef70781-157d-4339-934a-9ddfe20bb49c"
},
{
"parameters": {
"jsCode": "// Pipedream: steps.trigger.event.body. n8n: the Webhook node puts the request body in $json.body.\nreturn $input.all().map((item) => {\n const lead = item.json.body ?? {};\n const email = String(lead.email ?? '').trim().toLowerCase();\n const name = String(lead.name ?? '').trim() || 'Unknown';\n const company = String(lead.company ?? '').trim() || 'n/a';\n return {\n json: {\n email,\n name,\n company,\n slackText: `New lead: ${name} (${email}) from ${company}`,\n },\n };\n});"
},
"id": "201f42c0-7636-4676-b33f-1bf43d1b47fe",
"name": "Normalize lead",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
220,
0
]
},
{
"parameters": {
"select": "channel",
"channelId": {
"__rl": true,
"value": "#new-leads",
"mode": "name"
},
"text": "={{ $json.slackText }}",
"otherOptions": {
"includeLinkToWorkflow": false
}
},
"id": "bfc129ea-168e-45e9-98ba-6d3f94616946",
"name": "Post to Slack",
"type": "n8n-nodes-base.slack",
"typeVersion": 2.3,
"position": [
440,
0
]
}
],
"connections": {
"Webhook": {
"main": [
[
{
"node": "Normalize lead",
"type": "main",
"index": 0
}
]
]
},
"Normalize lead": {
"main": [
[
{
"node": "Post to Slack",
"type": "main",
"index": 0
}
]
]
}
},
"pinData": {},
"settings": {
"executionOrder": "v1"
}
}We imported this file into n8n 2.46.4 with n8n import:workflow on a clean machine, checked each parameter against the node definitions in that release, and ran the Code node logic on a sample lead. Send a test lead with:
curl -X POST "<your test or production URL>" \
-H "Content-Type: application/json" \
-d '{"name":"Ada Lovelace","email":" Ada@Example.com ","company":"Analytical Engines"}'The Slack message reads New lead: Ada Lovelace (ada@example.com) from Analytical Engines.
Gotchas both docs agree on
- npm packages. A Pipedream Node.js step can
importmost npm packages, and Pipedream downloads them each time you deploy (Node.js docs). On n8n Cloud the Code node cannot import external npm modules, onlycryptoandmoment. Self-hosted n8n can allow more withNODE_FUNCTION_ALLOW_EXTERNAL(enable modules). - HTTP calls from code. Pipedream code steps make HTTP requests directly (HTTP requests in Node.js). n8n's Code node docs say you cannot make HTTP requests or access the file system from it, and point you to the HTTP Request and Read/Write File From Disk nodes (Code node). Split those steps into a Code node plus an HTTP Request node.
- Python. Pipedream runs Python 3.12 and installs PyPI packages you import (Python docs). n8n's native Python on n8n Cloud cannot import any library, supports only
_itemsand_item, and needs bracket access such asitem["json"]. - Go and Bash. Pipedream code steps also run Go and Bash (code steps). The n8n Code node runs JavaScript or Python, so rewrite those steps in one of the two.
- Auth in code. In Pipedream a code step reads a connected account's token from
this.slack.$auth(connecting apps). In n8n, the credential goes on an app node or the HTTP Request node, since the Code node cannot make HTTP calls. - Variables. Pipedream environment variable values can be up to 64 KB, scoped to the workspace or to one project (environment variables). n8n custom variables hold up to 1,000 characters, are read-only strings, and need a Pro or Enterprise Cloud plan or a Business or Enterprise self-hosted license.
- Retries. Pipedream auto-retry reruns a failed step up to 8 times over 10 hours with exponential backoff, on the Advanced plan. n8n's Retry On Fail allows at most 5 tries with at most 5 seconds between them (n8n rate limits).
- Secrets in exports. Pipedream replaces secrets with
<redacted>. n8n workflow exports include credential names and IDs, and HTTP Request nodes imported from cURL can hold auth headers, so clean a file before you share it.
Start from a template
These AY N8N templates cover the same patterns, so you can start from a working workflow:
- Slack messages from a webhook
- Webhook to Google Sheets
- JavaScript data processing in the Code node
- Error handling with Slack alerts
- Attach a default error workflow to all active workflows
If you would rather hand the rebuild to a team, AY Automate builds and migrates n8n workflows.
FAQ
When does Pipedream Workflows shut down?
Pipedream Workflows and String shut down on March 31, 2027. Pipedream no longer accepts signups or subscriptions for Workflows and will not ship new features. It deletes all Workflows data by April 30, 2027.
Is Pipedream Connect shutting down too?
No. Pipedream says Connect is not affected by the Workflows shutdown.
Can I import a Pipedream export straight into n8n?
No. Pipedream exports one JSON file per workflow with its triggers, steps, code and configured props, and describes it as a reference for rebuilding on another platform. n8n imports its own workflow JSON format, so you rebuild each workflow in n8n and use the export as the spec.
What does the Pipedream export leave out?
Secret prop values, connected account credentials and tokens, environment variables, event history, data store and File Store contents, and the code of private multi-file components. The warnings list in manifest.json names each step and prop you must re-enter.
Do my Node.js and Python code steps run in n8n as they are?
No. Both move into the n8n Code node, but you rewrite how the code reads input and returns output. On n8n Cloud the JavaScript Code node can only use the crypto and moment modules, and Python cannot import any library. Self-hosted n8n can allow more modules.
What replaces Pipedream data stores in n8n?
Data tables. You read and write them with the Data Table node, the /datatables API endpoint or the Data tables tab. By default all data tables in an instance share 200 MiB, and a Code node cannot read them directly.
How do retries compare?
Pipedream auto-retry, on the Advanced plan, reruns the failed step up to 8 times over 10 hours with exponential backoff. In n8n you turn on Retry On Fail per node. Max Tries is limited to 5 and Wait Between Tries to 5,000 ms.
Sources: Pipedream Workflows shutdown notice, Pipedream export docs, Pipedream triggers, Pipedream error handling, n8n Code node, n8n Webhook node, n8n Slack node and n8n error handling, all checked November 11, 2026.
