📁 last Posts

How to Fix Webhook 404 "Not Registered" Error in n8n (Step-by-Step)

How to Fix Webhook 404 Not Registered Error in n8n — Complete Troubleshooting Guide by TriggerWorkflow
The n8n 404 "Not Registered" error — every cause explained and fixed in this guide.

🔴 You built a webhook workflow in n8n, activated it, sent your first test request — and got back an HTTP 404 with "The requested webhook is not registered." This error is infuriating because the Webhook node clearly shows a URL, yet n8n acts like it has never heard of it.

After debugging this across dozens of n8n deployments — local machines, Docker containers, Oracle Cloud VPS instances, and Railway — I have found that 95% of cases come down to six root causes. This guide walks through every single one, from the embarrassingly simple (the workflow is not active) to the ones that take real digging (duplicate path conflicts, Docker networking, corrupted webhook registry).

Quick Diagnosis — Check These in Order

n8n only registers a webhook when the workflow is Active. 90% of 404 errors are fixed by the first two checks below.

  1. Workflow toggle: Is it green and says "Active"? If not, click it.
  2. URL type: Are you using the Production URL (/webhook/) — not the Test URL (/webhook-test/)?
  3. Path match: Does the path in your request exactly match the path in the Webhook node — including case and slashes?
  4. HTTP method: Does your request method (POST/GET) match the method set in the Webhook node?
  5. Duplicate path: Is another active workflow using the same webhook path?
  6. After any change: Did you deactivate and reactivate the workflow after editing the Webhook node?

Why Does n8n Return 404 "Not Registered"?

Most error messages tell you what went wrong. This one tells you exactly what went wrong — if you know what "registered" means in n8n's architecture.

n8n's Dynamic Webhook Registry

Unlike a traditional web server that maps static file paths to responses, n8n maintains a dynamic in-memory webhook registry. This registry is a live table of active paths and the workflow IDs that own them. It is built from scratch every time n8n starts and updated every time you activate or deactivate a workflow.

When an HTTP request arrives at /webhook/some-path, n8n looks up some-path in its registry. If it finds a match, it fires the corresponding workflow. If it does not find a match, it returns: {"message": "The requested webhook is not registered."} — the exact error you are seeing.

The 404 "Not Registered" response does not mean your n8n server is broken. It means n8n's internal router has no live record of that path at this moment. The fix is always about putting a valid entry back into the registry — either by activating the workflow, correcting the path, or restarting n8n to rebuild the registry from your active workflows. — From real-world debugging on five different n8n deployments at TriggerWorkflow

When the Registry Gets Cleared or Corrupted

Four events cause the webhook registry to lose entries unexpectedly:

  • n8n process restart or crash — the in-memory registry is rebuilt from the database on startup. If a workflow is not Active in the database at restart time, its webhook path will not be registered.
  • Workflow edit without re-activation — editing a Webhook node (changing path, method, or response mode) while the workflow is active does not automatically re-register the updated path. You must deactivate and reactivate.
  • Database migration after n8n upgrade — upgrading n8n sometimes alters workflow metadata structure. Workflows that were active before the upgrade may need to be deactivated and reactivated once to rebuild their registry entries.
  • Conflicting path from another workflow — if two workflows share the same path and method, n8n registers only one. The other silently loses its registration.
🧠

Mental model: Think of n8n's webhook registry as a doorman's list of allowed guests. The list is rebuilt from scratch every time the doorman (n8n) shows up for work. If your name (webhook path) is not on the active list when he arrives, you get turned away — even if you used to be on the list.


Fix #1: Activate Your Workflow (Solves 70% of Cases)

I am going to say this plainly: the first time I encountered this error, I spent 40 minutes checking Docker configs, Nginx headers, and environment variables before I noticed the workflow toggle was gray. It has happened to everyone, including very experienced developers. Check this first, every time, without embarrassment.

How to Activate

Open the workflow in the n8n editor. In the top-right corner, you will see a toggle with a label. It must say "Active" and show a green color. If it says "Inactive" and is gray, click it once. Wait 2–3 seconds for n8n to register the webhook path, then retry your request.

n8n workflow activation toggle showing Active state
Fig 1. The workflow toggle must be green (Active) for webhooks to register. Gray means the path is not live.

The Edit-Without-Reactivation Trap

This is the most common second-time mistake. You had a working webhook, you edited the Webhook node to change the path or response mode, saved the workflow — and now it returns 404 again. Here is why:

n8n does not automatically update a live webhook registration when you save changes to an active workflow. The old path stays in the registry until you deactivate the workflow, which removes it, and reactivate, which registers the new path.

1

Save your changes in the editor

Click the Save button (top-right) or press Ctrl+S. Confirm the workflow is saved before proceeding.

