Received request for unknown webhook: The requested webhook "POST /webhook/[webhookId]" is not registered

Describe the problem/error/question

I have Dockploy installed on a VPS with all ports closed except for SSH and using Cloudflare Tunnels. I have an n8n server deployed with the following Docker Compose configuration.

networks:
  n8n-prod-network:
    name: n8n-prod-network

volumes:
  postgres_prod_data:
  redis_prod_data:
  n8n_prod_data:

x-n8n-hardening: &n8n-hardening
  cap_drop: ["ALL"]
  security_opt: ["no-new-privileges:true"]

x-n8n-db-env: &n8n-db-env
  DB_TYPE: "postgresdb"
  DB_POSTGRESDB_HOST: "postgres"
  DB_POSTGRESDB_PORT: "5432"
  DB_POSTGRESDB_DATABASE: "${POSTGRES_DB}"
  DB_POSTGRESDB_USER: "${POSTGRES_USER}"
  DB_POSTGRESDB_PASSWORD: "${POSTGRES_PASSWORD}"
  QUEUE_BULL_REDIS_HOST: "redis"
  QUEUE_BULL_REDIS_PORT: "6379"
  EXECUTIONS_MODE: "queue"

services:
  postgres:
    image: postgres:15-alpine
    container_name: n8n-prod-postgres
    restart: unless-stopped
    networks:
      - n8n-prod-network
    environment:
      POSTGRES_USER: "${POSTGRES_USER}"
      POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}"
      POSTGRES_DB: "${POSTGRES_DB}"
      TZ: "${TZ}"
    volumes:
      - postgres_prod_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    container_name: n8n-prod-redis
    restart: unless-stopped
    networks:
      - n8n-prod-network
    environment:
      TZ: "${TZ}"
    volumes:
      - redis_prod_data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5

  n8n-main:
    <<: *n8n-hardening
    image: n8nio/n8n:stable
    container_name: n8n-prod-main
    restart: unless-stopped
    networks:
      - n8n-prod-network
    env_file: .env
    environment:
      <<: *n8n-db-env
      N8N_DISABLE_PRODUCTION_MAIN_PROCESS: "true"
      OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS: "true"
    volumes:
      - n8n_prod_data:/home/node/.n8n
      - /opt/n8n/workflows:/workflows:ro
    depends_on:
      postgres: { condition: service_healthy }
      redis: { condition: service_healthy }
    healthcheck:
      test: ["CMD-SHELL", "wget -qO- http://localhost:5678/healthz/readiness || exit 1"]
      timeout: 10s
      retries: 3
      start_period: 40s

  n8n-webhook:
    <<: *n8n-hardening
    image: n8nio/n8n:stable
    container_name: n8n-prod-webhook
    command: webhook
    restart: unless-stopped
    networks:
      - n8n-prod-network
    env_file: .env
    environment:
      <<: *n8n-db-env
    volumes:
      - n8n_prod_data:/home/node/.n8n
    depends_on:
      n8n-main: { condition: service_healthy }
    healthcheck:
      test: ["CMD-SHELL", "wget -qO- http://localhost:5678/healthz/readiness || exit 1"]
      timeout: 10s
      retries: 3
      start_period: 40s

  n8n-worker:
    <<: *n8n-hardening
    image: n8nio/n8n:stable
    container_name: n8n-prod-worker
    command: worker --concurrency=10
    restart: unless-stopped
    networks:
      - n8n-prod-network
    env_file: .env
    environment:
      <<: *n8n-db-env
      QUEUE_HEALTH_CHECK_ACTIVE: "true"
      N8N_RUNNERS_MODE: "external"
      N8N_RUNNERS_BROKER_LISTEN_ADDRESS: "0.0.0.0"
      N8N_RUNNERS_AUTH_TOKEN: "${N8N_RUNNERS_AUTH_TOKEN}"
    volumes:
      - n8n_prod_data:/home/node/.n8n
    depends_on:
      n8n-main: { condition: service_healthy }
    healthcheck:
      test: ["CMD-SHELL", "wget -qO- http://localhost:5678/healthz/readiness || exit 1"]
      timeout: 10s
      retries: 3
      start_period: 40s

  n8n-worker-runner:
    image: n8nio/runners:stable
    container_name: n8n-prod-worker-runner
    restart: unless-stopped
    networks:
      - n8n-prod-network
    environment:
      TZ: "${TZ}"
      N8N_RUNNERS_TASK_BROKER_URI: "http://n8n-prod-worker:5679"
      N8N_RUNNERS_AUTH_TOKEN: "${N8N_RUNNERS_AUTH_TOKEN}"
      N8N_NATIVE_PYTHON_RUNNER: "true"
    depends_on:
      n8n-worker: { condition: service_healthy }

  autoheal:
    image: willfarrell/autoheal:latest
    container_name: n8n-prod-autoheal
    restart: always
    environment:
      AUTOHEAL_CONTAINER_LABEL: "all"
      TZ: "${TZ}"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

