One thing I learned after deploying several production n8n workflows: errors don’t always announce themselves. They just disappear silently, and you find out when a client asks why their leads stopped coming in.
Here’s the pattern I now use on every workflow before it goes live.
The core setup
Every workflow gets an Error Trigger node connected to a notification step (Telegram or email). This catches any unhandled error and sends:
- The workflow name
- The node where it failed
- The error message
- A timestamp
Basic example using Telegram:
{{ $workflow.name }} failed at {{ $node.name }}
Error: {{ $json.error.message }}
Time: {{ $now.toISO() }}
Beyond the Error Trigger
For HTTP requests and API calls, I also wrap critical nodes with a Try/Catch pattern:
- Make the HTTP request
- IF node checks the response status code
- If it’s not 200/201, route to an error handler that logs + notifies
This catches failures that don’t throw errors in n8n’s sense - like a 400 response that n8n doesn’t treat as an error by default.
For long-running workflows
If a workflow processes items in a loop, I log progress to a database (Postgres or Supabase) at key checkpoints. That way, if it fails mid-run, I know exactly where it stopped and can resume from that point instead of reprocessing everything from scratch.
Nothing groundbreaking, but I’ve been surprised how many shared workflows I’ve seen in the community that have zero error handling. Hope this helps someone avoid that “wait, when did this stop working?” moment.
What does your error monitoring setup look like? Curious what others are doing.
Nguyen Thieu Toan (Jay Nguyen) - n8n Verified Creator
All my free workflow templates: nguyenthieutoan | n8n Creator