Skip to content
unboxth
AI Automation

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

Line illustration of a workflow canvas with three connected nodes and a blue plug restoring the last connection

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

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_TEST and N8N_ENDPOINT_WEBHOOK change 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 have EXECUTIONS_MODE=queue and 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.

  1. They import n8n-webhook-health-check.json, publish it and run curl -i https://n8n.example.com/webhook/unboxth-health-check.
  2. The reply includes "n8nWebhookUrl": "http://localhost:5678/webhook/unboxth-health-check" and a warning that the proxy says https and host n8n.example.com while n8n advertises localhost.
  3. They add N8N_WEBHOOK_URL=https://n8n.example.com/ and N8N_PROXY_HOPS=1 to the container, confirm nginx sets the three X-Forwarded-* headers, and restart.
  4. The health check now returns an empty warnings list. 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 set GENERIC_TIMEZONE (for example America/Toronto or Australia/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?
The test URL works only after you click Listen for test event, and it stops listening after 120 seconds. The production URL registers only when you publish the workflow, and it runs the published version. If you edited after publishing, publish again. Also confirm the sender calls /webhook/ and not /webhook-test/.
What is the difference between the n8n webhook test vs production URL?
The test URL (/webhook-test/ by default) listens for 120 seconds after you click Listen for test event and shows the data on the canvas. The production URL (/webhook/) stays live while the workflow is published and logs runs only in the Executions tab.
What does 'The requested webhook is not registered' mean in n8n?
n8n has no production webhook at that path and method. Usually the workflow isn't published, the publish only partly succeeded, or the path is wrong. If the message instead says 'This webhook is not registered for GET requests. Did you mean to make a POST request?', the path exists but the method is wrong.
n8n webhook production URL not working behind a reverse proxy: what do I set?
Set N8N_WEBHOOK_URL to your public URL (for example https://n8n.example.com/), set N8N_PROXY_HOPS to the number of proxies in front of n8n (usually 1), pass X-Forwarded-For, X-Forwarded-Host and X-Forwarded-Proto from the last proxy, then restart n8n.
Is WEBHOOK_URL deprecated in n8n?
Yes. n8n's endpoints reference says WEBHOOK_URL is deprecated from n8n 2.35.0 and is an alias of N8N_WEBHOOK_URL. It still works but logs a warning on startup. On versions before N8N_WEBHOOK_URL existed, keep using WEBHOOK_URL.
Why is n8n Respond to Webhook not working?
Set the Webhook node's Respond option to Using 'Respond to Webhook' Node. If the workflow finishes without reaching the Respond node, n8n sends a standard 200 message; if it errors first, a 500. Only the first Respond node that runs counts, and it uses the first item only.

Sources

  1. 1. Webhook node (n8n Docs) docs.n8n.io
  2. 2. Webhook node common issues (n8n Docs) docs.n8n.io
  3. 3. Webhook workflow development (n8n Docs) docs.n8n.io
  4. 4. Save and publish workflows (n8n Docs) docs.n8n.io
  5. 5. Configure webhook URLs with reverse proxy (n8n Docs) docs.n8n.io
  6. 6. Endpoints environment variables (n8n Docs) docs.n8n.io
  7. 7. Deployment environment variables (n8n Docs) docs.n8n.io
  8. 8. Enable queue mode (n8n Docs) docs.n8n.io
  9. 9. Respond to Webhook node (n8n Docs) docs.n8n.io
  10. 10. Set the timezone (n8n Docs) docs.n8n.io
  11. 11. webhook-not-found.error.ts (n8n source on GitHub) github.com
  12. 12. Webhook node utils.ts (n8n source on GitHub) github.com
  13. 13. Issue #34038: production webhook not registered after activate API call (n8n GitHub) github.com
SD

Saksham Dogra

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.

On this page

More in AI Automation

View all

Menu

Topics

unboxth

Subscribe