AutomationFlowsAI & RAG › Triage Incidents and Enforce Slas with Gemini, Groq, Google Sheets and Slack

Triage Incidents and Enforce Slas with Gemini, Groq, Google Sheets and Slack

ByMychel Garzon @mychel-garzon on n8n.io

Know that feeling when a "low priority" ticket turns into a production fire? Or when your on-call rotation starts showing signs of serious burnout from alert overload?

Webhook trigger★★★★★ complexityAI-powered44 nodesGoogle SheetsAgentGoogle Gemini ChatGroq ChatSlack
AI & RAG Trigger: Webhook Nodes: 44 Complexity: ★★★★★ AI nodes: yes Added:
Triage Incidents and Enforce Slas with Gemini, Groq, Google Sheets and Slack — n8n workflow card showing Google Sheets, Agent, Google Gemini Chat integration

This workflow corresponds to n8n.io template #14237 — we link there as the canonical source.

This workflow follows the Agent → Google Sheets recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "TWV62FDLEPhGKx2ksidB3",
  "name": "Two-Agent Incident Triage with Self-Learning SLA Enforcement",
  "tags": [
    {
      "id": "VPXQRENI2ReIyfgg",
      "name": "incident-management",
      "createdAt": "2026-03-22T13:48:44.450Z",
      "updatedAt": "2026-03-22T13:48:44.450Z"
    },
    {
      "id": "YyXqBA5n5y8drh0d",
      "name": "two-agent-ai",
      "createdAt": "2026-03-22T16:05:47.293Z",
      "updatedAt": "2026-03-22T16:05:47.293Z"
    },
    {
      "id": "wAOfNHQmbohYt8PV",
      "name": "google-workspace",
      "createdAt": "2026-03-22T13:48:44.494Z",
      "updatedAt": "2026-03-22T13:48:44.494Z"
    },
    {
      "id": "K9kxoyItLOZIoq65",
      "name": "gemini-ai",
      "createdAt": "2026-03-22T13:48:44.497Z",
      "updatedAt": "2026-03-22T13:48:44.497Z"
    },
    {
      "id": "OqWPcDDb22XcHL8l",
      "name": "groq-fallback",
      "createdAt": "2026-03-22T16:05:47.254Z",
      "updatedAt": "2026-03-22T16:05:47.254Z"
    },
    {
      "id": "WAxTZiTiMs7bNOun",
      "name": "devsecops",
      "createdAt": "2026-03-22T13:48:44.542Z",
      "updatedAt": "2026-03-22T13:48:44.542Z"
    },
    {
      "id": "KZmoHPtY1bPYd5uo",
      "name": "escalation",
      "createdAt": "2026-03-22T13:48:44.544Z",
      "updatedAt": "2026-03-22T13:48:44.544Z"
    },
    {
      "id": "QDU7UL6iho5YMCPm",
      "name": "audit-trail",
      "createdAt": "2026-03-22T16:05:47.303Z",
      "updatedAt": "2026-03-22T16:05:47.303Z"
    }
  ],
  "nodes": [
    {
      "id": "8050a669-e0c8-493b-90b1-d0bf814262ea",
      "name": "Incident Report Trigger",
      "type": "n8n-nodes-base.webhook",
      "position": [
        304,
        784
      ],
      "parameters": {
        "path": "incident-report",
        "options": {},
        "httpMethod": "POST",
        "responseMode": "responseNode"
      },
      "typeVersion": 1.1
    },
    {
      "id": "94d87eba-3141-4644-b8f4-aef9a3417d9a",
      "name": "Accept and Continue",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        528,
        784
      ],
      "parameters": {
        "options": {
          "responseCode": 200
        },
        "respondWith": "json",
        "responseBody": "={\n  \"status\": \"accepted\",\n  \"message\": \"Incident report received. Processing started.\",\n  \"incidentId\": \"{{ $json.incidentId }}\"\n}"
      },
      "typeVersion": 1.1
    },
    {
      "id": "aae43281-18fc-4170-9cce-74b52e6afb96",
      "name": "Normalize Incident Data",
      "type": "n8n-nodes-base.set",
      "position": [
        752,
        784
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "a1",
              "name": "incidentId",
              "type": "string",
              "value": "={{ 'INC-' + $now.format('yyyyMMdd-HHmmss') + '-' + Math.random().toString(36).substring(2, 6) }}"
            },
            {
              "id": "a2",
              "name": "title",
              "type": "string",
              "value": "={{ $('Incident Report Trigger').item.json.body.title || 'Untitled Incident' }}"
            },
            {
              "id": "a3",
              "name": "description",
              "type": "string",
              "value": "={{ $('Incident Report Trigger').item.json.body.description || 'No description provided' }}"
            },
            {
              "id": "a4",
              "name": "reportedSeverity",
              "type": "string",
              "value": "={{ $('Incident Report Trigger').item.json.body.severity || 'P3' }}"
            },
            {
              "id": "a5",
              "name": "reporter",
              "type": "string",
              "value": "={{ $('Incident Report Trigger').item.json.body.reporter || '' }}"
            },
            {
              "id": "a6",
              "name": "service",
              "type": "string",
              "value": "={{ $('Incident Report Trigger').item.json.body.service || 'Unknown Service' }}"
            },
            {
              "id": "a7",
              "name": "reportedAt",
              "type": "string",
              "value": "={{ $now.toISO() }}"
            },
            {
              "id": "a8",
              "name": "status",
              "type": "string",
              "value": "Open"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "320b8d94-b185-42f7-8096-500b364c76df",
      "name": "Fetch Runbook Context",
      "type": "n8n-nodes-base.googleSheets",
      "onError": "continueRegularOutput",
      "position": [
        976,
        784
      ],
      "parameters": {
        "options": {},
        "filtersUI": {
          "values": [
            {
              "lookupValue": "={{ $json.service }}",
              "lookupColumn": "Service"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Runbooks"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": ""
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "36102076-93da-4e8f-ade2-66ceff276fc6",
      "name": "Build Runbook Context",
      "type": "n8n-nodes-base.code",
      "position": [
        1200,
        784
      ],
      "parameters": {
        "jsCode": "const incident = $('Normalize Incident Data').first().json;\nconst runbookRaw = $input.first().json;\n\nlet runbookContext = '';\ntry {\n  if (runbookRaw && runbookRaw.Service) {\n    const parts = [];\n    if (runbookRaw['Known Issues']) parts.push('Known issues: ' + runbookRaw['Known Issues']);\n    if (runbookRaw['First Response Steps']) parts.push('First response: ' + runbookRaw['First Response Steps']);\n    if (runbookRaw['Escalation Contact']) parts.push('Escalation contact: ' + runbookRaw['Escalation Contact']);\n    if (runbookRaw['SLA Minutes']) parts.push('SLA target: ' + runbookRaw['SLA Minutes'] + ' minutes');\n    runbookContext = parts.join('. ');\n  }\n} catch (e) {\n  runbookContext = '';\n}\n\nreturn [{\n  json: {\n    ...incident,\n    runbookContext: runbookContext || 'No runbook found for this service.'\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "b163f4d3-1d41-4b38-a2b6-0227906884f3",
      "name": "Agent 1 - Incident Analyzer",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "onError": "continueRegularOutput",
      "position": [
        1424,
        784
      ],
      "parameters": {
        "text": "=Analyze this incident report:\n\n**Title:** {{ $json.title }}\n**Description:** {{ $json.description }}\n**Reported Severity:** {{ $json.reportedSeverity }}\n**Service:** {{ $json.service }}\n**Runbook Context:** {{ $json.runbookContext }}",
        "options": {
          "systemMessage": "You are an incident severity analyzer for a DevOps/SRE team.\n\nAnalyze the incident and return a JSON object with these fields:\n\n- severity: one of \"P1\", \"P2\", \"P3\" (P1=Critical/Production Down, P2=High/Degraded, P3=Normal/Non-urgent)\n- confidence: float 0.0-1.0 (how certain you are)\n- reasoning: string (brief explanation of severity assignment)\n- risk_indicators: array of strings (specific signals that influenced severity: e.g., \"production database mentioned\", \"customer-facing impact\", \"data loss risk\")\n- matches_known_issue: boolean (does this match a known issue from runbook context?)\n- urgency_score: integer 1-10 (1=can wait days, 10=immediate action required)\n\nCRITICAL RULES:\n1. Output ONLY valid JSON. No markdown, no explanation, no preamble.\n2. P1 severity requires BOTH high impact AND high urgency.\n3. Consider the reported severity but validate against actual impact.\n4. Use runbook context to identify known issues.\n5. Be conservative: if uncertain between P1 and P2, choose P2.\n6. Focus on business/customer impact, not just technical symptoms."
        },
        "promptType": "define",
        "needsFallback": true,
        "hasOutputParser": true
      },
      "typeVersion": 3.1
    },
    {
      "id": "4993a982-9cb9-4d4d-8a67-2fbcfa676386",
      "name": "Analyzer LLM (Gemini)",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        1456,
        1008
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "bce4c7c1-6d2b-4c84-9daf-0aac5a92cd8a",
      "name": "Analyzer Fallback (Groq)",
      "type": "@n8n/n8n-nodes-langchain.lmChatGroq",
      "position": [
        1584,
        1008
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "23ec7c43-174d-4710-ad80-2f1e750ba73d",
      "name": "Parse Analyzer Output",
      "type": "n8n-nodes-base.code",
      "position": [
        1824,
        784
      ],
      "parameters": {
        "jsCode": "// Updated 2026-03-22: Added robust JSON fence stripping\n// after Gemini started wrapping responses in markdown\n\nconst analyzerResponse = $input.first().json.output || $input.first().json.text || '';\n\nlet cleanedResponse = analyzerResponse.trim();\n\n// Strip markdown code fences\nif (cleanedResponse.startsWith('```json')) {\n  cleanedResponse = cleanedResponse.slice(7);\n}\nif (cleanedResponse.startsWith('```')) {\n  cleanedResponse = cleanedResponse.slice(3);\n}\nif (cleanedResponse.endsWith('```')) {\n  cleanedResponse = cleanedResponse.slice(0, -3);\n}\ncleanedResponse = cleanedResponse.trim();\n\n// Try to extract JSON from mixed text\nif (!cleanedResponse.startsWith('{')) {\n  const jsonMatch = cleanedResponse.match(/\\{[\\s\\S]*\\}/);\n  if (jsonMatch) {\n    cleanedResponse = jsonMatch[0];\n  }\n}\n\nconst incident = $('Build Runbook Context').first().json;\n\ntry {\n  const analysis = JSON.parse(cleanedResponse);\n  \n  // Validate required fields\n  const hasRequiredFields = \n    analysis.severity && \n    typeof analysis.confidence === 'number' &&\n    analysis.reasoning &&\n    Array.isArray(analysis.risk_indicators);\n  \n  if (!hasRequiredFields) {\n    throw new Error('Missing required fields in analysis');\n  }\n  \n  // Validate severity is one of P1/P2/P3\n  if (!['P1', 'P2', 'P3'].includes(analysis.severity)) {\n    throw new Error('Invalid severity value: ' + analysis.severity);\n  }\n  \n  return {\n    json: {\n      ...incident,\n      analysis: analysis,\n      parseSuccess: true,\n      analyzerModel: 'gemini'\n    }\n  };\n  \n} catch (error) {\n  // Complete fallback - use reported severity\n  return {\n    json: {\n      ...incident,\n      analysis: {\n        severity: incident.reportedSeverity,\n        confidence: 0.0,\n        reasoning: 'Analyzer failed - using reported severity. Error: ' + error.message,\n        risk_indicators: [],\n        matches_known_issue: false,\n        urgency_score: 5\n      },\n      parseSuccess: false,\n      parseError: error.message,\n      rawResponse: analyzerResponse\n    }\n  };\n}"
      },
      "typeVersion": 2
    },
    {
      "id": "a4f2e701-5d33-4f11-8b96-d63810a7f857",
      "name": "Agent 2 - Response Coordinator",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "onError": "continueRegularOutput",
      "position": [
        2048,
        784
      ],
      "parameters": {
        "text": "=Generate a response plan for this incident:\n\n**Incident ID:** {{ $json.incidentId }}\n**Service:** {{ $json.service }}\n**Analysis:** {{ JSON.stringify($json.analysis, null, 2) }}\n**Runbook Context:** {{ $json.runbookContext }}",
        "options": {
          "systemMessage": "You are a response coordinator for incident management.\n\nGiven the analyzer's assessment, generate an actionable response plan as JSON:\n\n- immediate_actions: array of strings (3-5 concrete first steps to take)\n- escalation_tier: one of \"manager\", \"team\", \"none\" (who needs to be notified)\n- notification_channels: array of strings (which Slack channels: e.g., [\"#incidents-critical\", \"#engineering\"])\n- sla_minutes: integer (response time target: 15 for P1, 60 for P2, 240 for P3)\n- root_cause_hypothesis: string (brief theory of what went wrong)\n- requires_war_room: boolean (should we create a dedicated incident Slack channel?)\n- recommended_assignee: string (team or person who should own this, based on runbook)\n\nCRITICAL RULES:\n1. Output ONLY valid JSON. No markdown, no preamble.\n2. immediate_actions should be specific and actionable, not generic.\n3. Use runbook context to populate recommended_assignee.\n4. P1 incidents ALWAYS require war_room = true.\n5. Be specific about notification channels based on severity and service."
        },
        "promptType": "define",
        "needsFallback": true,
        "hasOutputParser": true
      },
      "typeVersion": 3.1
    },
    {
      "id": "9a70ba94-5a69-4fce-820d-eb761f8152f3",
      "name": "Coordinator LLM (Gemini)",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        1936,
        1008
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "c7a3ef87-a9d3-48c1-aba4-bbcbb5e5a447",
      "name": "Coordinator Fallback (Groq)",
      "type": "@n8n/n8n-nodes-langchain.lmChatGroq",
      "position": [
        2128,
        1008
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "5fe845cb-cfba-47c9-99f0-7a7426be2f17",
      "name": "Process Response Plan",
      "type": "n8n-nodes-base.code",
      "position": [
        2448,
        784
      ],
      "parameters": {
        "jsCode": "// Parse Response Coordinator output\n\nconst coordinatorResponse = $input.first().json.output || $input.first().json.text || '';\n\nlet cleanedResponse = coordinatorResponse.trim();\n\n// Strip markdown fences\nif (cleanedResponse.startsWith('```json')) {\n  cleanedResponse = cleanedResponse.slice(7);\n}\nif (cleanedResponse.startsWith('```')) {\n  cleanedResponse = cleanedResponse.slice(3);\n}\nif (cleanedResponse.endsWith('```')) {\n  cleanedResponse = cleanedResponse.slice(0, -3);\n}\ncleanedResponse = cleanedResponse.trim();\n\n// Extract JSON from mixed text\nif (!cleanedResponse.startsWith('{')) {\n  const jsonMatch = cleanedResponse.match(/\\{[\\s\\S]*\\}/);\n  if (jsonMatch) {\n    cleanedResponse = jsonMatch[0];\n  }\n}\n\nconst incident = $('Parse Analyzer Output').first().json;\nconst analysis = incident.analysis;\n\ntry {\n  const plan = JSON.parse(cleanedResponse);\n  \n  // Validate required fields\n  const hasRequiredFields = \n    Array.isArray(plan.immediate_actions) &&\n    plan.escalation_tier &&\n    Array.isArray(plan.notification_channels) &&\n    typeof plan.sla_minutes === 'number';\n  \n  if (!hasRequiredFields) {\n    throw new Error('Missing required fields in response plan');\n  }\n  \n  // Calculate severity override flag\n  const severityChanged = analysis.severity !== incident.reportedSeverity;\n  \n  return {\n    json: {\n      incidentId: incident.incidentId,\n      title: incident.title,\n      description: incident.description,\n      service: incident.service,\n      reporter: incident.reporter,\n      reportedAt: incident.reportedAt,\n      status: incident.status,\n      \n      // Original data\n      reportedSeverity: incident.reportedSeverity,\n      runbookContext: incident.runbookContext,\n      \n      // AI Analysis (Agent 1)\n      severity: analysis.severity,\n      confidence: analysis.confidence,\n      reasoning: analysis.reasoning,\n      risk_indicators: analysis.risk_indicators.join('; '),\n      matches_known_issue: analysis.matches_known_issue,\n      urgency_score: analysis.urgency_score,\n      \n      // Response Plan (Agent 2)\n      immediate_actions: plan.immediate_actions.join('; '),\n      escalation_tier: plan.escalation_tier,\n      notification_channels: plan.notification_channels.join(', '),\n      sla_minutes: plan.sla_minutes,\n      root_cause_hypothesis: plan.root_cause_hypothesis || '',\n      requires_war_room: plan.requires_war_room,\n      recommended_assignee: plan.recommended_assignee || '',\n      \n      // Audit fields\n      severityOverridden: severityChanged,\n      analyzerSuccess: incident.parseSuccess,\n      coordinatorSuccess: true\n    }\n  };\n  \n} catch (error) {\n  // Fallback plan generation\n  const defaultSLA = {\n    'P1': 15,\n    'P2': 60,\n    'P3': 240\n  };\n  \n  return {\n    json: {\n      incidentId: incident.incidentId,\n      title: incident.title,\n      description: incident.description,\n      service: incident.service,\n      reporter: incident.reporter,\n      reportedAt: incident.reportedAt,\n      status: incident.status,\n      reportedSeverity: incident.reportedSeverity,\n      runbookContext: incident.runbookContext,\n      \n      severity: analysis.severity,\n      confidence: analysis.confidence,\n      reasoning: analysis.reasoning,\n      risk_indicators: analysis.risk_indicators.join('; '),\n      matches_known_issue: analysis.matches_known_issue,\n      urgency_score: analysis.urgency_score,\n      \n      // Fallback plan\n      immediate_actions: 'Investigate manually - coordinator failed',\n      escalation_tier: analysis.severity === 'P1' ? 'manager' : 'team',\n      notification_channels: analysis.severity === 'P1' ? '#incidents-critical' : '#incidents',\n      sla_minutes: defaultSLA[analysis.severity] || 60,\n      root_cause_hypothesis: 'Requires manual investigation',\n      requires_war_room: analysis.severity === 'P1',\n      recommended_assignee: 'On-call engineer',\n      \n      severityOverridden: analysis.severity !== incident.reportedSeverity,\n      analyzerSuccess: incident.parseSuccess,\n      coordinatorSuccess: false,\n      coordinatorError: error.message\n    }\n  };\n}"
      },
      "typeVersion": 2
    },
    {
      "id": "a7410db8-807c-4864-9716-e47567e12c3c",
      "name": "Log to Incident Tracker",
      "type": "n8n-nodes-base.googleSheets",
      "onError": "continueRegularOutput",
      "position": [
        2672,
        688
      ],
      "parameters": {
        "columns": {
          "value": {
            "Title": "={{ $json.title }}",
            "Status": "={{ $json.status }}",
            "Service": "={{ $json.service }}",
            "Reporter": "={{ $json.reporter }}",
            "Escalated": "No",
            "Reasoning": "={{ $json.reasoning }}",
            "Confidence": "={{ $json.confidence }}",
            "AI Severity": "={{ $json.severity }}",
            "Description": "={{ $json.description }}",
            "Incident ID": "={{ $json.incidentId }}",
            "Reported At": "={{ $json.reportedAt }}",
            "SLA Minutes": "={{ $json.sla_minutes }}",
            "Urgency Score": "={{ $json.urgency_score }}",
            "Acknowledged By": "",
            "Risk Indicators": "={{ $json.risk_indicators }}",
            "Runbook Context": "={{ $json.runbookContext }}",
            "Immediate Actions": "={{ $json.immediate_actions }}",
            "Reported Severity": "={{ $json.reportedSeverity }}",
            "Severity Overridden": "={{ $json.severityOverridden }}",
            "Recommended Assignee": "={{ $json.recommended_assignee }}",
            "Root Cause Hypothesis": "={{ $json.root_cause_hypothesis }}"
          },
          "mappingMode": "defineBelow"
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Incidents"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": ""
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "65318b49-ecba-4b4c-8daa-119b444499f4",
      "name": "Log AI Decision Audit",
      "type": "n8n-nodes-base.googleSheets",
      "onError": "continueRegularOutput",
      "position": [
        2672,
        880
      ],
      "parameters": {
        "columns": {
          "value": {
            "Override": "={{ $json.severityOverridden }}",
            "Timestamp": "={{ $now.toISO() }}",
            "Confidence": "={{ $json.confidence }}",
            "AI Severity": "={{ $json.severity }}",
            "Incident ID": "={{ $json.incidentId }}",
            "Human Feedback": "",
            "Analyzer Success": "={{ $json.analyzerSuccess }}",
            "Reported Severity": "={{ $json.reportedSeverity }}",
            "Feedback Timestamp": "",
            "Coordinator Success": "={{ $json.coordinatorSuccess }}"
          },
          "mappingMode": "defineBelow"
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "AI_Audit_Log"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": ""
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "c516719a-4d99-4f09-84bd-77a467c09c7a",
      "name": "Route by AI Severity",
      "type": "n8n-nodes-base.switch",
      "position": [
        2896,
        672
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": {
                "options": {
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.severity }}",
                    "rightValue": "P1"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "conditions": {
                "options": {
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.severity }}",
                    "rightValue": "P2"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "conditions": {
                "options": {
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.severity }}",
                    "rightValue": "P3"
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {
          "fallbackOutput": "none"
        }
      },
      "typeVersion": 3.2
    },
    {
      "id": "8b3c225e-b3a4-4d25-b7fa-d5a5e348ec0d",
      "name": "P1 - Send Critical Alert",
      "type": "n8n-nodes-base.slack",
      "onError": "continueRegularOutput",
      "position": [
        3280,
        320
      ],
      "parameters": {
        "text": "=\ud83d\udea8 **CRITICAL INCIDENT - P1**\n\n**ID:** {{ $json.incidentId }}\n**Service:** {{ $json.service }}\n**Title:** {{ $json.title }}\n\n**AI Analysis:**\n\u2022 Severity: {{ $json.severity }} (Confidence: {{ Math.round($json.confidence * 100) }}%)\n\u2022 {{ $json.reasoning }}\n\n**Risk Indicators:** {{ $json.risk_indicators }}\n\n**Immediate Actions:**\n{{ $json.immediate_actions }}\n\n**Root Cause Hypothesis:** {{ $json.root_cause_hypothesis }}\n\n**Recommended Owner:** {{ $json.recommended_assignee }}\n**SLA:** {{ $json.sla_minutes }} minutes",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "name",
          "value": "incidents-critical"
        },
        "otherOptions": {}
      },
      "typeVersion": 2.2
    },
    {
      "id": "65e64503-863e-4e51-871f-66eeaadd94d0",
      "name": "P2 - Send High Alert",
      "type": "n8n-nodes-base.slack",
      "onError": "continueRegularOutput",
      "position": [
        3264,
        688
      ],
      "parameters": {
        "text": "=\u26a0\ufe0f **HIGH PRIORITY INCIDENT - P2**\n\n**ID:** {{ $json.incidentId }}\n**Service:** {{ $json.service }}\n**Title:** {{ $json.title }}\n\n**AI Analysis:**\n\u2022 Severity: {{ $json.severity }} (Confidence: {{ Math.round($json.confidence * 100) }}%)\n\u2022 {{ $json.reasoning }}\n\n**Immediate Actions:**\n{{ $json.immediate_actions }}\n\n**Recommended Owner:** {{ $json.recommended_assignee }}\n**SLA:** {{ $json.sla_minutes }} minutes ({{ Math.floor($json.sla_minutes / 60) }}h {{ $json.sla_minutes % 60 }}m)",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "name",
          "value": "incidents"
        },
        "otherOptions": {}
      },
      "typeVersion": 2.2
    },
    {
      "id": "fada835e-ede8-44a2-aff6-1681a91c1815",
      "name": "P3 - Send Notification",
      "type": "n8n-nodes-base.slack",
      "onError": "continueRegularOutput",
      "position": [
        3232,
        1072
      ],
      "parameters": {
        "text": "=\u2139\ufe0f **Incident Logged - P3**\n\n**ID:** {{ $json.incidentId }}\n**Service:** {{ $json.service }}\n**Title:** {{ $json.title }}\n\n**Analysis:** {{ $json.reasoning }}\n\n**Recommended Owner:** {{ $json.recommended_assignee }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "name",
          "value": "incidents"
        },
        "otherOptions": {}
      },
      "typeVersion": 2.2
    },
    {
      "id": "3635cc81-1db0-4c34-b686-4215d866bd32",
      "name": "Needs War Room?",
      "type": "n8n-nodes-base.if",
      "position": [
        3504,
        320
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "operator": {
                "type": "boolean",
                "operation": "true"
              },
              "leftValue": "={{ $json.requires_war_room }}",
              "rightValue": true
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "07d96783-88cc-4ce0-8aed-d2d046a63213",
      "name": "P1 - Create War Room",
      "type": "n8n-nodes-base.slack",
      "onError": "continueRegularOutput",
      "position": [
        3728,
        320
      ],
      "parameters": {
        "resource": "channel",
        "channelId": "={{ 'incident-' + $json.incidentId.toLowerCase() }}"
      },
      "typeVersion": 2.2
    },
    {
      "id": "f7022deb-2c83-406c-a3f0-68ee060f59f1",
      "name": "P1 - Wait SLA Time",
      "type": "n8n-nodes-base.wait",
      "position": [
        3952,
        320
      ],
      "parameters": {
        "unit": "minutes",
        "amount": "={{ $json.sla_minutes }}"
      },
      "typeVersion": 1.1
    },
    {
      "id": "b341e408-e4ab-4d9e-9ae2-bc97848d50f8",
      "name": "P1 - Check Acknowledgment",
      "type": "n8n-nodes-base.googleSheets",
      "onError": "continueRegularOutput",
      "position": [
        4176,
        320
      ],
      "parameters": {
        "options": {},
        "filtersUI": {
          "values": [
            {
              "lookupValue": "={{ $json.incidentId }}",
              "lookupColumn": "Incident ID"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Incidents"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": ""
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "979140f4-ace5-4e98-98cf-e1e6fb537fac",
      "name": "P1 - Still unacknowledged?",
      "type": "n8n-nodes-base.if",
      "position": [
        4400,
        320
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "p1---still-unacknowledged?",
              "operator": {
                "type": "string",
                "operation": "empty",
                "singleValue": true
              },
              "leftValue": "={{ $json['Acknowledged By'] }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "60371218-4e53-4e41-ba0d-2545d3959652",
      "name": "P1 - Escalate to Manager",
      "type": "n8n-nodes-base.slack",
      "onError": "continueRegularOutput",
      "position": [
        4640,
        256
      ],
      "parameters": {
        "text": "=\ud83d\udd34 **ESCALATION: P1 INCIDENT UNACKNOWLEDGED**\n\n**Incident ID:** {{ $json['Incident ID'] }}\n**Service:** {{ $json.Service }}\n**Title:** {{ $json.Title }}\n\n\u23f0 **SLA BREACH:** {{ $json['SLA Minutes'] }} minutes have passed with no acknowledgment.\n\n**AI Assessment:**\n\u2022 Severity: {{ $json['AI Severity'] }}\n\u2022 Risk: {{ $json['Risk Indicators'] }}\n\n**Recommended Owner:** {{ $json['Recommended Assignee'] }}\n\n**Action Required:** Manager intervention needed immediately.",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "name",
          "value": "management-escalation"
        },
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "b08346c0-73ef-4597-bd6c-1b79d1599dc4",
      "name": "P1 - Flag as Escalated",
      "type": "n8n-nodes-base.googleSheets",
      "onError": "continueRegularOutput",
      "position": [
        4640,
        416
      ],
      "parameters": {
        "columns": {
          "value": {
            "Escalated": "Yes",
            "Escalated At": "={{ $now.toISO() }}"
          },
          "mappingMode": "defineBelow"
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Incidents"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": ""
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "3380cc33-6ca4-4f9f-aa81-8d147ef133d2",
      "name": "P2 - Wait 1hr",
      "type": "n8n-nodes-base.wait",
      "position": [
        3488,
        688
      ],
      "parameters": {
        "unit": "minutes",
        "amount": 60
      },
      "typeVersion": 1.1
    },
    {
      "id": "556140d7-12e4-431f-90d8-43646243fc81",
      "name": "P2 - Check Acknowledgment",
      "type": "n8n-nodes-base.googleSheets",
      "onError": "continueRegularOutput",
      "position": [
        3712,
        688
      ],
      "parameters": {
        "options": {},
        "filtersUI": {
          "values": [
            {
              "lookupValue": "={{ $json.incidentId }}",
              "lookupColumn": "Incident ID"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Incidents"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": ""
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "1f74cc62-074a-4ae4-8c57-5ca4dd4946cc",
      "name": "P2 - Still unacknowledged?",
      "type": "n8n-nodes-base.if",
      "position": [
        3936,
        688
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "p2---still-unacknowledged?",
              "operator": {
                "type": "string",
                "operation": "empty",
                "singleValue": true
              },
              "leftValue": "={{ $json['Acknowledged By'] }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "0e814371-86a2-444d-aa97-7e109ac6bf7c",
      "name": "P2 - Escalate to Manager",
      "type": "n8n-nodes-base.slack",
      "onError": "continueRegularOutput",
      "position": [
        4160,
        688
      ],
      "parameters": {
        "text": "=\u26a0\ufe0f **ESCALATION: P2 INCIDENT UNACKNOWLEDGED**\n\n**Incident ID:** {{ $json['Incident ID'] }}\n**Service:** {{ $json.Service }}\n**Title:** {{ $json.Title }}\n\n**SLA exceeded:** 1 hour with no acknowledgment.\n\n**Recommended Owner:** {{ $json['Recommended Assignee'] }}\n\nPlease assign or acknowledge immediately.",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "name",
          "value": "engineering-leads"
        },
        "otherOptions": {}
      },
      "typeVersion": 2.2
    },
    {
      "id": "620a97f6-3060-42a6-987d-06622c1edad8",
      "name": "Acknowledgment Trigger",
      "type": "n8n-nodes-base.webhook",
      "position": [
        320,
        1296
      ],
      "parameters": {
        "path": "incident-acknowledge",
        "options": {},
        "httpMethod": "POST",
        "responseMode": "responseNode"
      },
      "typeVersion": 1.1
    },
    {
      "id": "bf4c13e9-671d-4291-81e2-d0ed730d1e13",
      "name": "Log Acknowledgment",
      "type": "n8n-nodes-base.googleSheets",
      "onError": "continueRegularOutput",
      "position": [
        544,
        1296
      ],
      "parameters": {
        "columns": {
          "value": {
            "Status": "In Progress",
            "Acknowledged At": "={{ $now.toISO() }}",
            "Acknowledged By": "={{ $('Acknowledgment Trigger').item.json.body.acknowledgedBy }}"
          },
          "mappingMode": "defineBelow"
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Incidents"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": ""
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "f5c89ff0-9447-49e9-8e27-f95579ca0be1",
      "name": "Ack Response",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        768,
        1296
      ],
      "parameters": {
        "options": {},
        "respondWith": "json",
        "responseBody": "={\n  \"status\": \"acknowledged\",\n  \"incidentId\": \"{{ $('Acknowledgment Trigger').item.json.body.incidentId }}\",\n  \"acknowledgedBy\": \"{{ $('Acknowledgment Trigger').item.json.body.acknowledgedBy }}\"\n}"
      },
      "typeVersion": 1.1
    },
    {
      "id": "4faafb9b-6163-4e35-9451-b601d75c5d95",
      "name": "Human Feedback Trigger",
      "type": "n8n-nodes-base.webhook",
      "position": [
        304,
        1536
      ],
      "parameters": {
        "path": "incident-feedback",
        "options": {},
        "httpMethod": "POST",
        "responseMode": "responseNode"
      },
      "typeVersion": 1.1
    },
    {
      "id": "e7df0656-75b0-4cd2-aca7-609b36d8372f",
      "name": "Log Human Feedback",
      "type": "n8n-nodes-base.googleSheets",
      "onError": "continueRegularOutput",
      "position": [
        528,
        1536
      ],
      "parameters": {
        "columns": {
          "value": {
            "Human Feedback": "={{ $('Human Feedback Trigger').item.json.body.feedback }}",
            "Correct Severity": "={{ $('Human Feedback Trigger').item.json.body.correctSeverity }}",
            "Feedback Timestamp": "={{ $now.toISO() }}"
          },
          "mappingMode": "defineBelow"
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "AI_Audit_Log"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": ""
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "48c8b2b8-7e4d-4bdf-8300-0c672c0fd6d2",
      "name": "Feedback Response",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        752,
        1536
      ],
      "parameters": {
        "options": {},
        "respondWith": "json",
        "responseBody": "={\n  \"status\": \"feedback_recorded\",\n  \"incidentId\": \"{{ $('Human Feedback Trigger').item.json.body.incidentId }}\",\n  \"thank_you\": \"Feedback logged. This helps improve AI accuracy.\"\n}"
      },
      "typeVersion": 1.1
    },
    {
      "id": "caef4e0a-144a-42f0-9952-e697a64c5d6b",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -368,
        656
      ],
      "parameters": {
        "width": 544,
        "height": 912,
        "content": "## AI Incident Triage System - Two-Agent\n\nThink of this as your automated first responder. Instead of dumping raw alerts into Slack, the system actually thinks before it speaks.\n### How it works\n\n1. Analyze: When an alert hits, Agent 1 pulls the relevant runbook and determines if it\u2019s a \"wake-the-CEO\" P1 or a \"check-it-later\" P3.\n\n2. Coordinate: Agent 2 immediately builds a game plan, listing exactly who to call and what to check first.\n\n3. Escalate: High-priority alerts go to #incidents-critical. If a P1 isn\u2019t acknowledged in 15 minutes, the system pings management automatically.\n\n4. Log: Every decision is tracked in Google Sheets for a perfect audit trail.\n\n### Setup \n\n- [ ] Create a Google Sheet with three tabs: Runbooks, Incidents, and AI_Audit_Log\n- [ ] Add your Google Sheets OAuth2 credentials to all five Google Sheets nodes\n- [ ] Configure Slack credentials and update channel names (#incidents-critical, #incidents, #management-escalation, #engineering-leads)\n- [ ] Add Gemini AI credentials to the two Gemini LLM nodes (or replace with OpenAI/Anthropic)\n- [ ] Add Groq credentials for the fallback LLM nodes\n- [ ] Test the three webhook endpoints: /incident-report, /incident-acknowledge, /incident-feedback\n- [ ] Populate the Runbooks sheet with your services, known issues, and escalation contacts\n\n### Customization\n\nModify severity thresholds in Agent 1's system prompt to match your organization's impact definitions. Adjust SLA timings in wait nodes (currently 15min for P1, 60min for P2). Swap Slack for PagerDuty, Teams, or SMS. Replace Gemini/Groq with OpenAI, Claude, or local models. Customize war room naming and add multi-tier escalation."
      },
      "typeVersion": 1
    },
    {
      "id": "19281cfb-58a1-4c47-8aac-ae9ad2c86d0f",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        240,
        656
      ],
      "parameters": {
        "color": 7,
        "width": 1120,
        "height": 336,
        "content": "## Incident intake and normalization\n\nReceives webhook POST requests, generates unique incident IDs, normalizes data structure, and fetches runbook context from Google Sheets."
      },
      "typeVersion": 1
    },
    {
      "id": "73f1e28a-109b-4197-a7ba-a389272d7dac",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1392,
        656
      ],
      "parameters": {
        "color": 7,
        "width": 1216,
        "height": 528,
        "content": "## Two-agent AI analysis\n\nAgent 1 analyzes severity with confidence scoring, risk indicators, and known issue matching. Agent 2 generates response plans with immediate actions and escalation tiers."
      },
      "typeVersion": 1
    },
    {
      "id": "636bd630-562f-40cc-a4f4-9e806fbb7e35",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2624,
        512
      ],
      "parameters": {
        "color": 7,
        "width": 432,
        "height": 528,
        "content": "## Logging and routing\n\nLogs all incidents to Incidents sheet and AI decisions to AI_Audit_Log for compliance. Routes alerts based on AI-determined severity."
      },
      "typeVersion": 1
    },
    {
      "id": "203ff256-7644-488d-9064-865d5b5a04ac",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3168,
        160
      ],
      "parameters": {
        "color": 7,
        "width": 1696,
        "height": 432,
        "content": "## P1 critical incident path\n\nSends alerts to #incidents-critical, optionally creates war room Slack channel, waits SLA time, and escalates to management if unacknowledged."
      },
      "typeVersion": 1
    },
    {
      "id": "6913f492-d047-40de-a1fd-253edb40ba2f",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3168,
        640
      ],
      "parameters": {
        "color": 7,
        "width": 1232,
        "height": 336,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n## P2 high priority path\n\nSends to #incidents channel, waits 1 hour, escalates to engineering leads if unacknowledged."
      },
      "typeVersion": 1
    },
    {
      "id": "690b3e14-299d-4e44-be46-7a1be4c5c626",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3168,
        1024
      ],
      "parameters": {
        "color": 7,
        "width": 352,
        "height": 352,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n## P3 normal priority\n\nSimple notification to #incidents. No automatic escalation."
      },
      "typeVersion": 1
    },
    {
      "id": "7e048712-074c-449d-8d47-e86569b4ef04",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        240,
        1056
      ],
      "parameters": {
        "color": 7,
        "width": 832,
        "height": 688,
        "content": "## Feedback and acknowledgment webhooks\n\nSeparate endpoints for engineers to acknowledge incidents (updates status) and provide feedback on AI severity decisions (improves accuracy)."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "64e64df3-87fe-44ed-bb3c-2a505076527d",
  "connections": {
    "P2 - Wait 1hr": {
      "main": [
        [
          {
            "node": "P2 - Check Acknowledgment",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Needs War Room?": {
      "main": [
        [
          {
            "node": "P1 - Create War Room",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Log Acknowledgment": {
      "main": [
        [
          {
            "node": "Ack Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Log Human Feedback": {
      "main": [
        [
          {
            "node": "Feedback Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "P1 - Wait SLA Time": {
      "main": [
        [
          {
            "node": "P1 - Check Acknowledgment",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Accept and Continue": {
      "main": [
        [
          {
            "node": "Normalize Incident Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "P1 - Create War Room": {
      "main": [
        [
          {
            "node": "P1 - Wait SLA Time",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "P2 - Send High Alert": {
      "main": [
        [
          {
            "node": "P2 - Wait 1hr",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Route by AI Severity": {
      "main": [
        [
          {
            "node": "P1 - Send Critical Alert",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "P2 - Send High Alert",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "P3 - Send Notification",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analyzer LLM (Gemini)": {
      "ai_languageModel": [
        [
          {
            "node": "Agent 1 - Incident Analyzer",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Build Runbook Context": {
      "main": [
        [
          {
            "node": "Agent 1 - Incident Analyzer",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Runbook Context": {
      "main": [
        [
          {
            "node": "Build Runbook Context",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Analyzer Output": {
      "main": [
        [
          {
            "node": "Agent 2 - Response Coordinator",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process Response Plan": {
      "main": [
        [
          {
            "node": "Log to Incident Tracker",
            "type": "main",
            "index": 0
          },
          {
            "node": "Log AI Decision Audit",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Acknowledgment Trigger": {
      "main": [
        [
          {
            "node": "Log Acknowledgment",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Human Feedback Trigger": {
      "main": [
        [
          {
            "node": "Log Human Feedback",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Incident Report Trigger": {
      "main": [
        [
          {
            "node": "Accept and Continue",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Log to Incident Tracker": {
      "main": [
        [
          {
            "node": "Route by AI Severity",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normalize Incident Data": {
      "main": [
        [
          {
            "node": "Fetch Runbook Context",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analyzer Fallback (Groq)": {
      "ai_languageModel": [
        [
          {
            "node": "Agent 1 - Incident Analyzer",
            "type": "ai_languageModel",
            "index": 1
          }
        ]
      ]
    },
    "Coordinator LLM (Gemini)": {
      "ai_languageModel": [
        [
          {
            "node": "Agent 2 - Response Coordinator",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "P1 - Send Critical Alert": {
      "main": [
        [
          {
            "node": "Needs War Room?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "P1 - Check Acknowledgment": {
      "main": [
        [
          {
            "node": "P1 - Still unacknowledged?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "P2 - Check Acknowledgment": {
      "main": [
        [
          {
            "node": "P2 - Still unacknowledged?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "P1 - Still unacknowledged?": {
      "main": [
        [
          {
            "node": "P1 - Escalate to Manager",
            "type": "main",
            "index": 0
          },
          {
            "node": "P1 - Flag as Escalated",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "P2 - Still unacknowledged?": {
      "main": [
        [
          {
            "node": "P2 - Escalate to Manager",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Agent 1 - Incident Analyzer": {
      "main": [
        [
          {
            "node": "Parse Analyzer Output",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Coordinator Fallback (Groq)": {
      "ai_languageModel": [
        [
          {
            "node": "Agent 2 - Response Coordinator",
            "type": "ai_languageModel",
            "index": 1
          }
        ]
      ]
    },
    "Agent 2 - Response Coordinator": {
      "main": [
        [
          {
            "node": "Process Response Plan",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Know that feeling when a "low priority" ticket turns into a production fire? Or when your on-call rotation starts showing signs of serious burnout from alert overload?

Source: https://n8n.io/workflows/14237/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

⏺ 🚀 How it works

Agent, Anthropic Chat, Output Parser Structured +6
AI & RAG

This n8n workflow orchestrates a powerful suite of AI Agents and automations to manage and optimize various aspects of an e-commerce operation, particularly for platforms like Shopify. It leverages La

Google Sheets, HTTP Request, Slack +10
AI & RAG

Enhance your support, onboarding, and internal knowledge workflows with an intelligent RAG-powered chatbot that responds using live data stored in Google Sheets. 🤖📚 Built for teams that rely on struct

Chat Trigger, Output Parser Structured, Memory Buffer Window +6
AI & RAG

Resume Screening & Behavioral Interviews with Gemini, Elevenlabs, & Notion ATS copy. Uses outputParserStructured, chainLlm, googleDrive, stickyNote. Webhook trigger; 67 nodes.

Output Parser Structured, Chain Llm, Google Drive +9
AI & RAG

Candidate Engagement | Resume Screening | AI Voice Interviews | Applicant Insights

Output Parser Structured, Chain Llm, Google Drive +9