Import from n8n, Zapier or Make (Preview)
Preview
Move a workflow you already have.

Move a workflow you already have. Paste its export at /import, or give it to your coding agent
(MCP tool import_workflow). Qaldy reads it, tells you step by step what maps and what does not,
and leaves the result switched off until its owner has reviewed it.
This is a Preview: it maps the common steps and says so for the rest. It never fakes a translation.
What happens#
- Read.
POST /v1/workspaces/:ws/imports/analyzereads the text and returns a report. Nothing is stored. A pasted file is treated as hostile data: only own properties are read, size and depth are bounded, and nothing in it is ever evaluated. - Create, switched off.
POST /v1/workspaces/:ws/importskeeps the plan (the steps as data) and the report, never the file (only its SHA-256, so the same file twice is the same import). It makes a draft app and, when a gate for it exists, a paused road. The same file from the same person is one import. - Review and enable. The owner reads the permission sentences, chooses the HTTP API connection
for each host, skips the steps that could not be translated, and enables it
(
POST /v1/imports/:id/enable). An admin enables anything that spends a connector's sealed key (the same rule as a build). A token can analyze and create; it can never enable or discard.
What the report says#
Every step of the file, in running order, with one verdict:
| Verdict | Meaning |
|---|---|
| Maps 1:1 | Does the same here. |
| Maps with differences | Maps; the note says what differs (a Slack webhook posts to one channel, a sheet row is added by column position). |
| Needs a connection | Maps, but needs an HTTP API connection or a connector first. |
| Can't import | Not translated. The plan keeps a marker that stops the run until the owner skips it. |
| Left out | A note, or a step that was turned off. |
It also lists the connections to add (host, methods, key style, matching presets and connections the workspace already has), the connectors to connect, the permission sentences of the result, and warnings.
What maps today#
| n8n | Zapier | Make | |
|---|---|---|---|
| Starts | Schedule (all intervals and cron), Cron, Webhook, Manual | Schedule, Webhooks (catch hook) | Scenario schedule, Custom webhook |
| Steps | HTTP Request, Edit Fields (Set), If, Filter, Telegram (send), Slack (post), Send Email, Gmail (send), Google Sheets (append), Stop and Error | Webhooks (GET/POST/PUT/custom), Slack, Telegram, Gmail, Google Sheets (row), Email | HTTP request, Set variables, Telegram, Slack, Gmail, Google Sheets (row), filters between modules |
| Not imported | Code, loops, merges, switches, parallel paths, waits, AI nodes, service nodes without a step (the report says to rebuild them as HTTP requests) | Formatter, Code, Paths, Delay, Loops, Storage, AI | Routers, iterators, aggregators, tools, data stores, AI |
Starting from a Telegram message or a hosted form is Planned: such an import starts by hand (Run now) until those triggers ship. Gmail and Google Sheets steps map. Google Sheets connects through a service account (Preview); Gmail waits for the platform's Google sign-in app, so an import with a Gmail step stays blocked until Gmail can be connected.
Zapier does not document its export. The reader follows the JSON it is known to produce (a zaps
list whose nodes carry selected_api, action, params) and a plain steps list; a file that
is neither says what it could not read.
Expressions translate only in their plain forms (a field, a field of a field, a list index). A calculation, a function or a variable of the other tool does not: that step is reported as not translated rather than guessed.
What it will not carry over#
- Keys. A key pasted into a header, a URL, a field or code is located (the step and the field) and never copied into the plan, the report, a log line or an audit row. A key in the URL's query makes that step "not imported": Qaldy no longer sends keys there. A key written into a step's own text (a message, a Set field, a condition) makes that step "not imported" too, and key-shaped text in a workflow or step name is masked. Rotate any key that was in a file you shared.
- Hosts an expression picks, plain
http, IP addresses, odd ports. The gate connects to named HTTPS hosts an admin connected. - n8n's per-item behaviour. n8n and Make run later steps once per item in a reply; Qaldy runs once per run. A list in a reply stays one value.
- Webhook headers and query. Only the request body reaches the steps.
How it runs#
An enabled import is a normal app whose code is one fixed, reviewed runner
(packages/templates/runner). The plan is data the runner reads, so a pasted file can never become
code. The manifest is exactly what the running steps use: the typed connectors, the chosen HTTP API
connections, no tables, no extra domains, no AI. The version's Trust Score is scored by
import-runner.v0 (85 when every check that can run passes; the builder's static checks and smoke
tests did not run, and the report says so).