n8n Workflows Not Executing: Fix Guide

The Problem

Your n8n workflows are saved and activated, but they don’t execute when triggered. Common symptoms:

Updated March 2026: Verified with latest Docker images and configurations.

  • Webhook-triggered workflows show no executions when the webhook URL is called
  • Cron/schedule triggers never fire
  • Manual test runs work, but production triggers don’t
  • Executions appear “stuck” in running state
  • Error: The workflow can not be activated because it does not have any active triggers
No execution data found for workflow "My Workflow"

Or in the n8n logs:

Webhook "XXXXX" is not registered

The Cause

n8n workflow execution failures fall into five categories:

CauseSymptomsFrequency
Wrong WEBHOOK_URLWebhooks return 404, external triggers failVery common
Workflow not activatedManual tests work, production doesn’tCommon
Timezone mismatchCron triggers fire at wrong times or not at allCommon
Docker networkingWebhook callbacks can’t reach n8n containerCommon
Execution mode issuesWorkflows run once then stopLess common

The most frequent cause in Docker deployments is the WEBHOOK_URL environment variable not matching the URL where n8n is actually accessible.

The Fix

Method 1: Fix the Webhook URL (Most Common)

n8n uses WEBHOOK_URL to register webhook endpoints. If this doesn’t match how external services reach your n8n instance, webhook triggers silently fail.

Check your current setting:

docker exec n8n env | grep WEBHOOK

The WEBHOOK_URL must be the externally reachable URL of your n8n instance, including the protocol and port:

# Wrong — internal hostname or missing protocol
WEBHOOK_URL=n8n:5678
WEBHOOK_URL=localhost:5678

# Right — external URL with protocol
WEBHOOK_URL=https://n8n.example.com/
WEBHOOK_URL=http://192.168.1.100:5678/

Update your docker-compose.yml:

services:
  n8n:
    image: n8nio/n8n:2.12.3
    environment:
      WEBHOOK_URL: "https://n8n.example.com/"  # Your actual external URL

Then restart:

docker compose down && docker compose up -d

After restarting, deactivate and reactivate each webhook-triggered workflow to re-register the endpoints.

Method 2: Verify Workflow Activation

A workflow that works in manual test mode but doesn’t trigger in production is likely not activated.

  1. Open the workflow in the n8n editor
  2. Check the toggle in the top-right corner — it should be ON (green)
  3. If it’s off, toggle it on
  4. Check for errors — n8n shows a red banner if activation fails

Common activation blockers:

  • Missing credentials: The workflow references a credential that was deleted or hasn’t been set up
  • No trigger node: The workflow has no trigger (webhook, cron, or event) as its first node
  • Invalid cron expression: Schedule triggers with malformed cron syntax won’t activate

Method 3: Fix Timezone for Cron Triggers

n8n defaults to UTC for cron evaluation. If your schedule triggers fire at unexpected times (or not at all because you’re looking at the wrong hour), set the timezone:

services:
  n8n:
    image: n8nio/n8n:2.12.3
    environment:
      GENERIC_TIMEZONE: "America/New_York"    # Your timezone
      TZ: "America/New_York"                  # Container OS timezone

Both variables should match. GENERIC_TIMEZONE controls n8n’s internal scheduling; TZ controls the container’s system clock.

Method 4: Fix Docker Networking

If n8n runs behind a reverse proxy and webhook callbacks can’t reach it:

  1. Check port mapping: Ensure the port in your docker-compose.yml matches what your reverse proxy forwards to:
services:
  n8n:
    ports:
      - "5678:5678"    # Must match reverse proxy upstream
  1. Check reverse proxy config: In Nginx Proxy Manager, verify the proxy host forwards to n8n:5678 (if on the same Docker network) or host-ip:5678 (if not).

  2. Test webhook reachability from outside:

curl -v https://n8n.example.com/webhook-test/your-webhook-id

If you get a connection refused or timeout, the issue is networking, not n8n.

Method 5: Check Execution Settings

In n8n Settings → Workflow Settings, verify:

  • Timeout: Default is no timeout. If set too low, long workflows get killed
  • Retry on failure: Enable for unreliable external APIs
  • Save execution data: If disabled, executions run but you can’t see them in the history (this creates the illusion of “not executing”)

In your Docker environment:

environment:
  EXECUTIONS_DATA_SAVE_ON_SUCCESS: "all"    # Save successful executions
  EXECUTIONS_DATA_SAVE_ON_ERROR: "all"      # Save failed executions
  EXECUTIONS_DATA_MAX_AGE: "336"            # Hours to keep (14 days)

Prevention

PracticeWhy
Set WEBHOOK_URL correctly from the startMost common cause of webhook failures
Match GENERIC_TIMEZONE and TZPrevents cron scheduling surprises
Test webhooks with curl after setupCatches networking issues early
Enable execution data savingMakes debugging possible
Monitor n8n logsCatches registration errors immediately

Monitor n8n with docker logs -f n8n after activating workflows to catch registration errors in real time.

Comments