Common Migration Errors and How to Fix Them
· By AI Compare
The ten errors teams hit after moving to n8n, and exactly how to fix each one.
The most common errors after migrating to n8n
1. "Workflow could not be activated" or webhook not receiving data
Cause: the source app still points to the test webhook URL, or the workflow is not active.
Fix: n8n webhooks have a Test URL (works only while you click "Listen for test event") and a Production URL (works only when the workflow is active). Activate the workflow and paste the Production URL into the source app. On self-hosted n8n, set WEBHOOK_URL so n8n shows your public domain, not localhost.
2. Schedules run at the wrong time
Cause: timezone not set.
Fix: set GENERIC_TIMEZONE (self-hosted) or the workflow timezone in Workflow settings.
3. Nodes run too many (or too few) times
Cause: misunderstanding items. n8n runs each node once per incoming item. A migrated "Looping" step or Make iterator added on top creates double processing.
Fix: remove unnecessary loops. Use Aggregate to combine items when you need one output (for example, one Slack message summarising 20 rows), or enable Execute Once on a node.
4. "Cannot read properties of undefined" in expressions
Cause: the referenced field does not exist on some items, or you referenced the wrong node.
Fix: use optional chaining and defaults: {{ $json.customer?.email ?? '' }}. Reference earlier nodes explicitly: {{ $('Stripe Trigger').item.json.data.object.id }}.
5. OAuth errors: "invalid_grant", "redirect_uri_mismatch", tokens expiring
Causes and fixes:
- redirect_uri_mismatch: the redirect URL in the app's developer console must exactly match the one shown in the n8n credential (https, domain, path).
- invalid_grant after 7 days (Google): your Google OAuth app is in "Testing" mode. Publish it or use an Internal app in Google Workspace.
- Missing scopes: add the required scopes and reconnect the credential.
See credentials guide.
6. Duplicate records after cut-over
Cause: the old Zap or scenario and the new workflow ran at the same time, or a webhook was retried.
Fix: turn off the old automation at the moment you activate the new one. Use upserts (create or update) and store external IDs to make workflows idempotent.
7. Date formats differ from Zapier
Cause: Zapier's Formatter output a specific format; n8n returns ISO dates.
Fix: format explicitly: {{ $json.date.toDateTime().toFormat('dd/MM/yyyy') }}.
8. Binary files missing (attachments, PDFs)
Cause: file data lives in the item's binary property, not JSON, and a node in between dropped it.
Fix: check the binary property name (for example attachment_0 or data) and set it in the receiving node. Some nodes (like Edit Fields) need "Include binary data" enabled.
9. Rate limit errors (429)
Cause: n8n processes items fast and hits API limits Zapier's slower polling avoided.
Fix: enable Retry On Fail with a wait between tries, use Loop Over Items with batch size and a Wait node, or use the node's batching options.
10. Self-hosted instance runs out of memory
Cause: large files, big JSON payloads or many concurrent executions on a small server.
Fix: increase RAM, process data in batches, avoid keeping large binaries in memory (use filesystem binary mode), or move to queue mode with workers.
Debugging habits that save hours
- Pin trigger data while building so you can re-run without new events.
- Open failed executions and check the first red node's input and output.
- Add an Error Trigger workflow that posts failures to Slack with the workflow name and link.
