How the converter works
Updated October 13, 2026
Workflow Exit turns a Pipedream export into n8n workflow files you can import. The conversion runs as a pipeline with six stages:
- Read the input.
- Normalize it into one internal model.
- Analyze every trigger and step.
- Emit n8n nodes and connections.
- Wrap code steps in a compatibility layer, and rewrite with AI only where needed.
- Validate the result.
The free report uses stages 1 to 3, and they run in your browser. Conversion uses all six.
1. Input formats
The converter reads three kinds of input:
- The official project export. This is the
project_export-<project_id>.zipfile that Pipedream writes to your project's File Store. It contains amanifest.jsonand one JSON file per workflow, with triggers, steps, code, configured props and control flow branches. Pipedream's export needs a plan that includes File Stores. See how to export Pipedream workflows. - A GitHub Sync repository. If you synced a project to GitHub, upload the repository as a ZIP. It has a
workflow.yamlper workflow and the code of each step. Trigger settings are not in it. The converter infers the trigger type from how your steps use the event, and flags it for you to check. - Workflow JSON files, for example ones you fetched yourself from the Pipedream REST API. We never ask for your Pipedream API key in the web app.
Pipedream redacts secrets in every format. Secret props become <redacted>. Connected accounts become an account ID, with no token.
2. One internal model
Each format is parsed into the same internal model: a project with workflows, and each workflow with its triggers and steps. A step is one of three kinds:
- code, with its language and source;
- action, with its registry key and version, for example
slack-send-message; - control flow: if/else, switch, filter, delay or end, with the steps inside each branch.
Every prop keeps its state. It can be a plain value, a redacted secret, a connected account, or a value picked from a dropdown. The later stages work only on this model, so supporting a new input format means writing one parser, not a new converter.
3. Analysis
The analyzer rates every trigger and step:
- Green: converts automatically.
- Yellow: converts with AI help, or needs a short manual review.
- Red: needs manual work.
A workflow gets the rating of its worst step.
For code steps, the analyzer parses the source and records what it uses. That includes npm imports (grouped into packages n8n has a built-in replacement for, API SDKs, and packages that need self-hosting), Pipedream helpers such as $.respond, $.flow.delay and $.send, data stores, the File Store, environment variables and /tmp.
It also collects the accounts to reconnect, the secrets to re-enter, and an estimate of the hours needed by hand compared with the converter. This is the free report.
4. Emitting n8n workflows
The emitter builds the n8n workflow JSON from the model:
- Triggers. HTTP becomes a Webhook node, plus a Respond to Webhook node when your code calls
$.respond. Schedules become a Schedule Trigger with the same cron or interval. Forms become a Form Trigger. Registry sources with a known mapping become the matching n8n trigger node. - Actions. Actions in the mapping table become native n8n nodes with their parameters filled in. Pipedream HTTP request actions become HTTP Request nodes.
- Control flow. If/else, switch and filter blocks become If, Switch and Filter nodes, with the rules converted. A delay becomes a Wait node.
- Expressions. References such as
{{steps.get_user.$return_value.email}}become n8n expressions like{{ $('get_user').first().json.$return_value.email }}. Node names match your Pipedream step names, so references stay readable.
Steps the emitter cannot map get a placeholder node with a TODO note and your original props, so nothing disappears silently.
5. Compatibility layer and AI rewrite
Compatibility layer
Node.js code steps are not rewritten by default. Your original component is kept as it is. A compatibility layer is added above it, rebuilding what Pipedream provided on top of n8n's Code node:
stepsreads the output of earlier nodes;thisholds the step's props, with redacted secrets read from n8n Variables;$.exportandreturnbecome the node's output;$.flow.exitstops the branch;axios,fetchand@pipedream/platformcalls go through n8n's built-in HTTP helper;process.envreads n8n Variables;- data stores are kept in n8n workflow static data.
This keeps your logic exactly as you wrote it, and it needs no AI.
AI rewrite
Some steps cannot run on your n8n target even with the layer. Examples include code that imports a package n8n Cloud cannot load, Python steps, and code that uses $.flow.delay, $.flow.suspend or $.send.email. Actions with no mapping are another case. For these, the converter builds an HTTP Request node from the action's public source code.
Only the affected steps are sent to Anthropic's Claude API. The prompt includes your target (n8n Cloud or self-hosted) and the shape of the data from earlier steps. Rewritten steps are marked in the output.
6. Validation
Before you download anything, every converted workflow is checked:
- Code node JavaScript is parsed the way n8n runs it, inside an async function.
- Imports are checked against your target. On n8n Cloud, anything other than
cryptoandmomentis reported. - The workflow structure is checked: unique node names and IDs, connections that point to real nodes, valid node types, and a trigger node.
Node type versions are pinned to the versions the converter is tested against. The test suite imports converted workflows into a real n8n instance and runs them.
What is converted automatically and what is flagged
| Pipedream | n8n | Status |
|---|---|---|
| HTTP trigger | Webhook (+ Respond to Webhook) | Automatic. The URL changes. |
| Schedule trigger (cron or interval) | Schedule Trigger | Automatic |
| Form trigger | Form Trigger | Review: recreate the form fields |
| Email trigger | Email Trigger (IMAP) or Gmail Trigger | Review: the @pipedream.net address goes away |
| Registry source with a mapping | Matching n8n trigger node | Automatic |
| Registry source without a mapping | App trigger, or Schedule + HTTP Request polling | Review |
| Action in the mapping table | Native n8n node | Automatic |
| Action without a mapping | HTTP Request built from the component source | AI, then review |
| If/else, switch, filter | If, Switch, Filter | Automatic. Review if a rule can't be read. |
| Delay | Wait | Automatic |
| Node.js code without npm packages | Code node with compatibility layer | Automatic |
Node.js code using axios, fetch or @pipedream/platform |
Code node using n8n's HTTP helper | Automatic |
| Node.js code using other npm packages | AI rewrite (n8n Cloud) or allowed modules (self-hosted) | AI or manual |
| Python code | Code node, via AI rewrite | AI, then review |
$.flow.delay, $.flow.suspend |
Wait node | Flagged: split the step around a Wait node |
$.flow.trigger |
Execute Workflow | AI, then review |
| Data store | Workflow static data, or an n8n Data Table | Review: save your records |
| File Store | No equivalent | Manual: download your files |
Bash or Go code, $.flow.rerun |
No equivalent | Manual |
| Private sources and actions | No code in the export | Manual |
| Secrets, connected accounts, environment variables | n8n credentials and Variables | Manual, listed in the checklist |
What you download
The conversion produces a ZIP with:
- an
n8n/folder with one importable workflow file per Pipedream workflow, keeping your project folders; CHECKLIST.mdwith the credentials, variables, webhook URLs and cutover steps for each workflow;REPORT.md, the migration report;import-to-n8n.mjs, a script that imports every workflow through the n8n public API.
Workflows arrive in n8n unpublished. Work through the checklist, test each workflow, and then publish it. The Pipedream to n8n guide walks through the cutover.
Frequently asked questions
Is my export uploaded when I create the free report?+
No. The free report is parsed and analyzed entirely in your browser. Workflow definitions are sent to our server only when you convert, and they are processed in memory and not stored after the response is returned.
Is AI used for every step?+
No. Triggers, mapped actions, branches, expressions and most Node.js code steps are converted by fixed rules. AI is used only for steps the rules cannot handle on your n8n target, such as code that imports npm packages n8n Cloud cannot load, Python steps, or actions with no n8n mapping.
Does the converter move my credentials?+
No. Pipedream exports never contain secret values or OAuth tokens. You create the credentials in n8n. The cutover checklist lists every account, secret and variable each workflow needs.
Will my webhook URLs stay the same?+
No. n8n gives each Webhook node its own URL. After you publish a converted workflow, update every service that called the old Pipedream URL.
Should I pick n8n Cloud or self-hosted n8n?+
If your code steps use few npm packages, n8n Cloud is the simplest choice. If they depend on many packages, self-hosted n8n can load them through NODE_FUNCTION_ALLOW_EXTERNAL. The free report recommends a target based on the packages it finds.
Can it convert private components?+
No. The Pipedream export contains the key of a private component but not its code, so these steps are marked red and must be rebuilt.