
n8n 3.0 Migration Report: What It Misses
The n8n 3.0 Migration Report is a static scan, and what it catches depends on which 2.x version runs it. I planted 12 known breaks, scanned them on n8n 2.45.7 and 2.46.3, then booted the same database on n8n 3.0.1 and fired every workflow. The current stable release missed three node breaks that the beta caught. Neither version listed two more workflows that failed on 3.0. So run the report from the newest 2.x, then test the rest yourself.
What Is the n8n Migration Report?
It's the page n8n built for this upgrade: Settings > Migration Report, on every instance from 2.39 up. n8n shipped the 3.0 beta on October 27 with stable promised for early December, and the announcement calls the report "the part I'd read if I read nothing else."
The report scans every workflow and your instance settings against the v3.0 breaking changes. Each finding gets an impact badge: Upgrade blocked, Executions will fail, Executions might fail, Behavior changes, or Capability removed. A progress bar counts how many workflows are "compatible." You can export a CSV, assign owners, mark things won't-fix, and for a few rules click Migrate.
I went through the breaking changes when the list first leaked in my n8n 3.0 breaking changes post. This time I wanted to know something narrower: if the report says a workflow is fine, is it?
Does the Migration Report Catch Everything?
No. I built 12 small workflows, each one aimed at a single breaking change, plus a control. I had to seed them on n8n 2.38.3, because 2.45.7 refuses to import a workflow that contains a Function node at all. That's how a real old instance looks anyway: old workflows, upgraded in place. Then I ran the report on 2.45.7 (the stable tag today) and on a copy with 2.46.3 (the beta tag, released October 30). Last, I booted 3.0.1 on the 2.45.7 database and called every webhook.
| Planted break | Report on 2.45.7 | Report on 2.46.3 | What 3.0.1 did |
|---|---|---|---|
| Function node (legacy) | Will fail | Will fail | 400: Unrecognized node type: n8n-nodes-base.function |
| LangChain Code node | Not listed | Will fail | 400: Unrecognized node type: @n8n/n8n-nodes-langchain.code |
| Edit Image node v1 | Not listed | Will fail | "Edit Image versions 1 and 1.1 are no longer supported" |
| Slack Trigger, credential with no signing secret | Not listed | Will fail | 401 on every request, then not registered after a restart |
| $getPairedItem() in a Set node | Will fail | Will fail | "$getPairedItem was removed" |
| Execute Sub-workflow, URL source | Will fail | Will fail | "The URL source was removed" |
| Cron trigger, published | Will fail | Will fail | Never activated |
| If node + Always Output Data | Behavior changes | Behavior changes | True branch stopped running on an empty item |
| Gmail Trigger v1.3 | Behavior changes | Behavior changes | Not run (needs OAuth) |
| Code node that runs 70 s | Instance warning only | Instance warning only | "Task execution timed out after 60 seconds" |
| HTTP Request to 100.100.100.100 | Instance warning only | Instance warning only | SsrfBlockedIpError |
| Plain Webhook + Set (control) | Compatible | Compatible | 200 |
The 2.45.7 report marked 6 of my 12 workflows as affected. The progress bar would have told me half my instance was ready. Five of those six "ready" workflows broke on 3.0.1. Only the control survived.
Every miss falls in one of two buckets: rules your 2.x version doesn't have yet, and things a scan of workflow JSON can't know.
Which n8n Version Should Run the Report?
The rules ship inside the n8n release, not from a server. 2.45.7 ships the same v3 rule files as 2.44.6. 2.46.3 adds three: langchain-code-removed-v3, edit-image-version-v3 and slack-trigger-signature-secret-v3. Those are exactly the three node breaks the stable report missed.
n8n's blog says to update to the latest 2.x first. Fair, but on October 31 the latest 2.x is a beta, and I wouldn't put a beta on a client's production box to get a better report. You don't have to. Run the newer image against a copy of your data.That's what I did:
# copy the data volume, keep the same encryption key
cp -R ./n8n-data ./n8n-data-v3check
# run the newest 2.x against the copy and open Settings > Migration Report
docker run --rm -p 5679:5678 \
-v "$PWD/n8n-data-v3check:/home/node/.n8n" \
-e N8N_ENCRYPTION_KEY="$N8N_ENCRYPTION_KEY" \
n8nio/n8n:2.46.3One more difference: 2.46.3 relabels the timeout and SSRF findings from "Executions will fail" to "Executions might fail." More accurate, but less likely to get read.
What Can't the Report See?
How long your Code nodes run
3.0 cuts N8N_RUNNERS_TASK_TIMEOUTfrom 300 seconds to 60. The rule only checks whether the variable is set. If it isn't, you get one instance-level note, and no workflow is listed. My 70-second Code node finished in 70.0 s on 2.45.7. On 3.0.1 it died at 60.1 s with Task execution timed out after 60 seconds. Don't confuse that with "Task request timed out," a different 60-second error I covered in this post on the runner broker.
Where your HTTP calls go
With SSRF protection on, 3.0 adds 100.64.0.0/10to the default block list. That's carrier-grade NAT space, and it's also where every Tailscale address lives. My HTTP Request to 100.100.100.100 got back Tailscale's web page on 2.45.7. On 3.0.1 it got SsrfBlockedIpError. None of my own workflows hard-code a 100.x address, but plenty of self-hosters reach a NAS or a GPU box over Tailscale. The rule doesn't look at URLs, so expressions and credentials pointing at those hosts never show up as workflows.
Whether a Slack credential has its secret
On 2.45.7 the report says nothing. Then I found the scarier part. With an empty signing secret, the 2.45.7 Slack Trigger skips verification. Any request with a fresh timestamp header and a garbage signature got through. It echoed the URL challenge and ran the workflow:
curl -X POST "http://localhost:5679/webhook/<webhookId>/webhook" \
-H "Content-Type: application/json" \
-H "x-slack-request-timestamp: $(date +%s)" \
-H "x-slack-signature: v0=deadbeef" \
-d '{"type":"url_verification","challenge":"abc123"}'
# n8n 2.45.7, no signing secret: 200 {"challenge":"abc123"}
# n8n 3.0.1, first boot: 401 Unauthorized
# n8n 3.0.1, after a restart: 404 webhook is not registeredOn 3.0.1, the first boot after the upgrade registered the webhook and rejected everything with 401. After one restart it wasn't registered at all. The startup log was silent, and the editor still showed the workflow as published. The only place the reason showed up was /rest/active-workflows/error/<id>: "The Slack API credential has no signature secret." Add the secret now, even if you're not upgrading.On 2.x it's an open door.
What Did It Find on a Real Instance?
I pulled the 186 workflows from my own n8n through the API, imported them into a throwaway container and ran the real report. No credentials, nothing touching production. 20 of 186 workflows came back flagged, the same on 2.45.7 and 2.46.3 because I don't use any of the three newly detected nodes:
| Rule | Impact | Workflows |
|---|---|---|
| AI Agent node on an old version | Behavior changes | 10 |
| Gmail Trigger below v1.4 | Behavior changes | 5 |
| Always Output Data on a multi-output node | Behavior changes | 3 |
| AI Agent v1 mode removed | Will fail | 1 |
| Cron node removed | Will fail | 1 |
| Legacy HTTP Request Tool removed | Will fail | 1 |
| Legacy OpenAI node removed | Will fail | 1 |
| SerpApi tool removed | Will fail | 1 |
Manageable. The list of what it didn't count was more interesting. 108 of those workflows have Code nodes, 23 of them published, and the report can't tell me which run past a minute. 17 workflows use seven community packages. The report raises unverified packages as one instance warning, without saying which. So I checked each package against n8n's vetted list at api.n8n.io/api/community-nodes, the same endpoint 3.0 uses. Five of seven are on it, including my own Hyros node. A Fireflies preview package and n8n-nodes-puppeteeraren't. Vetting is also per version, so check the version you have installed, not just the name.
Does the Migrate Button Fix It for You?
Sometimes. I called the same endpoint the button uses on four findings. The Cron node came back rewritten as a Schedule Trigger, saved as a new version with republishable: true. Function, $getPairedItem and the Execute Sub-workflow URL source all answered No automated migration is available. Budget hand edits for those.
One trap while you edit: since 2.43.3, n8n blocks workflows that contain a deprecated node. On 2.45.7, importingone failed with "this node type is deprecated," while saving an existing one still worked in my test. But if your rollback plan is "re-import last month's JSON export," that import will fail on a current 2.x. Keep a database backup, not just workflow files. I use Git-based version control for n8n for history, but it's not a restore plan here.
My n8n 3.0 Upgrade Checklist
- Copy the database and keep the encryption key. Every step below runs on copies.
- Run the report from the newest 2.x image against the copy and export the CSV.
- Fix "Executions will fail" first. Use Migrate where it exists and edit the rest by hand.
- Set the variables the scan can't decide for you, if they apply:
# keep the 2.x Code node timeout (only if you need it)
N8N_RUNNERS_TASK_TIMEOUT=300
# SSRF protection on, but your Tailscale / CGNAT hosts still reachable
N8N_SSRF_ALLOWED_IP_RANGES=100.64.0.0/10
# keep loading community packages that aren't on n8n's vetted list
N8N_UNVERIFIED_PACKAGES_ENABLED=true- Add the signing secret to every Slack API credential.
- Boot 3.0 on a second copy, restart it once, and fire every production trigger. Then check
/rest/active-workflows. A workflow can look published and still not be listed there. - Only then upgrade production, and remember 3.0 is Docker-only. If you're still weighing hosting, here's my take on n8n Cloud vs self-hosted.
Step 6 is the one people skip, and it's the only step that caught every break in my test.
Frequently Asked Questions
Where is the n8n migration report?
Settings > Migration Report on any n8n instance on 2.39 or later. Owners and admins see every workflow plus the Instance issues tab. Other users only see workflows they can edit. There's an Export CSV button and a Refresh button that runs a full scan.
If the n8n migration report is empty, is it safe to upgrade to 3.0?
No. n8n's own docs say to review the breaking changes for things the tool can't detect. In my test, a 70-second Code node and an HTTP call to a Tailscale IP counted as compatible workflows, and both failed on n8n 3.0.1. The report only raised them as instance-wide warnings.
Which n8n version should I run the migration report on?
The newest 2.x you can get, because the rules ship with the version. On October 31, 2026 the stable tag (2.45.7) had no rules for the LangChain Code node, Edit Image v1 or the Slack signing secret. The beta tag (2.46.3) had all three. You can run it on a copy of your database without upgrading production.
Does the n8n migration report fix workflows automatically?
Only for some rules. Its Migrate action rewrote a Cron node into a Schedule Trigger and saved it as a new version. For Function nodes, $getPairedItem and Execute Sub-workflow URL sources it answered 'No automated migration is available', so those are hand edits.
Why did my Slack Trigger stop working after the n8n 3.0 upgrade?
n8n 3.0 requires a signing secret on the Slack API credential. Without one, my test workflow answered 401 to every request on the first boot, and after a restart it wasn't registered at all. The editor still showed it as published. Add the signing secret from your Slack app's Basic Information page and publish again.
How I Tested This
October 31, 2026, on a Mac mini. Docker images n8nio/n8n:2.38.3 (to seed), 2.45.7 (the stable tag), 2.46.3 (beta) and 3.0.1. SQLite, internal task runner, N8N_SSRF_PROTECTION_ENABLED=true, every other setting at its default. Fixtures were imported and published with the n8n CLI and run through production webhooks. The report was read through the same REST endpoints the Settings page calls, and the rule list came from the shipped source in each image. The 186-workflow scan used a copy with no credentials, and I'm only publishing counts. Read n8n's migration tool docs alongside this. 3.0 is still a beta, so rules will keep landing.
Want Your n8n 3.0 Upgrade Tested First?
I run this exact process on client instances: report from the newest 2.x, fixes, then a full 3.0 dry run on a copy before anyone touches production. Tell me what you're running.
Related Posts
n8n
n8n 3.0 Breaking Changes: What Actually Breaks
n8n 3.0 drops npm installs, AI Agent node v1, and three legacy nodes. I audited 182 production workflows against the full removal list — 12 nodes flagged, 11 needed a version bump, exactly 1 needed a rewrite.
n8n
Fix n8n "access to env vars denied" in n8n 2.x
n8n 2.x only unblocks $env when N8N_BLOCK_ENV_ACCESS_IN_NODE is exactly the string false. I tested seven values on n8n 2.44.6, found the Docker Compose quoting that keeps it blocked, and measured what the fix exposes: the encryption key.
n8n
n8n Durable Scheduler: What Changes for Schedule Triggers
n8n 2.45 turns the durable scheduler on by default. Tested on 2.44.3: a 26-second restart lost zero runs, a 3-minute outage dropped 16 of 17, only v1.4 Schedule Triggers can catch up, and every-N-minutes rules now run a fixed gap from activation instead of on the clock.