Fast answer

Check execution state, then decide whether you need a monitor or a guard

The fastest way to see whether an n8n workflow is already running is its workflow-level Executions tab: filter for Running and, when relevant, Waiting. For an automated check, query execution metadata for the workflow ID and active statuses, then exclude the execution performing the check. This proves what n8n reports at that moment. It does not create an atomic lock: another run can start immediately after the query. If the goal is to prevent overlap, use a durable claim or concurrency design instead of treating a status lookup as a lock.

Verification recordDocumentation5 August 2026n8n

What counts as “already running”?

Teams use the phrase for several different states. Choose the state that represents a conflict for the workflow’s real action before building a filter.

StateWhat it means operationallyUsually blocks a new run?
RunningExecution is actively progressing through nodesYes for a single-flight workflow
WaitingExecution is paused until a wait condition or resume timeOnly if it still owns the same business resource
Queued/newExecution is accepted but has not started processing capacity yetOften yes when counting pending work
Success/error/canceled/crashedExecution is no longer activeNo, though recovery may still be required

A workflow that waits three days for approval should not necessarily block every new submission for three days. Conversely, a queue of accepted executions may represent pending duplicates even though only one is actively running. Define the protected scope too: “any execution of this workflow,” “any execution for this customer,” and “any execution for this order ID” are different questions.

If the symptom is simply that two scheduled windows overlap, the evidence and fix ladder are covered in How to Stop Overlapping n8n Workflow Executions. This guide focuses on how to inspect or automate the running-state decision.

Manual check in the workflow Executions tab

Open the workflow and select its Executions tab. n8n provides workflow-level and instance-level execution lists; use the workflow-level view when you need to isolate one workflow. Filter the list by active status and inspect the start time, duration, mode, and execution ID.

  1. 01

    Open the affected workflow

    Use the workflow whose ID and published version produce the action. A similarly named copy is a separate workflow and will have separate execution records.

  2. 02

    Filter active statuses

    Select Running. Add Waiting when paused executions still hold the resource you want to protect. On n8n Cloud, the executions view also exposes active execution and concurrency information for the plan.

  3. 03

    Compare timestamps

    An older execution with no stop time confirms active or stale work. Two start times close together confirm separate executions; duplicate items inside one execution are a different data-shape problem.

  4. 04

    Inspect the last completed node

    Open the active execution and identify whether it is doing work, waiting by design, retrying, or stuck at an external call. Do not stop it until you know whether termination can leave partial side effects.

Automated execution-status check

n8n’s authenticated API can list executions, and current documentation defines execution permissions for listing and reading execution metadata. Use the public API reference available on your instance to confirm the endpoint and parameters for that version. The logical query is:

workflowId = the protected workflow
status = running
limit = a small bounded result set

If waiting work should also count, query waiting as a separate active state or use the documented multi-status capability available to your interface. Request metadata only; payload data is unnecessary for a running-state decision and may contain sensitive information.

The self-match problem

When the workflow checks its own executions after it has started, the query may correctly return the current execution. Exclude the current ID, available in expressions through $execution.id, before deciding that an older run exists. In pseudocode:

conflicts = executions.filter(execution =>
  execution.id !== $execution.id &&
  ["running", "waiting"].includes(execution.status)
)

Do not paste an API key into a Code node or article expression. Store it in an n8n credential used by the HTTP Request node, grant only the scopes needed to list execution metadata, and avoid logging authorization headers. If the checker runs in a separate monitoring workflow, it does not need to exclude itself unless it queries its own workflow ID.

Filter by business scope, not only workflow ID

An execution-list query tells you that the workflow is active, but execution metadata alone may not tell you which customer, file, order, or tenant it is processing. If independent keys may run safely in parallel, a workflow-wide check is too broad. Maintain a small lock or job table keyed by the protected business identifier instead of fetching full execution payloads just to infer scope.

Why “check, then run” can still overlap

Suppose executions A and B start within milliseconds. A queries active executions before B appears in the result. B performs the same query before A’s status is visible or before either writes a guard. Both see no conflicting older run and both continue. Even if the status API is perfectly accurate, the decision and the protected action are separate operations with a gap between them.

MechanismWhat it answersWhat it cannot guarantee
Executions UIWhat operators can currently seeThat a new run cannot start after inspection
Execution API queryWhich matching execution records are active at query timeMutual exclusion between simultaneous callers
Concurrency limitHow much production work can run at oncePer-event deduplication or exactly-once side effects
Atomic keyed claimWhich execution owns a specific protected scopeAutomatic recovery after an unknown external outcome

This is why a status query is excellent for dashboards, operator alerts, conditional notifications, and low-risk best-effort skips, but insufficient by itself for charging a card or provisioning the same account once.

Safer guard patterns

Pattern A: widen the interval or bound runtime

For a scheduled batch where every run processes the same global resource, the simplest correction may be a longer schedule interval, smaller pages, per-node timeouts, or a workflow timeout. This reduces overlap but does not defend against manual starts, retries, or unusually slow runs. Use the dedicated Schedule Trigger checklist to rule out duplicate schedules first.

Pattern B: durable workflow-wide lease

Create one lock record for the workflow, with an owner execution ID and an expiry or review timestamp. The acquisition must be atomic: only one execution can create or transition the record into the owned state. Release it on confirmed completion. For expired leases, reconcile the previous action before allowing a replacement owner; time passing does not prove the old side effect failed.

Pattern C: keyed claim per customer or event

If different customers can safely run together, key the claim by customer, order, file, or event instead of workflow ID. This preserves useful concurrency while preventing the specific collision that matters. The reusable architecture in How to Prevent Duplicate Webhook Executions in n8n applies the same principle to webhook event IDs.

Pattern D: instance concurrency control

n8n Cloud applies plan-based concurrency limits to production executions in regular mode; executions beyond the limit queue and later run in FIFO order. Self-hosted concurrency controls and queue-mode worker concurrency manage capacity differently. These controls protect instance stability and throughput. They are not a substitute for a business-key lock: queued duplicates still run later unless the workflow identifies them.

Verification checklist

  • The workflow-level Executions tab shows the expected active status and execution ID while the test run is paused at a controlled Wait node.
  • The automated query returns that test execution when filtering by the correct workflow ID and status.
  • A self-check excludes $execution.id and does not block itself merely because it is running.
  • Your definition of active explicitly includes or excludes waiting and queued work.
  • Two near-simultaneous test starts cannot both acquire the same durable lock or business key.
  • A different business key can proceed concurrently when that is intended.
  • Stopping or crashing the owner produces a documented recovery state rather than leaving an invisible permanent lock.
  • API credentials use the minimum required permission and execution payload data is not retained unnecessarily.

FAQs

Can an IF node check whether another execution is running?

An IF node can branch on data returned by an earlier API or datastore lookup, but it does not independently inspect all n8n executions. More importantly, the branch is only as race-safe as the operation that produced the data.

Should Waiting executions count as running?

Count them when they still own the same protected resource or when a second run would create a conflict. Exclude them when each waiting execution represents an independent item, such as separate approvals.

Does setting concurrency to one solve the problem?

It can serialize a defined execution pool, depending on deployment and feature scope, but serialization is not deduplication. Two duplicate events can still execute one after the other and repeat the side effect.

Sources and change log

Change log

Initial publication, verified against current n8n documentation on 5 August 2026. This article documents observation and guard design; it does not claim a controlled race test on a specific n8n deployment.