I built NoCrash to catch the n8n runs that stay green but did nothing (missed runs, empty success)

Quick disclosure first: I am the founder of NoCrash (n8n reliability), so this is my own tool. I am sharing it here because it is built around an n8n problem that kept biting me, and I think the approach is worth talking through even if you never touch the product.

The problem is that a green execution is not proof the work actually happened. A workflow can finish successfully and still have done nothing useful. The schedule quietly stops firing while the workflow stays Active and the log just shows nothing. A token expires and the run comes back as an empty success. A node trips Continue-on-Fail, the run still closes green, and the thing you cared about never ran. You usually find out when the client does, which is the worst time to find out.

So I built something that watches the outcome from outside the run instead of trusting the green checkmark. The two catches that matter most: first, missed runs. It learns each workflow’s own cadence from its history and tells you when an expected run did not happen, with a grace band so a slightly late run is not a false alarm. The dashboard still says Active, the log is empty, and you still get told. Second, the Continue-on-Fail case. It reads the error signal n8n itself records, so even when the overall execution comes back green, if a node trapped an error it surfaces that with the node name in plain English. It does not guess from empty output, because plenty of nodes return nothing on purpose.

On the trust side, since people always ask: it connects with a read-only API token (workflow:list and execution:list only), stores metadata rather than your payloads, and never touches workflow definitions, credentials or env vars.

If you want to see the idea without signing up, there is a free grader that scores a workflow JSON for these failure modes: n8n Workflow Grader — is your workflow safe to run? | NoCrash . Happy to answer anything about how it works under the hood.

How is everyone else catching the silent ones today, or are you mostly finding out after the fact?

2 „Gefällt mir“

Welcome @dima_automation!

The “Continue-on-Fail giving a green run” case is one of the trickiest to catch because n8n’s built-in error workflow only fires on actual execution failures, not on empty outputs or silently failed nodes. Watching from outside the run is the right call for this.

One thing that would pair well with this: for the missed-run detection, does NoCrash also account for workflows that were manually deactivated mid-period? That edge case often trips up schedule monitors - a workflow goes dark intentionally but the alert fires anyway.

2 „Gefällt mir“

Thanks for the welcome, and you said the Continue-on-Fail case better than I did. On the deactivated case, good catch, that false alarm is exactly why the missed-run check only runs on scheduled watches that are not paused. If you take one down on purpose, pausing the watch drops it out of missed-run so it stays quiet. And the miss only fires for a scheduled flow that is still meant to be running but the expected run did not happen, against a cadence learned from that flow’s own history with a grace band, so a slightly late run is not flagged. Event and webhook flows are left out of missed-run entirely and watched on outcome instead. There is a fuller write-up of what it catches in the docs if you want to dig: Developer docs — NoCrash . Curious what other edge cases you have run into, you clearly look at this from the operator side.

1 „Gefällt mir“

Two patterns that approximate this from inside n8n if you want to start without adding another service.

Missed-run detection: set up a monitoring workflow on a short schedule (every 5-15 minutes). It polls n8n’s own REST API – GET /api/v1/executions?workflowId=X&status=success&limit=1 – for each workflow you want to watch. Capture the last success timestamp, compare it to the expected schedule interval plus a tolerance, and fire an alert if it is overdue. Keep the watch list in a Sheets row (workflow ID, expected interval in minutes, last-alerted-at) so you can add or pause watches without touching the monitoring workflow itself.

Empty-but-green detection: at any node where the output should always have at least one item (a lead list, a Sheets row, an API response), add an IF node immediately after that checks items.length === 0. Route the zero-item path to a Stop And Error node with a descriptive message, or to your Error Workflow. This turns a silent empty run into a visible failure before the workflow reports green.

The two cases you described need different tools. The output guard catches the Continue-on-Fail / empty-success case from inside the execution. The schedule watcher catches the missed-trigger case from outside it. Both together cover most of what a reliability layer needs to see without requiring the execution log to know something went wrong.

Where a dedicated tool like NoCrash adds value over this is the maintenance overhead: the DIY version means you manage the watch list, handle your own alert routing, and keep the monitoring workflow itself reliable. Worth the tradeoff to start; worth re-evaluating when the watch list gets long.

1 „Gefällt mir“

This is a really clean breakdown, and both patterns are exactly the right shape, the output guard for the empty-success case inside the run, the schedule watcher for the missed-trigger case outside it. Anyone reading this could start here today.

Your tradeoff framing is fair, and I would add one wrinkle to it. The DIY schedule watcher is itself an n8n workflow, so it can fail the same silent way it is meant to catch. Its own schedule can stop, its Sheets row can go stale, and now the thing watching your workflows quietly is not watching. Who watches the watcher is a real question once it is load-bearing, and it is less about features than about where the check runs, inside the same environment it is checking or outside it. Genuinely though, for a short watch list the DIY version is the right call, no argument from me there.