n8n logon8n Automation Hub
Incident report

A Daily n8n Workflow Went Green in 12 Seconds and Produced No Episode

Incident report · n8n workflow · September 19, 2026 · Updated October 13, 2026

The daily run of a news-video workflow finished with status success after 12 seconds. The day before, the same workflow had taken about half an hour. There was no error, no alert, and no episode for that date in the render queue.

Workflow at a glance
  1. The workflow picks headlines, asks Groq for a JSON script containing a list of segments, splits the list into one item per segment, then renders and queues an episode
  2. On the failing run the Groq call looked healthy: finish reason stop and about 1,200 completion tokens against a 3,000 limit
  3. The returned JSON was malformed partway through: a strict parser stopped near character 3,690 of 5,367
  4. The parse Code node's catch block substituted a default title and an empty segments list, so the Split node received nothing and emitted zero items
  5. In n8n, zero output items is not an error. No downstream node ran and the execution ended green

Reading the execution node by node

The execution list only said success. Opening the run and stepping through it told the real story. The Groq node had returned a full script with an episode title, a description and a list of segments. The node after it, which parses that text, output a generic default title, no description text and an empty segments array. The Split Segments node after that output no items, and nothing later on the graph executed at all.

It wasn't truncation

The first instinct with broken LLM JSON is that the output was cut off, and the fix is a higher token limit. Here the response finished with finish_reason: stop and used about 1,200 of the 3,000 tokens allowed. The model finished its answer; it just wrote a syntax error partway through. Feeding the same text to a strict parser failed with a delimiter error near character 3,690. Raising the limit would have changed nothing.

Two behaviours that add up to a silent success

What I'd change

The publisher workflow two hours later found no ready episode and exited with a "no ready episode" message, which is also a success. Two workflows behaved correctly around a hole neither of them could see. For other ways a run can report success while doing nothing right, see four ways an n8n workflow can report success.

A parse node that fails loudly

This is the shape of the parse step I now use for LLM JSON in a workflow where an empty result is never valid. It throws on bad JSON and on a structurally valid but empty result, so the execution turns red and the error workflow fires:

// Code node "Parse Script" (Run Once for All Items)
const raw = $input.first().json.choices?.[0]?.message?.content ?? '';
let data;
try {
  data = JSON.parse(raw.replace(/^```(json)?|```$/g, '').trim());
} catch (e) {
  throw new Error(`LLM returned invalid JSON (${raw.length} chars): ${e.message}`);
}
if (!Array.isArray(data.segments) || data.segments.length === 0) {
  throw new Error('LLM JSON parsed but contains no segments');
}
return [{ json: data }];

If you want a retry before giving up, put the retry on the LLM node (Settings, Retry On Fail) and connect the parse node's error output to a second LLM call, rather than catching the error and returning a default.

Detecting runs that are suspiciously short

Duration turned out to be the clearest symptom. A few ways to use it:

The queue audit is the one I'd add first. It catches this bug, a skipped schedule and a Creator that crashed before its first node, with one check.

Why "zero items" is not an error in n8n

n8n treats an empty item list as "nothing to do". Every node after it is skipped, and the execution ends successfully. That is the correct behaviour for many workflows: a poller that finds no new emails, or a filter that removes everything, should not page anyone. It only becomes a problem when the empty list was produced by a fallback that hid a failure. The fix is not to change how n8n treats zero items, but to make sure that zero items only ever means "legitimately nothing to do".

Frequently asked questions

Why did the n8n execution show success when nothing was produced?

The parse node's catch block returned an empty segments list instead of failing. The next node emitted zero items, n8n skipped everything after it, and an execution with no errors counts as a success.

Was the LLM response cut off by the token limit?

No. The response ended with finish_reason stop and used about 1,200 of 3,000 tokens. The model wrote complete but syntactically invalid JSON, so raising the limit would not have helped.

Should a catch block in a Code node return default values?

Only when a default is a valid outcome. If an empty result is never acceptable, throw an error so the run fails visibly and the error workflow can alert you.

What is the simplest guard against silent empty runs?

A separate check that alerts when the expected output, such as today's queue row, does not exist. It catches this and several other failure modes at once.

A green workflow that didn't actually do the work?

I add the checks that turn quiet no-ops into alerts you'll actually see.