XBSTACK
Xiaobai

Xiaobai

Developer · Builder

Building AI engineering systems, developer tools and long-term digital assets at XBSTACK.

About Xiaobai & XBSTACK →
n8n 2.36.6 zombie execution A/B showing finished false status running when successful execution saving is disabled

n8n Execution Stuck Running After Success: Zombie Execution When Successful Runs Are Not Saved

n8n execution stuck running after success? On 2.36.6, a webhook can return 200 while execution_entity stays running. This A/B reproduces the cause and workaround.

Published · 2026-08-295 min readXBSTACK
#n8n#Workflow#Troubleshooting#Zombie Execution#Self-hosted#Docker#SQLite

If your n8n production webhook already returned HTTP 200 and the business action finished, but the corresponding database row still looks like this long afterward:

finished = false
status = running
stoppedAt = NULL

do not assume the node is still executing or the Task Runner is hung. I reproduced a much narrower failure on the official n8nio/n8n:2.36.6 image: same instance, same SQLite database, same three-node Webhook → Set → No Operation workflow, with only Save successful production executions changed.

With Do not Save (saveDataSuccessExecution=none), the production webhook returned 200 but execution_entity kept finished=0 / status=running / stoppedAt=NULL. In the control, changing only the setting to Save (all) produced finished=1 / status=success and a normal stoppedAt timestamp.

n8n’s upstream issue #37040, opened on August 25, 2026, reports the same symptom on n8n 2.36.6 + PostgreSQL + regular execution mode. At publication time the issue is still open, marked status:in-linear, with no linked fix PR. This is therefore not enough evidence to blame SQLite or PostgreSQL alone, and it is also not evidence that every execution stuck in running is this bug.

A successful HTTP response and completed workflow can still contradict an execution row that remains running

Check whether you have this specific zombie execution

The confusing part is that the workflow looks complete from the caller’s perspective while the database says otherwise. This article is a good match when most of these conditions are true:

  1. It is a production execution such as a production Webhook.
  2. The webhook or business action already succeeded rather than a node actually blocking.
  3. Save successful production executions is set to Do not Save.
  4. The matching execution_entity row shows finished=false, status=running, and an empty stoppedAt.
  5. Similar successful runs keep accumulating instead of eventually closing as success.

If runData is empty, the node never starts, a Code node reports Task request timed out, a Schedule Trigger is not dispatching, or a container restart is required before work continues, the search phrase may still be “n8n stuck running” but the failure can be different. Upstream issue #36886, for example, describes a genuinely stuck execution path. The case here is specifically completed work whose persisted final state was not closed.

Minimal reproduction: change one setting

I deliberately avoided AI Agent nodes, external APIs, database nodes, and complex expressions. Both workflows are only:

Production Webhook
      ↓
Set { ok: true }
      ↓
No Operation

They use the same n8n 2.36.6 instance, database and nodes. The only intended variable is:

experiment: saveDataSuccessExecution = none
control:    saveDataSuccessExecution = all

Both production webhooks returned:

HTTP/1.1 200 OK

{"message":"Workflow was started"}

I then queried SQLite directly:

SELECT id,
       workflowId,
       finished,
       status,
       mode,
       startedAt,
       stoppedAt,
       storedAt,
       jsonSizeBytes
FROM execution_entity
ORDER BY id DESC;

The result:

workflowId                 finished  status   stoppedAt
-------------------------  --------  -------  -----------------------
xbstackZombieControl2366   1         success  2026-08-29 02:10:30.826
xbstackZombie2366          0         running  NULL

n8n 2.36.6 A/B comparison between Save Successful Executions none and all

That control matters because it removes several common confounders: the webhook itself did not fail, the workflow was not complex, and the two cases did not use different n8n versions. On this n8n 2.36.6 SQLite instance, changing successful execution storage from none to all also changed whether the execution row finalized correctly.

The importable workflow JSON files, exact SQL output, and version matrix are published in the GitHub reproduction asset.

Why this matters beyond a stale UI status

If only the browser UI failed to refresh, the operational impact would be limited. Here the persisted row itself remains:

finished = false
status = running
stoppedAt = NULL

That can distort or complicate:

  • counts of genuinely running executions;
  • execution-history and monitoring queries;
  • pruning and retention behavior around abnormal rows;
  • operational scripts that check for unfinished work;
  • database growth and execution-history governance.

So if business actions succeed while running rows accumulate, refreshing the UI is not an adequate diagnosis.

The safest workaround I can verify today

As of August 29, 2026, issue #37040 has no public fix PR, so I will not claim that a particular upgrade solves it. The only mitigation directly verified by this A/B is:

