n8n logon8n Automation Hub
Debugging notes

Four Ways an n8n Workflow Can Report Success While Doing Nothing Right

Build breakdown · n8n workflow · August 25, 2026

One daily episode failed to publish, and chasing down why turned into four unrelated bugs in the same workflow, none of which had thrown a visible error before. The common thread: every one of them looked like success from inside n8n's execution log.

Workflow at a glance
  1. A daily episode failed to publish with no obvious error in the execution log
  2. Traced a downstream crash back to an unrelated SSH utility node overwriting the working data
  3. Found the upload itself had been silently rejecting titles over 100 characters
  4. Found the duplicate-story filter had been comparing against an empty list since launch
  5. Found the background-image step had been rendering the same generic scene for unrelated stories
Screenshot of the actual n8n workflow canvas: the full daily news pipeline where all four bugs were found

The actual workflow canvas, straight from my n8n instance.

Bug one: a stub node that quietly erases the data behind it

A no-op utility node earlier in the workflow — meant only to confirm a file had been written over SSH — was returning its own output object instead of passing the real data through. Everything downstream that assumed the previous node's data was still there broke on an undefined value the moment it tried to read from it. The fix was pulling from the actual named upstream node instead of trusting whatever the immediately-previous node happened to output — but the more useful finding was that this exact footgun had already been hit and documented in a comment on a different node in the same workflow. It just hadn't been checked everywhere the same SSH-node pattern repeated.

Bug two: a length limit that only existed in the prompt

The video title comes from an LLM call with an instruction to keep it under 100 characters "if possible." That's not a limit, it's a suggestion, and the upload API doesn't negotiate — a title a few characters over rejected the whole upload with a generic "invalid title" error that didn't say why. Prompt-only constraints on LLM output are not enforcement. I added an actual code-level cap on both the title and the tag string, trimmed at a word boundary, so the platform's real limit can never be violated regardless of what the model decides to generate.

Bug three: dedup that had never actually run

The node responsible for reading the log of already-covered stories — the thing that's supposed to stop the same story from getting covered twice — was a literal stub returning an empty array. It had been like that since the pipeline launched. Every day's dedup check was comparing new stories against nothing, which meant cross-day duplicate protection had silently never worked, not once, the entire time the channel had been live. Wiring it to actually read the log it was already writing to fixed a bug that had been there from day one and never once shown up as an error, because an empty comparison list isn't a crash — it's just wrong.

Bug four: the same background image for unrelated stories

Three same-day segments — a wildfire, a drought summit, and a flood evacuation, three genuinely different stories — all rendered with the same generic sunset-desert image. The image-prompt step used one fixed style template per category, and that template was strong enough to dominate the output regardless of what the actual story was about. Adding random seed variation didn't fix it — the template still won. What worked was replacing the single template per category with several keyword-matched variants, chosen by scanning each segment's actual text for relevant terms, with a fallback that still rotates even without a keyword match.

Why none of these ever threw an error

Every one of these bugs produced a technically valid output — an empty array is valid, a duplicate image is valid, a rejected upload still returns an error the workflow can catch and move past. The execution log had no reason to flag most of it as an actual failure. The only way to catch this class of bug is to actually look at what a workflow produces, not just whether it finished — and to be suspicious of any node whose "success" is a default or a stub rather than something it actually did the work to produce.

Not sure your automation is doing what you think it's doing?

I audit n8n workflows for exactly this — the failures that never throw an error and just quietly ship wrong output.