2

Deactivate the workflow

Click the Active toggle to turn it gray. Wait until n8n confirms it is inactive. This removes the old webhook path from the registry.

3

Reactivate the workflow

Click the toggle again to turn it green. n8n now registers the new webhook path. Wait 2–3 seconds, then test.

4

Update the URL in your external app

If you changed the webhook path, copy the new Production URL from the Webhook node and update it in Shopify, Typeform, Stripe, or wherever you configured it.

⚠️

If activating returns an error like "Workflow could not be activated" — open the Executions log (left sidebar), find the most recent failed activation, and read the error. It usually means the workflow has a node with missing credentials or an expression that cannot be evaluated at activation time.


Fix #2: You Are Using the Test URL in Production

n8n generates two different URLs for every Webhook node. They look nearly identical but behave completely differently. Using the wrong one is the second most common cause of 404 errors after inactive workflows.

URL Type Path Format When It Works Right for Live Apps?
Test URL /webhook-test/your-path Only while editor is open + "Listen for Test Event" clicked ❌ Never
Production URL ✅ /webhook/your-path Always — 24/7 while workflow is Active ✅ Always

The giveaway is in the path. The Test URL contains /webhook-test/. The Production URL contains /webhook/ (no "test"). If the URL you configured in your external app contains the word "test," that is your problem.

n8n webhook node showing Test URL vs Production URL
Fig 2. Always copy the Production URL (bottom field) — not the Test URL (top field) — for any live integration.

Quick Self-Check

Open your external app's webhook settings (Shopify, Stripe, Typeform, etc.) and look at the URL you configured. If it contains /webhook-test/, replace it with the Production URL from the n8n Webhook node. The Production URL is always displayed in the bottom URL field of the node panel.


Fix #3: Webhook Path or HTTP Method Mismatch

n8n's webhook router matches paths and HTTP methods together. A request to the right path with the wrong method returns 404 just like a request to a wrong path entirely. This is stricter than most developers expect.

How to Check for a Path Mismatch

Open the Webhook node in n8n and look at the Path field. Now look at the URL you are sending requests to. They must match character-for-character — same case, same slashes, no extra parameters. Common mismatches:

❌ Extra trailing slash — Webhook node path: incoming-data / Request URL: /webhook/incoming-data/
✅ Fix: Remove the trailing slash from the request URL, or add it to the Webhook node path — then reactivate.
❌ Case mismatch — Webhook node path: ShopifyOrder / Request URL: /webhook/shopifyorder
✅ Fix: n8n paths are case-sensitive. Use exactly the same case in both places. Best practice: always use lowercase with hyphens: shopify-order.
❌ Wrong HTTP method — Webhook node set to POST / External app sending GET
✅ Fix: Match the HTTP method. Open the Webhook node, check the "HTTP Method" dropdown, and make sure your sender uses the same method. If you need to accept both GET and POST, add a second Webhook node with a different path for each.
❌ Encoded characters in URL — Webhook node path: my workflow / Request URL: /webhook/my%20workflow
✅ Fix: Never use spaces in webhook paths. Use hyphens: my-workflow. URL encoding is inconsistent across platforms.

📖 Foundation — Read Before Continuing
What is a Webhook? A Simple Example Without Code (n8n Tutorial)

Not sure how webhooks work at all? Start here. This guide explains the concept from scratch using a real-world analogy, then walks you through building your first webhook workflow without writing any code.

Fix #4: Duplicate Webhook Path Conflict

This one is invisible unless you know to look for it. If two active workflows both have a Webhook node with the same path and HTTP method, n8n registers only one of them — the one that activated first. The other silently returns 404 on every request.

How to Find Conflicting Paths

Go to n8n's workflow list (left sidebar → Workflows). Sort by Active. Open each active workflow one by one and check the path of any Webhook nodes. You are looking for duplicates — the same path appearing in more than one active workflow.

Alternatively, use n8n's REST API to query all registered webhooks:

bash — list all registered webhooks via n8n API
# Replace YOUR_N8N_URL, USER, and PASSWORD with your credentials
curl -s -u admin:your-password \
  https://YOUR_N8N_URL/api/v1/webhooks \
  | python3 -m json.tool

# Or with an API key (n8n 0.188+):
curl -s -H "X-N8N-API-KEY: your-api-key" \
  https://YOUR_N8N_URL/api/v1/webhooks \
  | python3 -m json.tool

The output lists every registered path. If you see your path appearing twice, you have a conflict. Deactivate the workflow that should not be using that path, change its Webhook node to a unique path, and reactivate.

💡

Naming convention to prevent conflicts: Prefix webhook paths with the workflow purpose. Examples: shopify-order-created, stripe-payment-success, typeform-lead-capture. This makes duplicates impossible to create accidentally and makes each path self-documenting.