If your privacy, retention, and storage policy permits it, temporarily change Save successful production executions from Do not Save to Save, and control retention with execution pruning.

This is evidence-based rather than speculative: the saveDataSuccessExecution=all control on the same three-node production webhook finalized correctly.

It is not a permanent fix. Saving successful executions increases stored execution data, so evaluate retention windows, pruning configuration, and whether workflow data can contain sensitive business or user content.

n8n zombie execution state mismatch and the current troubleshooting and mitigation sequence

Do not use a direct database UPDATE as the generic fix

A table full of rows like:

finished = 0
status = running
stoppedAt = NULL

makes a bulk UPDATE execution_entity tempting. I do not recommend that as a generic repair.

execution_entity is not just a display table. Execution state can interact with execution data, pruning, insights, metadata, and lifecycle logic. Changing running to success does not prove related state is consistent.

If production already contains many zombie rows, a safer order is:

  1. take a complete database backup;
  2. verify that the save-none condition matches this reproduction;
  3. reproduce it in an isolated environment;
  4. enable successful execution saving temporarily and confirm new executions close normally;
  5. wait for upstream cleanup guidance, or design a version-specific migration only after understanding the exact schema and related rows.

PostgreSQL versus SQLite: the evidence boundary

The upstream #37040 reporter used PostgreSQL. This XBSTACK A/B used SQLite and produced the same:

finished = false
status = running
stoppedAt = NULL

That means the evidence does not support calling this PostgreSQL-specific. However, I did not complete an independent local PostgreSQL reproduction because Docker Hub repeatedly timed out while pulling postgres:16-alpine.

The defensible summary is therefore:

  • PostgreSQL: real upstream report in n8n issue #37040;
  • SQLite: independent XBSTACK A/B reproduction;
  • shared condition: n8n 2.36.6 with successful execution saving disabled;
  • root cause: not publicly finalized by the upstream project yet.

How to retest once a fix is released

When #37040 gains a linked PR or a release explicitly fixes it, do not rely on the changelog alone. Re-run the same minimal fixture:

Webhook → Set → No Operation
saveDataSuccessExecution = none

and verify that successful runs no longer leave:

finished=0 / status=running / stoppedAt=NULL

Then re-run the saveDataSuccessExecution=all control to make sure normal saved successful executions still finalize correctly.

The public reproduction keeps both workflow JSON fixtures and the original result so future releases can be compared against the same test rather than a moving target.

Bottom line

If an n8n production workflow has already succeeded but the execution remains running with finished=false and stoppedAt=NULL, check whether Save successful production executions is set to Do not Save before diagnosing a genuinely hung node.

On n8n 2.36.6, the SQLite A/B here and the upstream PostgreSQL report point to the same execution-finalization boundary. There is no public final fix yet. The most defensible current mitigation is to evaluate enabling successful execution saving plus pruning, rather than bulk-editing execution states in the database.

Related troubleshooting:

Topic path / AI workflows

Continue through the production automation path

The workflow hub connects self-hosting, queue mode, webhooks, retries, observability and n8n implementation cases into one production-oriented learning path.

More to Explore

Topic hub →
n8n Code Node 'Task request timed out': Fix 'Not Matched to a Runner'n8n Code Node reports Task request timed out / not matched to a runner. Reproduce it on 2.37.1, distinguish runner wait from JavaScript timeout; troubleshoot Cloud vs self-hosted.Self-Hosted n8n Deployment Guide: Docker Compose, Postgres, VPS, and NAS Production BaselineHow to deploy self-hosted n8n for stability? This article provides a production baseline using Docker Compose + Postgres, covering version pinning, N8N_ENCRYPTION_KEY, WEBHOOK_URLn8n 2.35.3 $json Array Methods Return null: Reproduction and WorkaroundIn n8n 2.35.3 Edit Fields, $json.data.sort(), splice(), fill() and copyWithin() return null. Compare official 2.34.5 vs 2.35.3 Docker runs and tested copy-first workarounds.n8n HTTP Request Returns _readableState Instead of JSON: Raw Body Response Stream Fixn8n HTTP Request can return _readableState instead of JSON with Raw Body + explicit JSON Response. See the four-case repro, source path and tested workarounds.

AI Engineering Weekly

Production changes, real failures, experiments and new XBSTACK assets.

Comments & evidence

DISCUSSION

Questions, verification and corrections

Sign in to comment. Every new comment is reviewed before publication; while pending, it is visible only to you and the administrator.

Sign-in required Reviewed before public
Loading the discussion…