The Pipedream workflow export format, explained
Updated 2026-10-21 · 5 min read
Pipedream's Export Workflows button produces a ZIP of JSON files, one per workflow, plus a manifest. It is Pipedream's only official JSON export (GitHub Sync serializes workflows to YAML, without a published schema) before Pipedream Workflows shuts down on March 31, 2027, and the input for any migration tool. This page documents what is in the archive, field by field, what Pipedream deliberately leaves out, and how to inspect an export yourself before you trust it.
How to produce the export (project Settings > Export Workflows > download from File Store) is covered in export Pipedream workflows. This page is about reading it.
The archive
From the export docs:
project_export-proj_abc123.zip
├── manifest.json
├── sync-leads-to-sheets-p_abc123.json
└── Marketing/
└── weekly-digest-p_def456.json
- One archive per project; it lands in the project's File Store as
project_export-<project_id>.zip. - The project's folder structure is preserved.
- File names combine the workflow's slug and its hash ID (
p_…). - Each project can hold one export at a time: delete the old ZIP from the File Store to export again.
- Limits: 500 workflows or 256 MB of workflow content per export, whichever comes first.
Exporting writes to File Store, so the workspace plan must include File Stores (Advanced and above per Pipedream's File Store docs).
manifest.json
The manifest lists every workflow in the project, including those that weren't exported:
| Field | Meaning |
|---|---|
schema |
Export format version, e.g. project-export/2026.01 |
workflow_schema |
Workflow file format version, e.g. workflow.json/2026.01 |
project_hashid |
Project ID |
exported_at |
Timestamp |
truncated |
true if a limit was hit |
truncated_reason |
Why, when truncated |
limits |
{ "workflows": 500, "bytes": 268435456 } |
workflows[] |
hashid, name, path, status, warnings[] per workflow |
Statuses
| Status | Meaning | What to do |
|---|---|---|
exported |
File is at path |
Convert it |
skipped_never_deployed |
Never deployed, nothing to export | Usually ignore; rebuild by hand if it mattered |
skipped_export_limit |
Export hit a limit first | Move workflows to another project and export that project |
Warnings
Each workflow's warnings array names every step and prop you must re-enter, for example:
step send_message: secret prop api_key was omitted from the export and must be re-entered after import
This is your credentials checklist, generated by Pipedream. Keep it.
The workflow file
Each file holds the latest deployed version of one workflow. The documented top-level fields:
| Field | Contents |
|---|---|
name, description, inactive, settings |
Metadata and workflow settings |
triggers |
Each trigger's type and configuration |
steps |
Each step in order: name, type, code (code steps) or component key and version (actions), configured props |
deployments |
Steps inside control-flow branches (if/else, switch) |
Trigger types
type |
Pipedream trigger | What's exported |
|---|---|---|
http |
HTTP / webhook | Full settings |
timer |
Schedule | Full settings |
form |
Form | Full settings |
email |
Workflow email address | Configuration |
source |
App event source (e.g. "New row in Google Sheets") | Component and configured props |
Steps
A code step carries its source code, so Node.js, Python, Go and Bash steps come out readable. An action step (a pre-built component like "Slack: Send Message") carries the component key and version, plus the props you set. The step name matters: code in later steps references it as steps.<name>.$return_value (Node.js docs).
deployments: the field that converters miss
Pipedream says deployments holds the steps inside each control-flow branch. A tool that reads only steps can produce a workflow that looks complete but silently skips everything inside the branches. Pipedream documents deployments in prose only, without a schema, so treat any automatic rebuild of branches as something to check by hand.
Redaction rules
| Prop | In the export |
|---|---|
Secret props (including secret: true in code) |
<redacted> |
| App props (connected accounts) | Only the authProvisionId |
| HTTP request props | Configuration kept; the auth object is <redacted> |
| Props without a declaration | <redacted> |
System props ($.service.db, $.interface.http) |
<redacted> |
| All other props | As configured |
Prop names are always kept, so you can see what each step needs even when the value is gone.
Not in the export
- Secret values, connected accounts (credentials and OAuth tokens)
- Environment variables
- Event history, data stores, File Store files
- Code of private multi-file components (only the key)
All Workflows data, including what's not exported, is deleted by April 30, 2027. Back up data stores and files separately: Pipedream data deletion.
Inspect your export with jq
Unzip it and run these from the folder:
# Anything not exported?
jq -r '.workflows[] | select(.status != "exported") | "\(.status)\t\(.name)"' manifest.json
# Was the export truncated?
jq '.truncated, .truncated_reason' manifest.json
# All warnings, one per line
jq -r '.workflows[] | .name as $n | .warnings[]? | "\($n): \(.)"' manifest.json
# Trigger types across all workflows
find . -name '*.json' ! -name manifest.json -exec jq -r '.triggers[]?.type' {} \; | sort | uniq -c
# Workflows with branches
grep -l '"deployments"' -r . --include='*.json' | grep -v manifest.json
Note: the last command finds files where the field exists; check whether it's empty before concluding a workflow has branches.
Pipedream JSON vs n8n JSON
| Pipedream export | n8n workflow | |
|---|---|---|
| Unit | Steps in order | Nodes plus a connection graph |
| Triggers | triggers[] with type |
Trigger nodes |
| Branches | deployments |
If / Switch nodes and connections outputs |
| Data references | steps.name.$return_value |
$('name').first().json |
| Credentials | authProvisionId |
Credential name and ID per node |
| Code | Component with run({ steps, $ }) |
Code node body returning items |
The n8n side is described in n8n workflow JSON structure. n8n can't import the Pipedream file as is; it needs conversion.
Converting the export
Upload the ZIP to our converter: it reads the manifest, every workflow file and the deployments field, maps triggers and steps to n8n nodes, keeps step names as node names so references keep working, and gives you a report of what converts automatically, what needs review (all branches) and what stays manual. Paste a single code step into the code step checker to preview it. The report and 1 workflow are free. Full export: $3 per workflow, $19 minimum — coming soon. Full process: migrate Pipedream to n8n.
Not affiliated with Pipedream or n8n.
FAQ
- What format does Pipedream export workflows in?
- A ZIP per project, named project_export-<project_id>.zip, with one JSON file per workflow in the project's folder structure and a manifest.json at the root.
- What does manifest.json contain?
- The schema versions, project ID, export time, whether the export was truncated, the limits, and an entry for every workflow with its status and warnings.
- Are secrets included in a Pipedream export?
- No. Secret props, HTTP auth objects and undeclared props become <redacted>, connected accounts keep only an authProvisionId, and environment variables aren't exported.
- Can I import a Pipedream export into n8n directly?
- No. n8n expects its own workflow JSON with nodes and connections. The Pipedream file has triggers, steps and deployments, so it has to be converted first.
- Why is a workflow missing from my export?
- Check its status in manifest.json: skipped_never_deployed means it was never deployed, skipped_export_limit means the export hit 500 workflows or 256 MB.