Fix #5: Nginx Reverse Proxy Misconfiguration

If you run n8n behind Nginx — which you should for HTTPS — a proxy misconfiguration can cause 404 errors that have nothing to do with n8n itself. The most common culprit is Nginx rewriting the request path before n8n sees it, so n8n looks up a path that does not match anything in its registry.

The Correct Nginx Configuration

/etc/nginx/sites-available/n8n.conf — correct config
server {
    listen 80;
    server_name your-domain.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name your-domain.com;

    ssl_certificate     /etc/letsencrypt/live/your-domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;

    # ── Critical: do NOT rewrite the path ──
    location / {
        proxy_pass http://127.0.0.1:5678;   # No trailing slash here
        proxy_http_version 1.1;
        proxy_set_header Host              $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header Upgrade           $http_upgrade;
        proxy_set_header Connection        "upgrade";
        proxy_buffering off;
        proxy_read_timeout 300;
    }
}

The Two Most Common Nginx Mistakes That Cause 404

  • Trailing slash on proxy_pass with a location sub-path: If you write location /n8n/ { proxy_pass http://127.0.0.1:5678/; }, Nginx strips /n8n/ from the path before passing it to n8n. The request for /n8n/webhook/my-path arrives at n8n as /webhook/my-path — which may or may not match what n8n expects depending on your setup.
  • Missing Host header: Without proxy_set_header Host $host, n8n sees the internal hostname (127.0.0.1) as the Host and may generate incorrect webhook URLs or reject requests from known-bad hosts.

After any Nginx change, always test before reloading:

bash — test and reload Nginx
sudo nginx -t                  # Test for syntax errors
sudo systemctl reload nginx   # Apply if test passes

🔧 Related Troubleshooting Guide
How to Fix "Webhook URL Shows Localhost" Error in n8n (VPS Solution)

If your webhook URL shows http://localhost:5678 instead of your public domain, that is a different but related issue — fixed by setting the WEBHOOK_URL environment variable. Full guide with Docker, systemd, and Nginx configs.

Fix #6: Force a Registry Rebuild by Restarting n8n

If you have checked everything — the workflow is active, the URL is correct, the path matches, no conflicts, Nginx is fine — and the 404 persists, the webhook registry itself may be in a bad state. This can happen after an n8n upgrade, a Docker container restart that interrupted a write, or a database operation that partially updated workflow state.

The fix is a clean restart. On startup, n8n re-reads all workflows from the database and rebuilds the registry from scratch, re-registering every webhook that belongs to an active workflow.

bash — force registry rebuild
# Docker:
docker restart n8n

# Docker Compose:
docker compose restart n8n

# systemd:
sudo systemctl restart n8n

# After restart, verify the webhook is now registered:
curl -s -u admin:password https://your-domain.com/api/v1/webhooks | grep "your-path"

After an n8n Version Upgrade

n8n upgrades sometimes change the internal format of webhook paths or the database schema. After upgrading, follow this sequence to ensure all webhooks re-register correctly:

  1. Let n8n complete its database migration (watch logs: docker logs n8n --follow).
  2. Open each workflow that uses Webhook nodes.
  3. Deactivate, then reactivate each one. This forces n8n to write fresh webhook registration records in the new format.
  4. Test each webhook with a cURL request.
📦

Imported workflow JSON: When you import a workflow from a JSON file, it always starts in Inactive state — regardless of whether it was Active in the original instance. You must manually activate imported workflows. Also check that the Webhook node's typeVersion in the JSON is compatible with your n8n version (use typeVersion: 1 for maximum compatibility).


Complete Diagnosis Table: Match Your Symptom to the Fix

Use this table to go from symptom directly to solution — no guesswork.

Symptom Most Likely Cause Fix Section
404 on every request, never worked Workflow never activated Fix #1 — Activate workflow
Worked before, now 404 after editing Edited without re-activation Fix #1 — Deactivate + reactivate
Works in editor test, fails from external app External app using Test URL Fix #2 — Use Production URL
404 only on certain paths Path or method mismatch Fix #3 — Check path and method
404 after duplicating a workflow Duplicate path conflict Fix #4 — Rename one path
Works with cURL, fails from Shopify/Stripe Nginx host or proto header missing Fix #5 — Nginx headers
404 after n8n upgrade Registry not rebuilt post-upgrade Fix #6 — Deactivate+reactivate all
404 after Docker container restart Workflow was inactive at restart Fix #6 — Restart + reactivate
404 on imported JSON workflow Imported workflows start inactive Fix #1 — Activate, check typeVersion
Intermittent 404 (works sometimes) n8n crash loop deregistering on restart Check logs, fix root crash, then Fix #6

How to Test Your Webhook After Applying a Fix

Always test with a direct cURL command before configuring any external app. This isolates the problem to either n8n or the external app — never both at once.

bash — comprehensive webhook test
# Basic test — check for 200 response:
curl -X POST https://your-domain.com/webhook/your-path \
  -H "Content-Type: application/json" \
  -d '{"test": true, "source": "manual-check"}' \
  -w "\nHTTP Status: %{http_code}\n"

# Verbose — see all request and response headers:
curl -v -X POST https://your-domain.com/webhook/your-path \
  -H "Content-Type: application/json" \
  -d '{"test": true}'

# Expected success response:
{"message":"Workflow was started"}
# Expected error response if still not registered:
{"message":"The requested webhook is not registered."}

Post-Fix Verification Checklist

  • cURL returns {"message":"Workflow was started"} — not a 404.
  • n8n Executions log (left sidebar → Executions) shows a new execution entry.
  • The execution shows green checkmarks on all nodes — no red error nodes.
  • Any downstream output (Telegram message, Google Sheets row, Slack ping) arrived as expected.
  • Production URL configured in external app — not Test URL.
🎉

Webhook confirmed working. Now that your webhook endpoint is live and verified, you can connect it to any external service — Shopify, Stripe, Typeform, Calendly, GitHub, or your own custom app.


🔧 Next Troubleshooting Step
How to Fix "Workflow Execution Failed" Error in n8n

Your webhook now fires — but if the execution itself fails with a red error node, this complete troubleshooting guide covers every cause: credential issues, expression errors, API timeouts, and more.

Frequently Asked Questions

Why does n8n return 404 "Not Registered" on a webhook?
n8n only adds a webhook path to its internal router when the workflow containing that Webhook node is Active. If the workflow is inactive, n8n has no record of that path and returns a 404 "Not Registered" response to any request that arrives at it. Activate the workflow and the path registers immediately.
Do I need to reactivate the workflow after changing the webhook path?
Yes, always. Editing a Webhook node (path, method, or response mode) while the workflow is active does not automatically update the live registration. You must save the workflow, then deactivate and reactivate it. Only then does n8n register the new path and deregister the old one.
What is the difference between the Test URL and the Production URL?
The Test URL (/webhook-test/path) only works while the n8n editor is open and you have clicked "Listen for Test Event." The moment you close the editor tab, the Test URL stops responding. The Production URL (/webhook/path) works 24/7 as long as the workflow is Active. External services must always use the Production URL.
Can two workflows use the same webhook path?
No. n8n's router requires unique path and HTTP method combinations. If two active workflows claim the same path and method, n8n registers only the first one and the second silently loses its registration. The second workflow's webhook will always return 404. The fix is to give each webhook a unique path.
Does restarting n8n fix the 404 error?
Sometimes. On restart, n8n rebuilds its webhook registry from all Active workflows in the database. If the registry was corrupted or a crash cleared it, a restart forces re-registration of all active webhooks. However, if the workflow is inactive or the path is wrong, restarting changes nothing — fix the root cause first.
Why does my webhook work from cURL but not from Shopify or Stripe?
The most likely cause is a missing Nginx header. Shopify and Stripe send HTTPS requests — if your Nginx config does not pass X-Forwarded-Proto: https to n8n, n8n may reject or misroute the request. Also verify that WEBHOOK_URL is set to your public HTTPS domain, not localhost. Run the cURL verbose test with -v to compare headers between your working test and the failing Shopify call.
What causes 404 after importing an n8n workflow from JSON?
Imported workflows always start in Inactive state — n8n never auto-activates an import. You must manually toggle the imported workflow to Active. Also check the Webhook node's typeVersion in the JSON: older exports use version 1, newer ones use version 2. Using the wrong version for your n8n instance can cause the node to be unrecognized. Use typeVersion: 1 for broadest compatibility.
How do I verify which webhooks are currently registered in n8n?
Use n8n's REST API: send a GET request to https://your-n8n-domain.com/api/v1/webhooks with Basic Auth or an API key. The response lists all currently registered paths. If your path is missing from this list, the workflow is inactive or the path does not exist — regardless of what the Webhook node UI shows you.

Continue Learning on TriggerWorkflow

Webhook Fixed — Now Put It to Work

Your n8n webhook is registered and responding. Import one of our free workflow templates and connect it to your first real external app in under 30 minutes.

Browse Free Workflow Templates Soon
Mr. Ahmed Ayari — TriggerWorkflow I have debugged the 404 "Not Registered" error across dozens of n8n deployments. Every fix in this guide comes from a real case — not documentation reading. The diagnosis table alone should get you unblocked in under 5 minutes.
Comments