n8n errors that stay silent
The green checkmark in n8n is a lie. It only says: the workflow ran through, no node threw an exception. It does not say that what was supposed to happen actually happened. That gap has caught me twice in the last few weeks – and both times it wasn't a broken workflow, but one that dutifully reported "success".
The HTTP request that returned 200 – and still failed
The first case was a webhook that sends data to an external API. The HTTP Request node got a response with status 200. n8n was happy, the workflow continued, the next nodes processed the response. Except: the API had included a JSON field "success": false in that 200 response. The actual job had failed, but the status code was still 200, because the server had correctly received the request.
That's the classic: HTTP status code ≠ business success. A 200 only means "I understood your request", not "I did what you wanted". If you only look at the status code, you happily process error messages as if they were results.
The fix was an IF node right after the request, checking the response JSON:
{{ $json.success === true }}
Only when that holds does the workflow continue. Otherwise it runs into its own error path – and that one sends me a message instead of silently disappearing.
The node that simply found nothing
The second case was subtler. A workflow reads from a database, filters by a criterion, and processes the hits. One day there were no hits. No error, no exception – the filter node just returned an empty list, and the downstream nodes ran with zero items. The workflow ended "successfully", except nothing had happened.
That's the second classic: empty results are not an error. n8n doesn't distinguish between "there is nothing to do" and "something went wrong". Both look identical to the engine: an empty list.
Here a check on the number of items helps:
{{ $json.length > 0 }}
Or, when working with a single item, an explicit check whether the expected field exists at all. If it's missing, that's a signal – not a reason to silently carry on.
What I took away from it
Three rules I now apply to every workflow that is supposed to do something:
- Never trust the status code alone. Check the response JSON for a success field if the API provides one. Many APIs do – you just have to read it.
- Handle empty results explicitly. An IF node with
length > 0costs nothing and prevents a workflow from ending "successfully" while having done nothing. - Build an error path that is loud. Instead of silently swallowing errors, I send myself a message. A workflow that fails must not be quiet – otherwise I only notice days later that nothing has arrived for a week.
The core is simple: A workflow that does nothing is worse than one that crashes. The crash stands out. The silent nothing doesn't.
And that's exactly why the green checkmark in n8n is only half the truth. It confirms that the code ran. Whether it did the right thing, I have to check myself – with one more IF node and an error path that speaks up.