n8n Production Webhook Not Working: 9 Fixes + Test Workflow
Most dead production webhooks come down to one of nine causes, and the error body n8n sends back usually tells you which one.
Saksham Dogra 6 min read
If your n8n production webhook is not working while the test URL is fine, the workflow is almost always unpublished, running an older published version, or sitting behind a proxy that n8n doesn’t know about. Publish (or republish) the workflow, call /webhook/ instead of /webhook-test/, and read the body of the error n8n sends back, because it names the cause.
The stakes are quiet: a test URL only listens for 120 seconds, so everything looks fine while you build, and then a Stripe event, form submission or lead from your n8n lead generation workflow vanishes in production with nothing on the canvas. Below are the nine fixes in the order we’d check them, a free importable health-check workflow, and a two-page PDF checklist.
Free downloads
- Download the health-check workflow (JSON): import into n8n, publish, call it. It replies with what n8n saw (method, mode, the URL n8n thinks it lives at, forwarded headers) plus plain-English warnings. Secrets in headers are redacted.
- Download the troubleshooting checklist (PDF): the fixes below on two printable pages.
Checked against docs.n8n.io and n8n’s GitHub source on 2026-11-02. n8n now says “publish” where older versions and most forum threads say “activate”. Same idea.
First, decode the response
Send the request yourself with curl so you see the raw reply:
curl -i -X POST https://n8n.example.com/webhook/your-path \
-H 'Content-Type: application/json' -d '{"ping":1}'
| What comes back | What it means | Go to |
|---|---|---|
404 JSON: The requested webhook "POST your-path" is not registered. with hint The workflow must be active for a production URL to run successfully... |
Nothing is live at that path and method in production | Fix 1, 2, 7 |
404 JSON: This webhook is not registered for GET requests. Did you mean to make a POST request? |
The path exists, the method is wrong | Fix 3 |
HTML error page, Cannot POST /webhook/..., or a proxy’s 502/404 page |
n8n’s webhook handler never answered. Something in front of it did | Fix 4, 5, 8 |
200 but no run appears where you’re looking |
Production runs don’t show on the canvas | Fix 2 |
200 with “Workflow got started” or a generic message instead of your data |
Response wiring | Fix 6 |
403 |
IP allowlist rejecting the caller (often a proxy-hops issue) | Fix 5 |
524 on n8n Cloud |
No response within 100 seconds | Fix 6 |
Those two 404 messages are copied from n8n’s source (webhook-not-found.error.ts), so if your reply doesn’t look like either, the request probably isn’t reaching n8n’s webhook handler at all.
The 9 fixes
1. Publish, and republish after every edit
n8n registers the production webhook when you publish. The docs are explicit that production executions use the published version, “not your latest edits.” If the Publish button shows Published, has changes, your fix isn’t live yet.
Two states that look published but aren’t fully:
- Published, partial: at least one trigger failed to activate. Hover the button to see which, then publish again.
- Failed to publish: no trigger activated, so nothing is running.
Self-hosted and still getting “not registered” after a clean publish? Unpublish, publish again. If you activate workflows through the public API, GitHub issue #34038 (reported on n8n 2.29.8, closed July 2026) describes the API returning "active": true without registering the webhook until a deactivate/activate cycle or restart.
2. Use the production URL, and look in Executions
- Test:
https://HOST/webhook-test/PATH. Production:https://HOST/webhook/PATH. Those are the defaults;N8N_ENDPOINT_WEBHOOK_TESTandN8N_ENDPOINT_WEBHOOKchange the path segments. - The Test URL / Production URL switch in the node only changes which URL is displayed. Make sure the sender has the production one.
- Production calls never appear on the canvas. Open the workflow’s Executions tab.
3. Match the HTTP method
A Webhook node accepts one method by default. Your browser and link previews send GET; many SaaS senders POST. Either set the node to what the sender actually uses, or turn on Settings > Allow Multiple HTTP Methods (each method gets its own output, so wire every output you need).
4. Behind a reverse proxy: set N8N_WEBHOOK_URL
Without it, n8n builds webhook URLs from N8N_PROTOCOL + N8N_HOST + N8N_PORT, whose defaults are http, localhost and 5678. That’s how you end up registering http://localhost:5678/webhook/... with an external service.
export N8N_WEBHOOK_URL=https://n8n.example.com/
export N8N_PROXY_HOPS=1
Restart n8n, then copy the production URL again. Any service you registered with the old URL keeps the old one until you update it.
Which variable name? n8n’s endpoints reference says WEBHOOK_URL is deprecated from n8n 2.35.0 and is now an alias of N8N_WEBHOOK_URL; it still works but logs a warning. The queue-mode page says N8N_WEBHOOK_URL is available from 2.30.0 and to use WEBHOOK_URL on earlier versions. Check yours with n8n --version (or your image tag) and pick accordingly.
Also check your proxy routes /webhook/* to n8n at all. The n8n.example.com/ root working doesn’t prove the webhook path does.
5. N8N_PROXY_HOPS and forwarded headers
N8N_PROXY_HOPS is the number of reverse proxies in front of n8n (default 0). On the last proxy, pass X-Forwarded-For, X-Forwarded-Host and X-Forwarded-Proto. n8n’s common-issues page points to this setting when IPs on your webhook’s IP(s) Allowlist get rejected; requests from outside the allowlist get a 403.
6. Wire Respond to Webhook correctly
- In the Webhook node, set Respond to Using ‘Respond to Webhook’ Node.
- If the run finishes without reaching the Respond node, n8n returns a standard 200 message. If it errors before it, a 500. A second Respond node is ignored.
- It responds once, using the first item. Put an Aggregate node before it if you need everything.
- On n8n Cloud, Cloudflare fails requests with a 524 if your webhook doesn’t respond within 100 seconds. Respond early, then let the caller poll a second webhook for the result.
7. Clear path conflicts
n8n allows one webhook per path and HTTP method across the instance. If it says the path and method are already in use, unpublish the other workflow or change the path or method. Fixed, readable paths (like stripe-events) are where clashes come from; the random default path exists to avoid them.
8. Queue mode: make sure something can run the job
With EXECUTIONS_MODE=queue, the main or webhook process receives the request but a worker runs the execution. Check:
- Workers are actually running. Settings > Workers lists them only on Enterprise plans, so on other plans check the worker containers and their logs.
- Webhook processors (
n8n webhook) also haveEXECUTIONS_MODE=queueand Redis access. - Your load balancer sends
/webhook/*and/webhook-waiting/*to the webhook pool and/webhook-test/*to the main process. - If
N8N_DISABLE_PRODUCTION_MAIN_PROCESS=true, the main process won’t take production webhooks, so it must not be the only thing receiving them. - Large replies from Respond to Webhook travel through Redis, capped by
N8N_WEBHOOK_RESPONSE_RELAY_SIZE_MAX(default 64 MiB).
9. Payload size
The default max payload is 16 MiB. Self-hosted, raise it with N8N_PAYLOAD_SIZE_MAX and restart.
Worked example: Stripe test events work, live ones vanish
A founder runs n8n in Docker on a VPS behind nginx at https://n8n.example.com. Test events land fine while they click Listen for test event. In production, nothing shows up.
- They import
n8n-webhook-health-check.json, publish it and runcurl -i https://n8n.example.com/webhook/unboxth-health-check. - The reply includes
"n8nWebhookUrl": "http://localhost:5678/webhook/unboxth-health-check"and a warning that the proxy sayshttpsand hostn8n.example.comwhile n8n advertiseslocalhost. - They add
N8N_WEBHOOK_URL=https://n8n.example.com/andN8N_PROXY_HOPS=1to the container, confirm nginx sets the threeX-Forwarded-*headers, and restart. - The health check now returns an empty
warningslist. They republish the Stripe workflow, copy the production URL from the node, update the endpoint in Stripe, and the next event shows in Executions.
(Illustrative example; your hostnames and sender will differ.)
US, Canada and Australia notes
The fixes are identical everywhere; n8n has no country-specific webhook behavior. Two practical points:
- Timezones. A self-hosted instance defaults to
America/New_York, and the Schedule node uses that zone. Founders in Vancouver, Toronto, Sydney or Perth should setGENERIC_TIMEZONE(for exampleAmerica/TorontoorAustralia/Sydney) so schedules fire on your day. Still choosing between self-hosting and n8n Cloud? See n8n self-hosted vs cloud cost. - Senders far from your server. On n8n Cloud the 100-second limit applies no matter where the caller is, so long AI steps (an LLM call inside the webhook path) are the usual reason for 524s. Respond first, process after.
General information for founders running n8n, not professional advice. n8n changes quickly; confirm settings against the docs for your version. Checked on 2026-11-02.
Frequently asked questions
Why is my n8n production webhook not working when the test URL works?
What is the difference between the n8n webhook test vs production URL?
What does 'The requested webhook is not registered' mean in n8n?
n8n webhook production URL not working behind a reverse proxy: what do I set?
Is WEBHOOK_URL deprecated in n8n?
Why is n8n Respond to Webhook not working?
Sources
- 1. Webhook node (n8n Docs) docs.n8n.io
- 2. Webhook node common issues (n8n Docs) docs.n8n.io
- 3. Webhook workflow development (n8n Docs) docs.n8n.io
- 4. Save and publish workflows (n8n Docs) docs.n8n.io
- 5. Configure webhook URLs with reverse proxy (n8n Docs) docs.n8n.io
- 6. Endpoints environment variables (n8n Docs) docs.n8n.io
- 7. Deployment environment variables (n8n Docs) docs.n8n.io
- 8. Enable queue mode (n8n Docs) docs.n8n.io
- 9. Respond to Webhook node (n8n Docs) docs.n8n.io
- 10. Set the timezone (n8n Docs) docs.n8n.io
- 11. webhook-not-found.error.ts (n8n source on GitHub) github.com
- 12. Webhook node utils.ts (n8n source on GitHub) github.com
- 13. Issue #34038: production webhook not registered after activate API call (n8n GitHub) github.com
Founder, unboxth
Saksham Dogra is the founder of unboxth. He writes founder to founder about building an AI startup from anywhere: company setup, costs, tools and fundraising.