The Error Workflow only fires when a run starts and fails. Two other cases hurt more because nothing goes red:
- the workflow stops running (schedule stopped, workflow unpublished, webhook provider gave up), and
- the run goes green with 0 items: the API returned an empty array, a filter dropped everything, and n8n still calls it Success.
This is one scheduled workflow that checks all of that and sends one Slack message (or Discord) per check, only when there’s something new. You don’t edit the workflows you watch.
What it reports, every 15 minutes:
- any workflow on the instance with a failed or crashed run since the last check (plus runs stuck in “running” longer than you allow)
- a workflow you list with no successful run in longer than you allow (e.g. a daily job with nothing in 25 h)
- a workflow you list whose last successful run output 0 items, when you’ve marked 0 as not OK
How the 0-items check works: for each listed workflow it fetches the last successful execution with its data from the n8n API and counts what the last node that ran actually output. When a node returns nothing, n8n stops there and still marks the run green, so that node’s output is the one that matters. Empty items from “Always Output Data” count as 0. For workflows with branches, set countNode to the step that must return data (e.g. “Get new leads”).
Config is one Code node with a list like this:
watched: [
{ workflowId: 'AbC123', maxGapHours: 25, zeroItemsAllowed: false, countNode: '' }, // daily invoice sync
{ workflowId: 'XyZ789', maxGapHours: 2, zeroItemsAllowed: true, countNode: '' }, // lead webhook, quiet nights are fine
{ workflowId: 'Qrs456', maxGapHours: 2, zeroItemsAllowed: false, countNode: 'Get leads' }
]
Setup (about 5 minutes, also in the sticky note):
- Settings → n8n API → create an API key.
- Credentials → New → Header Auth: name
X-N8N-API-KEY, value = your key. Pick it in the three “n8n API” HTTP nodes. - Create a Slack Incoming Webhook. For Discord, use your channel webhook URL with
/slackon the end. - Fill in
baseUrl,slackWebhookUrlandwatchedin the Config node. - On each watched workflow: Workflow settings → Save successful production executions → Save.
- Click Test workflow once to see the digest, then publish/activate it.
Alert noise: a quiet workflow is reported once, then again only after it recovers and goes quiet again (you get a “recovered” line in between). Each 0-item run is reported once. Failures are reported once per execution.
Limits, so nobody’s surprised:
- It runs inside the instance it watches. If n8n is down, so is the watchdog. Pair it with an outside uptime check on
/healthz. - Failures come from the newest 250 executions per check. If more than 250 ran since the last check, the digest says it may have missed some. Run it more often in that case.
- It needs saved successful executions with data. Execution pruning (
EXECUTIONS_DATA_MAX_AGEetc.) can hide old runs, so setmaxGapHoursbelow your retention. - “0 items” means one step’s output was empty. It can’t tell you the data was wrong (bad field, stale record). For that you still need a check on the result itself.
- A manual test run of a watched workflow counts as a success.
- Dedup state is kept in workflow static data, which n8n only saves on active runs. Test runs re-send everything. That’s expected.
- Tested on self-hosted n8n 2.45.7, not on every version. If a node breaks on yours, post your version and I’ll fix it.
Copy this and paste it into a blank canvas (Ctrl/Cmd+V):
Happy to take improvements, especially ideas for “succeeded but the data was wrong”.
Disclosure: I work on FlowWatch, a paid monitor for n8n. This workflow is free, stands alone, and doesn’t need it.