And i have this .env.example

N8N_ENCRYPTION_KEY=...
N8N_RUNNERS_AUTH_TOKEN=...
POSTGRES_PASSWORD=...

WEBHOOK_URL=https://n8n.pymelink.es/

TZ=Europe/Madrid

POSTGRES_USER=...
POSTGRES_DB=...

N8N_DIAGNOSTICS_ENABLED=false
N8N_VERSION_NOTIFICATIONS_ENABLED=false
N8N_TEMPLATES_ENABLED=false
NODES_EXCLUDE=[“n8n-nodes-base.executeCommand”,“n8n-nodes-base.localFileTrigger”]
N8N_COMMUNITY_PACKAGES_ENABLED=false
N8N_BLOCK_ENV_ACCESS_IN_NODE=true
N8N_BLOCK_FILE_ACCESS_TO_N8N_FILES=true
N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
N8N_RESTRICT_FILE_ACCESS_TO=/tmp/n8n-safe-dir
N8N_SECURE_COOKIE=true
N8N_SAMESITE_COOKIE=lax
N8N_PUBLIC_API_SWAGGERUI_DISABLED=true
N8N_GIT_NODE_ENABLE_HOOKS=false
N8N_GIT_NODE_DISABLE_BARE_REPOS=true
EXTERNAL_FRONTEND_HOOKS_URLS=
N8N_DIAGNOSTICS_CONFIG_FRONTEND=
N8N_DIAGNOSTICS_CONFIG_BACKEND=

EXECUTIONS_DATA_PRUNE=true
EXECUTIONS_DATA_MAX_AGE=168
EXECUTIONS_DATA_PRUNE_MAX_COUNT=15000

N8N_ENDPOINT_HEALTH=/healthz

What is the error message (if any)?

The problem is that when I call the webhook, for example, by making a post from my website, I get an error and this log appears in the n8n-prod-webhook container.

2026-05-15T10:52:14.313Z Starting n8n webhook process...
2026-05-15T10:52:14.858Z n8n ready on ::, port 5678
2026-05-15T10:52:14.934Z [license SDK] Skipping renewal on init: renewOnInit is disabled in config
2026-05-15T10:52:14.934Z [license SDK] Skipping renewal on init: autoRenewEnabled is disabled in config
2026-05-15T10:52:14.934Z [license SDK] Skipping renewal on init: license cert is not due for renewal
2026-05-15T10:52:15.113Z Instance registered
2026-05-15T10:52:15.117Z Discovered 4 cluster checks
2026-05-15T10:52:15.913Z Version: 2.20.7
2026-05-15T10:52:15.914Z Webhook listener waiting for requests.
2026-05-15T10:52:53.332Z Received request for unknown webhook: The requested webhook "POST /webhook/9ecd7525-253d-486d-8bb0-de1d8bb790ee" is not registered.
2026-05-15T11:00:02.374Z Execution 87 (job 87) finished

Please share your workflow


Information on your n8n setup

  • n8n version: 2.20.7
  • Database (default: SQLite): Postgres
  • n8n EXECUTIONS_PROCESS setting (default: own, main): idk
  • Running n8n via (Docker, npm, n8n cloud, desktop app): Docker
  • Operating system: Debian

Your webhook is not registered. Did you publish your workflow?
Also, can you downgrade n8n to 2.20.6?

A couple of things I would check before changing versions.

From the compose you shared, you are running queue mode with a separate n8n-webhook process and N8N_DISABLE_PRODUCTION_MAIN_PROCESS=true on the main process. In that setup, production webhook traffic should be handled by the webhook process, while editor/internal traffic stays on main. So I would verify the path before debugging the workflow itself:

  1. Confirm the workflow is active/published and that you are calling the production URL, not a test URL. /webhook-test/... is only registered while a manual test is waiting.
  2. In Cloudflare Tunnel / Dockploy routing, make sure /webhook/* and /webhook-waiting/* go to the webhook container, and normal UI/API paths go to main.
  3. Make sure n8n-main, n8n-webhook, and n8n-worker all use the same database, Redis, N8N_ENCRYPTION_KEY, EXECUTIONS_MODE=queue, WEBHOOK_URL, and image version.
  4. After activating the workflow, restart the webhook container and watch whether it logs webhook registration on startup. If it never registers that path, the issue is probably workflow activation/DB visibility rather than Cloudflare.
  5. Test the exact public production URL with a simple curl/request and compare it with the URL shown inside the Webhook node.

One detail that stands out: your log shows the request reaches n8n-prod-webhook, so the tunnel is at least reaching the webhook process. That makes me suspect either the workflow is not active/published for that production URL, or the webhook process is not seeing the same registered workflow state as main.

I would not share credentials publicly. A safe next snippet would be only the Webhook node URL path, whether the workflow shows Active, and the n8n-main / n8n-webhook startup lines around webhook registration.