Updated: 28 September 2026 · Applies to: n8n 2.40 (self-hosted)

Webhooks are how other apps start your n8n workflows. Most webhook problems on a self-hosted n8n have one of three causes: you call the Test URL when the workflow is published (or the reverse), the URL that n8n shows is wrong because it does not know its public address, or the HTTP method does not match. This guide checks each one.

1. Test URL or Production URL?

Every Webhook node has two addresses:

  • Test URL: click Listen for test event, then send the request. It listens for 120 seconds and shows the received data in the editor.
  • Production URL: publish the workflow. It listens until you unpublish the workflow. The data is not shown in the editor; look under Executions.

Use the Test URL while you build. Give the Production URL to the other app, and make sure the workflow is published. Calling the Production URL of an unpublished workflow, or the Test URL without listening, gives a 404 "not registered" answer. Successful production runs appear under Executions.

2. The URL shows localhost or the wrong address

n8n builds the webhook address from its protocol, host and port. Behind a reverse proxy such as Traefik or Nginx the real public address is different, so n8n must be told. n8n's documentation asks for this when it runs behind a reverse proxy:

  1. Set the public base address (n8n 2.35.0 and newer use N8N_WEBHOOK_URL; the older name WEBHOOK_URL still works but logs a deprecation warning):
    N8N_WEBHOOK_URL=https://n8n.example.com/
  2. Tell n8n that one proxy is in front of it:
    N8N_PROXY_HOPS=1
  3. Make sure the last proxy passes on the headers X-Forwarded-For, X-Forwarded-Host and X-Forwarded-Proto. Traefik does this by itself; for Nginx see How to run n8n behind Nginx with a free SSL certificate?.

In Docker Compose these are lines under environment: of the n8n service (see How to install n8n with Docker Compose and HTTPS on an Ubuntu VPS?). Apply the change with:

sudo docker compose up -d

Open the Webhook node again: the URLs should now start with your public address. Webhooks that were already registered at other services must be updated to the new address.

3. Wrong HTTP method

By default a Webhook node accepts one method, for example POST only. A GET request to it fails. Either send the method that is set in the node, or open the node's Settings and turn on Allow Multiple HTTP Methods.

4. Test the webhook yourself with curl

curl --request POST https://n8n.example.com/webhook/your-path --data 'key=value'
curl --request GET https://n8n.example.com/webhook/your-path

Replace the address with the URL from the node. If curl works but the other service does not, the problem is at the other service (wrong address, blocked IP, or a service that requires an answer within a few seconds).

5. Check from outside and check the firewall

  • The address must be reachable from the internet over HTTPS: curl -I https://n8n.example.com/healthz should answer 200.
  • If a CDN or firewall in front of the server blocks unknown clients, allow the service that sends the webhooks.

Frequently asked questions

The webhook works in the editor but not when the workflow runs on its own.
You tested with the Test URL. Publish the workflow and use the Production URL.

What does "Publish" mean? I only know "Activate".
Current n8n versions call it publishing; older versions used an Active toggle. Both make the Production URL work.

How do I return my own answer to the caller?
Use the Respond to Webhook node, or set the Webhook node's Response Mode to When Last Node Finishes.

Official documentation: n8n: Webhook node common issues and n8n: webhook URLs behind a reverse proxy.

Need a server for n8n, or a hand with the setup?

Prefer a hand with the setup? Our engineers can do it for you: Hire an Expert, or use our on-demand server management.

Was this answer helpful? 0 Users Found This Useful (0 Votes)