{"id":"YybYYc430rmZWJPJ","meta":{"instanceId":"workflow-6c423fd8","versionId":"1.0.0","createdAt":"2025-09-29T07:07:44.486625","updatedAt":"2025-09-29T07:07:44.486696","owner":"n8n-user","license":"MIT","category":"automation","status":"active","priority":"high","environment":"production"},"name":"Log errors and avoid sending too many emails","nodes":[{"id":"0e44df4c-00d2-4545-89ae-844a590de369","name":"Error Trigger","type":"n8n-nodes-base.errorTrigger","position":[-1200,90],"parameters":{},"typeVersion":1,"notes":"This errorTrigger node performs automated tasks as part of the workflow."},{"id":"7101542a-5146-4917-a1f2-13686cad197e","name":"Insert Log","type":"n8n-nodes-base.postgres","position":[-980,40],"parameters":{"table":{"__rl":true,"mode":"list","value":"N8Err","cachedResultName":"N8Err"},"schema":{"__rl":true,"mode":"name","value":"p1gq6ljdsam3x1m"},"columns":{"value":{"URL":"{{ $env.BASE_URL }}","json":"={{ JSON.stringify($json) }}","Stack":"={{ $json.execution.error.stack }}","title":"={{ $json.workflow.name }}","Message":"={{ $json.execution.error.message }}","LastNode":"={{ $json.execution.lastNodeExecuted }}","created_at":"={{ $now }}"},"schema":[{"id":"id","type":"number","display":true,"removed":true,"required":false,"displayName":"id","defaultMatch":true,"canBeUsedToMatch":true},{"id":"created_at","type":"dateTime","display":true,"required":false,"displayName":"created_at","defaultMatch":false,"canBeUsedToMatch":true},{"id":"updated_at","type":"dateTime","display":true,"removed":true,"required":false,"displayName":"updated_at","defaultMatch":false,"canBeUsedToMatch":true},{"id":"created_by","type":"string","display":true,"removed":true,"required":false,"displayName":"created_by","defaultMatch":false,"canBeUsedToMatch":true},{"id":"updated_by","type":"string","display":true,"removed":true,"required":false,"displayName":"updated_by","defaultMatch":false,"canBeUsedToMatch":true},{"id":"nc_order","type":"number","display":true,"removed":true,"required":false,"displayName":"nc_order","defaultMatch":false,"canBeUsedToMatch":true},{"id":"title","type":"string","display":true,"required":false,"displayName":"title","defaultMatch":false,"canBeUsedToMatch":true},{"id":"URL","type":"string","display":true,"required":false,"displayName":"URL","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Stack","type":"string","display":true,"required":false,"displayName":"Stack","defaultMatch":false,"canBeUsedToMatch":true},{"id":"json","type":"object","display":true,"required":false,"displayName":"json","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Message","type":"string","display":true,"required":false,"displayName":"Message","defaultMatch":false,"canBeUsedToMatch":true},{"id":"LastNode","type":"string","display":true,"required":false,"displayName":"LastNode","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":["id"],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{}},"credentials":{"postgres":{"id":"2VsRB7eDnG0FA3z2","name":"Postgres Nocodb"}},"typeVersion":2.6,"notes":"This postgres node performs automated tasks as part of the workflow."},{"id":"8fb1201c-353e-466c-8d08-fd969e6b10b1","name":"Count for 5 minutes","type":"n8n-nodes-base.postgres","position":[-980,-210],"parameters":{"query":"SELECT count(*) FROM p1gq6ljdsam3x1m.\"N8Err\" where created_at >= $1;\n","options":{"queryReplacement":"={{ $now.minus(5, 'minutes').toString() }}"},"operation":"executeQuery"},"credentials":{"postgres":{"id":"2VsRB7eDnG0FA3z2","name":"Postgres Nocodb"}},"typeVersion":2.6,"notes":"This postgres node performs automated tasks as part of the workflow."},{"id":"89f836dc-8141-4c20-a758-bf7ff261a87b","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-2260,-300],"parameters":{"color":5,"width":820,"height":1140,"content":"# Log errors and avoid sending too many emails\n\n## Use case\n\nMost of the time, it’s necessary to log all errors that occur. However, in some cases, a scheduled task or service consuming excessive resources might trigger a surge of errors.\n\nTo address this, we can log all errors but limit alerts to a maximum of one notification every 5 minutes.\n\n## What this workflow does\n\nThis workflow can be configured to receive error events, or you can integrate it **before your own error-handling logic.**  \n\nIf used as the **primary error handler**, note that this flow will **only add a database log entry** and take no further action. You’ll need to add your own alerts (e.g., email or push notifications). Below is an example of a notification setup I prefer to use.  \n\nAt the end, there’s an **error cleanup** option. This feature is particularly useful in development environments.  \n\nIf you already have an error-handling workflow, you can call this one as a **sub-workflow**. Its final steps include cleanup logic to reset the execution state and terminate the workflow.\n\n## Setup\n\n**Verify all Postgres nodes and credentials when using the 'Error Handling Sample'**\n\n## How to adjust it to your needs\n\n1) You can set this workflow as a sub-workflow within your existing error-handling setup.\n\n2) Alternatively, you can add the \"Error Handling Sample\" at the end of this workflow, which sends email and push notifications.\n\nConfiguration Requirements:\n\n⚠️ You must create a database table for this to work!\n\n\n\nDDL of this sample:\n\ncreate table p1gq6ljdsam3x1m.\"N8Err\"\n(\n    id         serial\n        primary key,\n    created_at timestamp,\n    updated_at timestamp,\n    created_by varchar,\n    updated_by varchar,\n    nc_order   numeric,\n    title      text,\n    \"URL\"      text,\n    \"Stack\"    text,\n    json       json,\n    \"Message\"  text,\n    \"LastNode\" text\n);\n\nalter table p1gq6ljdsam3x1m.\"N8Err\"\n    owner to postgres;\n\ncreate index \"N8Err_order_idx\"\n    on p1gq6ljdsam3x1m.\"N8Err\" (nc_order);\n\nby Davi Saranszky Mesquita\n{{ $env.WEBHOOK_URL }}"},"typeVersion":1,"notes":"This stickyNote node performs automated tasks as part of the workflow."},{"id":"fba7fec5-5285-46bd-9cc7-270b7dcc8c5f","name":"Principal E-Mail","type":"n8n-nodes-base.emailSend","onError":"continueErrorOutput","disabled":true,"position":[-980,350],"webhookId":"d76d2e82-b0a8-4e35-88f9-1815d4ce6c79","parameters":{"text":"={{ $(\"Error Trigger\").item.json.execution.url }}\n\n{{ $(\"Error Trigger\").item.json.execution.lastNodeExecuted }}\n\n{{ $(\"Error Trigger\").item.json.execution.error.message }}\n{{ $(\"Error Trigger\").item.json.execution.error.stack }}","options":{"appendAttribution":false},"subject":"=Erro -  {{ $(\"Error Trigger\").item.json.workflow.name }}","toEmail":"davimesquita@gmail.com","fromEmail":"suporte@ideias.casa","emailFormat":"text"},"credentials":{"smtp":{"id":"0YIoKeISQNR2kxwO","name":"SMTP Resent"}},"typeVersion":2.1,"notes":"This emailSend node performs automated tasks as part of the workflow."},{"id":"979d0e82-42e8-450a-95b1-3c204ad61a50","name":"Fallback E-Mail","type":"n8n-nodes-base.emailSend","disabled":true,"position":[-760,350],"webhookId":"d76d2e82-b0a8-4e35-88f9-1815d4ce6c79","parameters":{"text":"={{ $(\"Error Trigger\").item.json.execution.url }}\n\n{{ $(\"Error Trigger\").item.json.execution.lastNodeExecuted }}\n\n{{ $(\"Error Trigger\").item.json.execution.error.message }}\n{{ $(\"Error Trigger\").item.json.execution.error.stack }}","options":{"appendAttribution":false},"subject":"=Erro -  {{ $(\"Error Trigger\").item.json.workflow.name }}","toEmail":"davimesquita@gmail.com","fromEmail":"contato@ideias.casa","emailFormat":"text"},"credentials":{"smtp":{"id":"UvWloRL7Jyqt8tm9","name":"SMTP Contato"}},"typeVersion":2.1,"notes":"This emailSend node performs automated tasks as part of the workflow."},{"id":"6c073c03-e00e-45b1-8f14-faa29fd58472","name":"Push mobile notification","type":"n8n-nodes-base.pushover","disabled":true,"position":[-980,550],"parameters":{"message":"={{ $(\"Error Trigger\").item.json.workflow.name }} - {{ $(\"Error Trigger\").item.json.execution.url }}\n\n{{ $(\"Error Trigger\").item.json.execution.lastNodeExecuted }}\n\n{{ $(\"Error Trigger\").item.json.execution.error.message }}\n{{ $(\"Error Trigger\").item.json.execution.error.stack }}","userKey":"YOUR_CREDENTIAL_HERE","additionalFields":{}},"credentials":{"pushoverApi":{"id":"ae8Jsj87n2hSWDbs","name":"Pushover account"}},"typeVersion":1,"notes":"This pushover node performs automated tasks as part of the workflow."},{"id":"4ca939e4-dcb1-40bd-b5eb-4cd00cb403fb","name":"Truncate Log Database","type":"n8n-nodes-base.postgres","position":[-980,810],"parameters":{"table":{"__rl":true,"mode":"list","value":"N8Err","cachedResultName":"N8Err"},"schema":{"__rl":true,"mode":"list","value":"p1gq6ljdsam3x1m","cachedResultName":"p1gq6ljdsam3x1m"},"options":{},"operation":"deleteTable","restartSequences":true},"credentials":{"postgres":{"id":"2VsRB7eDnG0FA3z2","name":"Postgres Nocodb"}},"typeVersion":2.6,"notes":"This postgres node performs automated tasks as part of the workflow."},{"id":"1eaf67ca-fb77-4b76-8ee3-ae65d4b79182","name":"Sometimes... just cleanup","type":"n8n-nodes-base.manualTrigger","position":[-1200,810],"parameters":{},"typeVersion":1,"notes":"This manualTrigger node performs automated tasks as part of the workflow."},{"id":"01e5a7dd-41a2-43f1-bbf5-241e6791cf18","name":"Call this Sample - Prepend to your error catcher","type":"n8n-nodes-base.executeWorkflow","disabled":true,"position":[-1200,450],"parameters":{"options":{},"workflowId":{"__rl":true,"mode":"id","value":""}},"typeVersion":1.2,"notes":"This executeWorkflow node performs automated tasks as part of the workflow."},{"id":"4386788d-5f10-468a-8a02-cff45a4a7ed5","name":"See below to prepend this at your error handling","type":"n8n-nodes-base.executeWorkflowTrigger","position":[-1200,-260],"parameters":{"inputSource":"passthrough"},"typeVersion":1.1,"notes":"This executeWorkflowTrigger node performs automated tasks as part of the workflow."},{"id":"d6aed974-4a36-4edd-809d-867a95d0f6ef","name":"If there is no logs in 5 minutes","type":"n8n-nodes-base.if","position":[-760,-210],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"loose"},"combinator":"and","conditions":[{"id":"a17b915d-f581-4774-a78a-48bc386aebc9","operator":{"type":"number","operation":"lte"},"leftValue":"={{ $json.count }}","rightValue":0}]},"looseTypeValidation":true},"typeVersion":2.2,"notes":"This if node performs automated tasks as part of the workflow."},{"id":"3c49f611-f1a6-409a-a4c6-903dadb27165","name":"CleanUp execution. See below if you will prepend this workflow","type":"n8n-nodes-base.code","position":[-540,-10],"parameters":{"jsCode":"return [];"},"typeVersion":2,"notes":"This code node performs automated tasks as part of the workflow."},{"id":"192443fc-c032-4815-acc7-c8cf6040cc34","name":"Insert your error handling logic after this","type":"n8n-nodes-base.noOp","position":[-540,-260],"parameters":{},"typeVersion":1,"notes":"This noOp node performs automated tasks as part of the workflow."},{"id":"2f87907f-816f-4054-8517-bb713a203131","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-1350,250],"parameters":{"width":840,"height":460,"content":"# Error handling sample\n"},"typeVersion":1,"notes":"This stickyNote node performs automated tasks as part of the workflow."},{"id":"b173898f-d1d8-4f83-b7b7-ba52cab7651e","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[-1610,630],"parameters":{"width":1140,"height":340,"content":"# Database Cleanup: Useful in DEV, but DO NOT run in production"},"typeVersion":1,"notes":"This stickyNote node performs automated tasks as part of the workflow."}],"active":false,"settings":{"callerPolicy":"workflowsFromSameOwner","executionOrder":"v1","saveManualExecutions":true,"saveExecutionProgress":false,"saveDataErrorExecution":"all","saveDataSuccessExecution":"none","errorWorkflow":null,"timezone":"UTC","executionTimeout":3600,"maxExecutions":1000,"retryOnFail":true,"retryCount":3,"retryDelay":1000},"versionId":"07c6795a-f906-4e22-a15a-4f1984e540a3","connections":{"Principal E-Mail":{"main":[[],[],[],[],[],[],[],[]]},"Fallback E-Mail":{"main":[[],[],[],[],[],[],[],[]]}},"description":"Automated workflow: Log errors and avoid sending too many emails. This workflow integrates 12 different services: postgres, stickyNote, code, errorTrigger, pushover. It contains 18 nodes and follows best practices for error handling and security.","notes":"Excellent quality workflow: Log errors and avoid sending too many emails. This workflow has been optimized for production use with comprehensive error handling, security, and documentation."}