n8n workflow succeeded but did nothing: catching runs with 0 items
When a node returns nothing, n8n stops the workflow there and calls the execution a success. Here is how to turn an empty run into one you hear about.
The executions list says Success, the run took two seconds, and the spreadsheet that should have 400 new rows has none. Nothing errored, because as far as n8n is concerned nothing went wrong: a node produced no items, and n8n stopped there.
Why an empty run counts as a success
n8n passes items from node to node, and a node that outputs no items ends the run at that node. The editor says so in the node's output panel: n8n stops executing the workflow when a node has no output data. No error is raised, so the execution is a success, the error workflow does not run, and the run looks the same in the executions list as a day with genuinely nothing to do.
The usual ways to get there:
- An API that answers with nothing. The request succeeds with an empty list, because a query points at the wrong date, the account can see less than it used to, or the service returned nothing during an incident of its own.
- A Filter or If node that drops everything. A condition that compares against today's date in the wrong timezone, or against a value whose spelling changed upstream, keeps no items.
- A renamed field. The source renames
statustostate, the expression{{ $json.status }}is empty on every item, and a condition on it matches nothing. The workflow did not change; the data under it did. - A lookup that finds no rows. A Google Sheets or database lookup whose match value no longer exists returns nothing, and the nodes after it never run.
Make an empty result fail inside n8n
The fix in n8n is to turn "no items" into an error at the node where it happens:
- Open the node that may come back empty, such as the HTTP Request or the Filter, and turn on Settings → Always Output Data. When the node has nothing, it passes on a single empty item instead of ending the run.
- Add an If node after it. Set the condition's type to Object and the operation to is empty, on
{{ $json }}. The empty item goes to the true branch; real items go to the false branch and on through the workflow as before. - On the true branch, add a Stop and Error node with a message that says what was missing, such as
Fetched 0 orders. The execution fails, shows as failed in the list, and runs the workflow's error workflow.
Two details catch people out. With Always Output Data on, an empty result reaches the next node as one item, not zero, so a check on {{ $input.all().length }} reads 1 on exactly the run you are trying to catch: test whether the item is empty instead. And n8n warns that Always Output Data on an If node can cause an infinite loop, so put it on the node whose result you are checking, not on the If.
A count is still the right check for a run that is too small rather than empty. An If node on {{ $input.all().length }} with Number → is less than catches the night that handled 3 orders instead of the usual 400, as long as at least one item reaches it.
Catch empty runs from outside n8n as well
Stop and Error works where you remember to add it, and it reports through an error workflow on the same instance. A heartbeat that is told how many items each run handled catches the empty run from outside. Put a ping as the last node of the workflow:
- A run that stops early because a node returned nothing never reaches the ping. To Vivere that is a missing run, and the monitor goes Down when its grace runs out, exactly as if the workflow had not run at all.
- With the Vivere node, Ping → Success records how many items reached it on every run, and counts the single empty item that Always Output Data passes on as 0. Turn on Fail If 0 Items and a run with 0 items is reported as failed, so the monitor goes Down and alerts at once instead of waiting for the deadline.
- With an HTTP Request node, add a query parameter
itemsset to{{ $input.all().length }}and turn on Settings → Execute Once so it pings once per run. Vivere records the count, but it does not alert on a count by itself. To be alerted on an empty run, connect the If node's true branch from the section above to a second HTTP Request node pointed athttps://vivere.dev/p/<your-monitor-id>/fail, in place of Stop and Error or before it.
Either way the monitor's list of runs shows the item count for every run, so a run that handled 3 items where it usually handles 400 is easy to spot. Vivere alerts on a missing ping, on a failure ping, and on a run whose reported cost passes the limit you set; it does not alert on a low count, so keep the If node for that. The n8n guide has both setups step by step, and Vivere's free plan covers 25 monitors.
Common questions
Why does n8n show success when the workflow did nothing?
Because nothing failed. When a node outputs no items, n8n stops executing the workflow at that node, which its editor describes as the default behaviour, and an execution that stops without an error is a success. A Filter that matched nothing or a lookup that found no rows ends the run exactly like a day with nothing to do.
What does Always Output Data do in n8n?
It makes a node pass on a single empty item when it would otherwise output nothing, so the nodes after it still run. That is what lets a later If node notice the empty result. Turn it on only on the node whose empty result you want to catch, and take care with it on If nodes, where n8n warns it can cause an infinite loop.
How do I make an n8n workflow fail on purpose?
Add a Stop and Error node where the workflow should fail, with an error message such as "Fetched 0 rows". The execution then fails like any other error, shows as failed in the executions list, and runs the workflow's error workflow if one is set.
Find out without looking
Vivere watches for the ping that does not arrive. Add one line to the job, pick where alerts should land, and you hear about the run that never happened.
Start free Read the quickstart
25 monitors, a status page, email and webhook alerts. No card.
Last reviewed October 2026.
Related
- How to get an alert when an n8n workflow doesn't run — n8n tells you when a workflow fails, not when it does not run: an unpublished workflow, a schedule lost to a restart, a webhook nobody calls, an instance that is down. What n8n offers on its own, where each part stops, and the dead man's switch that covers the rest.
- n8n Google credential expires every 7 days: why, and the fix — Your n8n Gmail, Sheets or Drive credential stops working every week. Why Google expires the refresh token after seven days while the app is in Testing, how to publish it, when verification applies, service accounts, and how to hear about it before the workflows that depend on it go quiet.
- How to know if your backup actually ran — Backups fail quietly. How to verify a backup ran, why exit code zero is not proof, what to check about size and restore, and how to be told the night it does not happen.