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:
| Cause | Symptoms | Frequency |
|---|---|---|
Wrong WEBHOOK_URL | Webhooks return 404, external triggers fail | Very common |
| Workflow not activated | Manual tests work, production doesn’t | Common |
| Timezone mismatch | Cron triggers fire at wrong times or not at all | Common |
| Docker networking | Webhook callbacks can’t reach n8n container | Common |
| Execution mode issues | Workflows run once then stop | Less 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.
- Open the workflow in the n8n editor
- Check the toggle in the top-right corner — it should be ON (green)
- If it’s off, toggle it on
- 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:
- Check port mapping: Ensure the port in your
docker-compose.ymlmatches what your reverse proxy forwards to:
services:
n8n:
ports:
- "5678:5678" # Must match reverse proxy upstream
-
Check reverse proxy config: In Nginx Proxy Manager, verify the proxy host forwards to
n8n:5678(if on the same Docker network) orhost-ip:5678(if not). -
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
| Practice | Why |
|---|---|
Set WEBHOOK_URL correctly from the start | Most common cause of webhook failures |
Match GENERIC_TIMEZONE and TZ | Prevents cron scheduling surprises |
Test webhooks with curl after setup | Catches networking issues early |
| Enable execution data saving | Makes debugging possible |
| Monitor n8n logs | Catches registration errors immediately |
Monitor n8n with docker logs -f n8n after activating workflows to catch registration errors in real time.
Related
Get self-hosting tips in your inbox
Get the Docker Compose configs, hardware picks, and setup shortcuts we don't put in articles. Weekly. No spam.
Comments