{ "id": "3b1q6ZJTxeONrpUV", "meta": { "instanceId": "" }, "name": "Error Alert and Summarizer", "tags": [], "nodes": [ { "id": "d29a5b06-1609-416f-bc74-0274d3321019", "name": "Error Trigger", "type": "n8n-nodes-base.errorTrigger", "position": [ -600, -40 ], "parameters": {}, "typeVersion": 1 }, { "id": "a71d3052-a89b-4e8e-baee-7fe245575f42", "name": "OpenAI Chat Model", "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi", "position": [ 528, 180 ], "parameters": { "model": { "__rl": true, "mode": "list", "value": "gpt-4o", "cachedResultName": "gpt-4o" }, "options": {} }, "credentials": { "openAiApi": { "id": "786", "name": "OpenAi account" } }, "typeVersion": 1.2 }, { "id": "e71dee7b-4dfd-49ab-8939-f3808ee112d7", "name": "Structured Output Parser", "type": "@n8n/n8n-nodes-langchain.outputParserStructured", "position": [ 648, 180 ], "parameters": { "jsonSchemaExample": "{\n\"diagnosis\":\"\",\n\"cause\":\"\",\n\"resolution\":\"\"\n}" }, "typeVersion": 1.2 }, { "id": "3611e9e8-f677-49c4-b06c-fa6c28f43930", "name": "SET EMAIL", "type": "n8n-nodes-base.set", "position": [ -380, -40 ], "parameters": { "options": {}, "assignments": { "assignments": [ { "id": "45e1443a-fb44-42f8-96ad-423197c7265b", "name": "TO", "type": "string", "value": "myemail@myemail.com" }, { "id": "968b05dc-f476-4e13-8166-e62005d0f936", "name": "CC", "type": "string", "value": "theiremail@theiremail.com" }, { "id": "570663c5-29c0-44fb-9992-908b7cca8136", "name": "BCC", "type": "string", "value": "theiremail@theiremail.com" } ] } }, "typeVersion": 3.4 }, { "id": "3676f72e-d06d-44f8-be35-19efe09a257e", "name": "Sticky Note", "type": "n8n-nodes-base.stickyNote", "position": [ -450, -260 ], "parameters": { "color": 3, "height": 380, "content": "# SET YOUR EMAILS" }, "typeVersion": 1 }, { "id": "f0b08a20-6ecc-4487-9a0a-30be07cc0cbb", "name": "Sticky Note1", "type": "n8n-nodes-base.stickyNote", "position": [ -40, -260 ], "parameters": { "color": 3, "width": 280, "height": 380, "content": "# Enable/Disable Manual Executions" }, "typeVersion": 1 }, { "id": "b35cd2a6-5f22-4e06-9bb0-880855c423a8", "name": "Remove Manual Exec", "type": "n8n-nodes-base.if", "position": [ 60, -40 ], "parameters": { "options": { "ignoreCase": true }, "conditions": { "options": { "version": 2, "leftValue": "", "caseSensitive": false, "typeValidation": "strict" }, "combinator": "and", "conditions": [ { "id": "9b2f3ff3-db9c-406b-a97f-37620dc5fab9", "operator": { "type": "string", "operation": "notContains" }, "leftValue": "={{ $json.mode }}", "rightValue": "manual" } ] } }, "typeVersion": 2.2 }, { "id": "2a33b02a-78f1-4243-ba7d-f217ea4d1895", "name": "Get Failed Exec", "type": "n8n-nodes-base.n8n", "position": [ -160, -40 ], "parameters": { "options": { "activeWorkflows": true }, "resource": "execution", "operation": "get", "executionId": "={{ $('Error Trigger').item.json.execution.id }}", "requestOptions": {} }, "credentials": { "n8nApi": { "id": "786", "name": "n8n account" } }, "typeVersion": 1 }, { "id": "b36ccbf9-4e47-44fc-aed3-424b6f121329", "name": "Extract Error Details", "type": "n8n-nodes-base.code", "position": [ 280, -40 ], "parameters": { "jsCode": "// 1) Grab your full execution JSON\nconst exec = items[0].json;\n\n// 2) Build execution‐level metadata\nconst meta = {\n executionId: exec.id,\n finished: exec.finished,\n mode: exec.mode,\n status: exec.status,\n createdAt: exec.createdAt,\n startedAt: exec.startedAt,\n stoppedAt: exec.stoppedAt,\n deletedAt: exec.deletedAt,\n workflowId: exec.workflowId,\n workflowName: exec.workflowData?.name,\n retryOf: exec.retryOf,\n retrySuccessId: exec.retrySuccessId,\n};\n\n// 3) Identify trigger node name from startData\nconst runNodeFilter = exec.data?.startData?.runNodeFilter || [];\nconst triggerNodeName = runNodeFilter[0] || null;\n\n// 4) Grab the raw trigger runData\nconst runData = exec.data?.resultData?.runData || {};\nconst triggerRuns = triggerNodeName ? (runData[triggerNodeName] || []) : [];\n\n// 5) Extract the JSON payload from the first run of the trigger\nlet triggerPayload = {};\nif (triggerRuns.length && triggerRuns[0].data?.main?.[0]?.[0]?.json) {\n triggerPayload = triggerRuns[0].data.main[0][0].json;\n}\n\n// 6) Merge trigger info into meta\nmeta.triggerNodeName = triggerNodeName;\nmeta.triggerPayload = triggerPayload;\n\n// 7) Now scan for all node errors, **excluding** any nodeName that contains “SERP”\nconst allErrors = [];\nfor (const [nodeName, runs] of Object.entries(runData)) {\n // Skip any of the SERP nodes\n if (nodeName.includes('SERP')) continue;\n\n runs.forEach(run => {\n if (run.executionStatus === 'error') {\n const err = run.error || exec.data.resultData.error || {};\n const nodeDef = err.node || run.node || {};\n\n allErrors.push({\n ...meta, // exec + trigger metadata\n\n nodeName,\n nodeId: nodeDef.id,\n nodeType: nodeDef.type,\n nodeLabel: nodeDef.name,\n\n startTime: run.startTime,\n executionTime: run.executionTime,\n source: run.source,\n\n errorName: err.name,\n errorMessage: err.message,\n errorDescription: err.description,\n httpCode: err.httpCode,\n messages: err.messages,\n context: err.context,\n stack: err.stack,\n\n parameters: nodeDef.parameters,\n credentials: nodeDef.credentials,\n });\n }\n });\n}\n\n// 8) Return results\nif (!allErrors.length) {\n return [{ json: { message: '✅ No (non‑SERP) errors found in this execution.' } }];\n}\nreturn allErrors.map(e => ({ json: e }));\n" }, "typeVersion": 2 }, { "id": "a26fb0c8-99eb-466d-b201-89c402fa1af4", "name": "Error Solver Agent", "type": "@n8n/n8n-nodes-langchain.agent", "position": [ 500, -40 ], "parameters": { "text": "=Can you please help me with this error that occured in my n8n workflow? {{ JSON.stringify($json) }}", "options": { "systemMessage": "You are an seasoned n8n expert with specializations in managing n8n instances and workflows. The user will provide a detailed error json object and your goal is to review, analyze and understand the error and using your expertise diagnose the error and provide a detailed report to the user with your diagnosis, cause and resolution so the user understands and can immediately fix the issue." }, "promptType": "define", "hasOutputParser": true }, "typeVersion": 1.8 }, { "id": "8cfd7229-3ff1-4ba1-a67d-caa21be8064f", "name": "Set Diagnosis Fields", "type": "n8n-nodes-base.set", "position": [ 876, -40 ], "parameters": { "options": {}, "assignments": { "assignments": [ { "id": "fac5fbee-d63d-4148-b047-5ed5af4f2574", "name": "error.diagnosis", "type": "string", "value": "={{ $json.output.diagnosis }}" }, { "id": "ece9388d-f667-4984-a143-7241f622fe76", "name": "error.cause", "type": "string", "value": "={{ $json.output.cause }}" }, { "id": "acb6b34a-a651-42fc-a44a-331b2e0d745c", "name": "error.resolution", "type": "string", "value": "={{ $json.output.resolution }}" }, { "id": "c765754b-d6d5-4592-ac3f-99a350bc3c19", "name": "error.workflowName", "type": "string", "value": "={{ $('Extract Error Details').item.json.workflowName }}" }, { "id": "dabebc62-3e0c-4d22-afbf-54ba66a912fb", "name": "error.workflowId", "type": "string", "value": "={{ $('Extract Error Details').item.json.workflowId }}" }, { "id": "6ab19800-9a0f-439f-bf62-7a7afc5bf958", "name": "workflowLink", "type": "string", "value": "={{ $execution.resumeUrl.split('/').slice(0, 3).join('/') }}/workflow/{{ $('Extract Error Details').item.json.workflowId }}" }, { "id": "29daaea5-052b-46d4-8192-141db159bff2", "name": "error.executionId", "type": "string", "value": "={{ $('Extract Error Details').item.json.executionId }}" }, { "id": "9e4e553c-c82b-41ec-8ee2-14162cdc3bd8", "name": "executionLink", "type": "string", "value": "={{ $execution.resumeUrl.split('/').slice(0, 3).join('/') }}/workflow/{{ $('Extract Error Details').item.json.workflowId }}/executions/{{ $('Extract Error Details').item.json.executionId }}" }, { "id": "7269ea9f-ed49-46cd-89f2-d4a467da529d", "name": "error.finished", "type": "boolean", "value": "={{ $('Extract Error Details').item.json.finished }}" }, { "id": "29a6e6d2-5058-4dd9-b2f9-3980a6a9073a", "name": "error.startedAt", "type": "string", "value": "={{ $('Extract Error Details').item.json.startedAt }}" }, { "id": "a0ad0e13-5a6e-48db-9a80-74c09434de7f", "name": "error.nodeName", "type": "string", "value": "={{ $('Extract Error Details').item.json.nodeName }}" }, { "id": "6c1001d4-a581-4520-9f16-a2c7cf0e1f84", "name": "error.previousNode", "type": "string", "value": "={{ $('Extract Error Details').item.json.source[0].previousNode }}" }, { "id": "8c3402ca-3f15-44ae-9b96-ea37c174334c", "name": "rawJson", "type": "string", "value": "={{ JSON.stringify($('Extract Error Details').item.json) }}" } ] } }, "typeVersion": 3.4 }, { "id": "9e95edf0-b2f1-443b-9ac4-3e3b3311cad5", "name": "Send Gmail", "type": "n8n-nodes-base.gmail", "position": [ 1316, -40 ], "webhookId": "2f253c1f-36c3-4d58-ba2f-3a50bb78f188", "parameters": { "sendTo": "={{ $('SET EMAIL').item.json.TO }}", "message": "={{ $json.html }}", "options": { "ccList": "={{ $('SET EMAIL').item.json.CC }}", "bccList": "={{ $('SET EMAIL').item.json.BCC }}", "appendAttribution": true }, "subject": "={{ $json.subject }}" }, "credentials": { "gmailOAuth2": { "id": "786", "name": "Gmail account" } }, "typeVersion": 2.1 }, { "id": "1705ee42-0be4-41a2-8ff9-f6963eef7382", "name": "Generate Email", "type": "n8n-nodes-base.code", "position": [ 1100, -40 ], "parameters": { "jsCode": "// 1. Pull in your error payload\nconst rawInput = items[0].json;\nconst parsed = typeof rawInput === 'string' ? JSON.parse(rawInput) : rawInput;\nconst errorArray = Array.isArray(parsed) ? parsed : [parsed];\n\n// 2. Build HTML & Markdown sections\nlet htmlSections = '';\n\n\nfor (const errObj of errorArray) {\n const {\n error: {\n workflowName,\n executionId,\n nodeName,\n previousNode,\n diagnosis,\n cause,\n resolution,\n startedAt,\n },\n workflowLink,\n executionLink,\n } = errObj;\n\n // HTML block\n htmlSections += `\n
\n Workflow: \n \n ${workflowName}\n
\n Execution: \n \n #${executionId}\n
\n Previous Node: ${previousNode}
\n Started At: ${new Date(startedAt).toLocaleString('en-US', { timeZone: 'America/New_York' })}\n
${diagnosis}
\n${cause}
\n${resolution}
\n\n This message was generated automatically by \n Real Simple Solutions.\n
\n