{
  "id": "ebKRgcHH9bQEZU3g",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "AI Brand Crisis Detection & Response Management System",
  "tags": [],
  "nodes": [
    {
      "id": "95dc695e-83ca-43c1-a4d2-01973ab69866",
      "name": "\ud83d\udccc Overview \u2013 How This Workflow Works",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -4224,
        3648
      ],
      "parameters": {
        "color": 2,
        "width": 1092,
        "height": 696,
        "content": "## \ud83d\udea8 PR Crisis AI \u2013 Brand Mention Triage & Response Automation\n\n### How it works\nYour brand monitoring tool (or any external source) sends a webhook with a negative mention, its source, and a sentiment score. GPT-4o-mini classifies the severity as low, medium, or high in one call, then drafts a calm, brand-appropriate holding statement. The incident is logged to Google Sheets and routed by severity: low gets a Telegram ping to the approver; medium adds a Slack alert to the PR team; high fires both plus an exec-channel escalation. A second Telegram trigger waits for the approver's inline-button response \u2014 approve logs it as published-ready, reject marks it discarded \u2014 so no response ever goes live without a human sign-off.\n\n### Setup steps\n1. Connect **OpenAI API** to both AI nodes (severity classifier and response drafter).\n2. Connect **Google Sheets OAuth2** and create a sheet with the columns listed in the Credentials sticky. Replace `YOUR_GOOGLE_SHEET_ID` in all four Sheets nodes.\n3. Connect **Telegram Bot API** and update `YOUR_TELEGRAM_CHAT_ID` in the Format node and in the Notify Approver node.\n4. Connect **Slack OAuth2** and replace `YOUR_SLACK_PR_CHANNEL_ID` (PR team) and `YOUR_SLACK_EXEC_CHANNEL_ID` (execs) in the respective Slack nodes.\n5. Point your brand monitoring tool's webhook to the `Crisis Signal Webhook` production URL.\n6. Activate both triggers."
      },
      "typeVersion": 1
    },
    {
      "id": "8bd98cde-e050-4fcc-8713-57f2eb80fa76",
      "name": "Section \u2013 Signal Intake & AI Triage",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2880,
        3920
      ],
      "parameters": {
        "color": 7,
        "width": 1656,
        "height": 588,
        "content": "## \ud83d\udce1 Signal Intake & AI Triage\nReceives the brand mention payload, normalises the fields into a consistent structure, then runs two sequential AI calls: one to classify severity (low/medium/high) and one to draft a holding statement. The incident is logged to Google Sheets before routing."
      },
      "typeVersion": 1
    },
    {
      "id": "6e7220cc-5312-4a06-9f5e-11907de58032",
      "name": "Section \u2013 Severity Routing & Notifications",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1136,
        3728
      ],
      "parameters": {
        "color": 7,
        "width": 856,
        "height": 1044,
        "content": "## \ud83d\udce3 Severity-Based Routing & Notifications\nThree escalation paths: low sends a Telegram alert to the approver only; medium adds a Slack message to the PR team channel; high fires all three plus an exec-channel alert tagging `@channel` for immediate attention."
      },
      "typeVersion": 1
    },
    {
      "id": "a2fe900a-39ed-4a90-9d80-3d035203e8cc",
      "name": "Section \u2013 Approval Callback Pipeline",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2832,
        4624
      ],
      "parameters": {
        "color": 7,
        "width": 1376,
        "height": 780,
        "content": "## \u2705 Approval Callback Pipeline\nA separate Telegram trigger listens for the approver's inline-button tap. Approve confirms publication-ready status and updates the sheet; Reject marks the draft discarded. No response is published without this human approval step."
      },
      "typeVersion": 1
    },
    {
      "id": "f3c0ab2a-7d20-4bad-89f0-df7b20cd3fc7",
      "name": "Section \u2013 Error Handling",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2800,
        5536
      ],
      "parameters": {
        "color": 7,
        "width": 732,
        "height": 560,
        "content": "## \u26a0\ufe0f Error Handling\nA workflow-level error trigger posts an alert to Slack whenever any node fails. Update the channel ID to your ops or alerts channel before activating."
      },
      "typeVersion": 1
    },
    {
      "id": "7fbcdce7-44e0-4d23-9781-4f9196c034f8",
      "name": "\ud83d\udd11 Credentials & Sheet Setup",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1328,
        5472
      ],
      "parameters": {
        "color": 3,
        "width": 512,
        "height": 336,
        "content": "## \ud83d\udd11 Credentials Required\n- **OpenAI API** \u2014 severity classification + response drafting\n- **Google Sheets OAuth2** \u2014 incident log\n- **Telegram Bot API** \u2014 approver alerts + callback listener\n- **Slack OAuth2** \u2014 PR team + exec escalation channels\n\nSheet columns: `incident_id, brand_name, source, sentiment_score, severity, mention_text, drafted_response, status, detected_at`"
      },
      "typeVersion": 1
    },
    {
      "id": "65698e15-5349-40b8-b382-7ce5539a2e61",
      "name": "Crisis Signal Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -2768,
        4160
      ],
      "parameters": {
        "path": "crisis-signal-trigger",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 2
    },
    {
      "id": "b286171c-f26c-4bd2-b869-556933bccb40",
      "name": "Format Incoming Data",
      "type": "n8n-nodes-base.set",
      "position": [
        -2528,
        4160
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "a1",
              "name": "incident_id",
              "type": "string",
              "value": "={{ $now.toFormat('yyyyMMddHHmmss') }}_{{ Math.floor(Math.random()*1000) }}"
            },
            {
              "id": "a2",
              "name": "brand_name",
              "type": "string",
              "value": "={{ $json.body.brand_name }}"
            },
            {
              "id": "a3",
              "name": "source",
              "type": "string",
              "value": "={{ $json.body.source }}"
            },
            {
              "id": "a4",
              "name": "sentiment_score",
              "type": "number",
              "value": "={{ $json.body.sentiment_score }}"
            },
            {
              "id": "a5",
              "name": "mention_text",
              "type": "string",
              "value": "={{ $json.body.mention_text }}"
            },
            {
              "id": "a6",
              "name": "mention_url",
              "type": "string",
              "value": "={{ $json.body.mention_url }}"
            },
            {
              "id": "a7",
              "name": "detected_at",
              "type": "string",
              "value": "={{ $json.body.detected_at }}"
            },
            {
              "id": "a8",
              "name": "approver_chat_id",
              "type": "string",
              "value": "YOUR_TELEGRAM_CHAT_ID"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "a49688fc-1041-4aea-8da3-e905697bfdb1",
      "name": "Classify Severity",
      "type": "n8n-nodes-base.openAi",
      "position": [
        -2288,
        4160
      ],
      "parameters": {
        "model": "gpt-4o-mini",
        "prompt": {
          "messages": [
            {
              "role": "system",
              "content": "=You classify PR crisis severity. Reply with exactly one word: low, medium, or high. Use 'high' for legal/safety/widespread virality risk, 'medium' for a single upset customer with public visibility, 'low' for a minor complaint with low reach.\"\n            "
            },
            {
              "content": "=Source: {{ $json.source }}\\nSentiment score: {{ $json.sentiment_score }}\\nMention: {{ $json.mention_text }}\"\n            "
            }
          ]
        },
        "options": {
          "temperature": 0
        },
        "resource": "chat",
        "requestOptions": {}
      },
      "typeVersion": 1
    },
    {
      "id": "0513ae93-0930-4a30-a7b5-7c8bf8e4697e",
      "name": "Draft Crisis Response",
      "type": "n8n-nodes-base.openAi",
      "position": [
        -2048,
        4160
      ],
      "parameters": {
        "model": "gpt-4o-mini",
        "prompt": {
          "messages": [
            {
              "role": "system",
              "content": "=You are a PR crisis-response assistant for {{ $('Format Incoming Data').item.json.brand_name }}. This incident has been classified as {{ $json.message.content.trim() }} severity. Draft a short, calm, on-brand holding statement (max 80 words). Do not admit fault before facts are confirmed. For high severity, be more formal and mention that a full investigation is underway. Output only the statement text.\"             "
            },
            {
              "content": "=Source: {{ $('Format Incoming Data').item.json.source }}\\nMention: {{ $('Format Incoming Data').item.json.mention_text }}\\nURL: {{ $('Format Incoming Data').item.json.mention_url }}\"\n           "
            }
          ]
        },
        "options": {},
        "resource": "chat",
        "requestOptions": {}
      },
      "typeVersion": 1
    },
    {
      "id": "1919328e-591e-4dd6-80c5-bb33c3f0aa2e",
      "name": "Log Incident",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -1808,
        4160
      ],
      "parameters": {
        "columns": {
          "value": {
            "source": "={{ $('Format Incoming Data').item.json.source }}",
            "status": "Pending",
            "severity": "={{ $('Classify Severity').item.json.message.content.trim() }}",
            "brand_name": "={{ $('Format Incoming Data').item.json.brand_name }}",
            "detected_at": "={{ $('Format Incoming Data').item.json.detected_at }}",
            "incident_id": "={{ $('Format Incoming Data').item.json.incident_id }}",
            "mention_text": "={{ $('Format Incoming Data').item.json.mention_text }}",
            "sentiment_score": "={{ $('Format Incoming Data').item.json.sentiment_score }}",
            "drafted_response": "={{ $json.message.content }}"
          },
          "schema": [
            {
              "id": "incident_id",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "incident_id",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "brand_name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "brand_name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "source",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "source",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "sentiment_score",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "sentiment_score",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "severity",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "severity",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "mention_text",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "mention_text",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "drafted_response",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "drafted_response",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "detected_at",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "detected_at",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Incidents-demo-sheet"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_GOOGLE_SHEET_ID"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "df19890c-ac7e-4799-ac65-d76e502d4cd5",
      "name": "Route by Severity",
      "type": "n8n-nodes-base.switch",
      "position": [
        -1552,
        4128
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "low",
              "conditions": {
                "options": {
                  "version": 1,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "cond-low",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $('Classify Severity').item.json.message.content.trim().toLowerCase() }}",
                    "rightValue": "low"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "medium",
              "conditions": {
                "options": {
                  "version": 1,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "cond-medium",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $('Classify Severity').item.json.message.content.trim().toLowerCase() }}",
                    "rightValue": "medium"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "high",
              "conditions": {
                "options": {
                  "version": 1,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "cond-high",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $('Classify Severity').item.json.message.content.trim().toLowerCase() }}",
                    "rightValue": "high"
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {
          "fallbackOutput": "extra"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "b261be48-d70b-4085-8b53-9460a52b854d",
      "name": "Notify Approver",
      "type": "n8n-nodes-base.telegram",
      "position": [
        -800,
        3984
      ],
      "parameters": {
        "text": "==\ud83d\udea8 *Crisis Signal \u2014 {{ $json.severity.toUpperCase() }} severity*\n\n*Brand:* {{ $json.brand_name }}\n*Source:* {{ $json.source }}\n*Sentiment score:* {{ $json.sentiment_score }}\n\n*Mention:* {{ $json.mention_text }}\n\n*Drafted response:*\n{{ $json.drafted_response }}",
        "chatId": "={{ $('Format Incoming Data').item.json.approver_chat_id }}",
        "additionalFields": {
          "parse_mode": "Markdown"
        }
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "76d4c77c-9d40-4e81-8817-6865b15c805a",
      "name": "Post to PR Team Channel",
      "type": "n8n-nodes-base.slack",
      "position": [
        -800,
        4288
      ],
      "parameters": {
        "text": "==\ud83d\udea8 [{{ $json.severity.toUpperCase() }}] {{ $json.brand_name }} \u2014 {{ $json.source }}\n\nMention: {{ $json.mention_text }}\n\nDrafted response:\n{{ $json.drafted_response }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_SLACK_PR_CHANNEL_ID",
          "cachedResultName": "your-pr-team-channel"
        },
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "typeVersion": 2.2
    },
    {
      "id": "68fd3937-d1fa-4cef-8fad-4b83c28720e2",
      "name": "Escalate to Execs",
      "type": "n8n-nodes-base.slack",
      "position": [
        -784,
        4544
      ],
      "parameters": {
        "text": "=@channel HIGH SEVERITY crisis signal for {{ $('Format Incoming Data').item.json.brand_name }}. Immediate exec attention needed.\n\nSource: {{ $('Format Incoming Data').item.json.source }}\nMention: {{ $('Format Incoming Data').item.json.mention_text }}\nDraft awaiting approval in Telegram.",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_SLACK_EXEC_CHANNEL_ID",
          "cachedResultName": "your-exec-escalation-channel"
        },
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "typeVersion": 2.2
    },
    {
      "id": "94c21ea6-75d2-4c0f-a9e0-f1d18abb7f08",
      "name": "Approval Callback Listener",
      "type": "n8n-nodes-base.telegramTrigger",
      "position": [
        -2704,
        4944
      ],
      "parameters": {
        "updates": [
          "callback_query"
        ],
        "additionalFields": {}
      },
      "typeVersion": 1.1
    },
    {
      "id": "4bab2531-41ba-483c-84f7-d8b10d0b1d6b",
      "name": "Check Approve or Reject",
      "type": "n8n-nodes-base.if",
      "position": [
        -2464,
        4944
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "cond-approve",
              "operator": {
                "type": "string",
                "operation": "startsWith"
              },
              "leftValue": "={{ $json.callback_query.data }}",
              "rightValue": "approve_"
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "12a7ef52-5cdd-48a1-9742-d080ff126d53",
      "name": "Send Confirmation - Approved",
      "type": "n8n-nodes-base.telegram",
      "position": [
        -2224,
        4848
      ],
      "parameters": {
        "text": "=\u2705 Approved \u2014 publishing now for incident {{ $json.callback_query.data.replace('approve_','') }}.",
        "chatId": "={{ $json.callback_query.message.chat.id }}",
        "additionalFields": {
          "parse_mode": "Markdown"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "f8cedf69-d01c-44bd-9b05-b27aac744986",
      "name": "Update Incident Status - Approved",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -1744,
        4848
      ],
      "parameters": {
        "columns": {
          "value": {
            "status": "Approved",
            "row_number": 0,
            "incident_id": "={{ $('Check Approve or Reject').item.json.callback_query.data.replace('approve_','') }}"
          },
          "schema": [
            {
              "id": "incident_id",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "incident_id",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "brand_name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "brand_name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "source",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "source",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "sentiment_score",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "sentiment_score",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "severity",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "severity",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "mention_text",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "mention_text",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "drafted_response",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "drafted_response",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "detected_at",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "detected_at",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "incident_id"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Incidents-demo-sheet"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_GOOGLE_SHEET_ID"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "2445aa3c-16d0-40cf-8f1d-9eba014086ed",
      "name": "Send Confirmation - Rejected",
      "type": "n8n-nodes-base.telegram",
      "position": [
        -2176,
        5152
      ],
      "parameters": {
        "text": "=\u274c Rejected \u2014 discarding draft for incident {{ $json.callback_query.data.replace('reject_','') }}.",
        "chatId": "={{ $json.callback_query.message.chat.id }}",
        "additionalFields": {
          "parse_mode": "Markdown"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "0ed319d3-7101-4b83-8a4a-2b8e53704e5a",
      "name": "Update Incident Status - Rejected",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -1936,
        5152
      ],
      "parameters": {
        "columns": {
          "value": {
            "status": "Rejected",
            "row_number": 0,
            "incident_id": "={{ $('Check Approve or Reject').item.json.callback_query.data.replace('reject_','') }}"
          },
          "schema": [
            {
              "id": "incident_id",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "incident_id",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "brand_name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "brand_name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "source",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "source",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "sentiment_score",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "sentiment_score",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "severity",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "severity",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "mention_text",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "mention_text",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "drafted_response",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "drafted_response",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "detected_at",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "detected_at",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "incident_id"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Incidents-demo-sheet"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_GOOGLE_SHEET_ID"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "c2325c19-7efd-4a0a-9873-1fa9fdeeadc9",
      "name": "On Workflow Error",
      "type": "n8n-nodes-base.errorTrigger",
      "position": [
        -2672,
        5808
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "6531e4f6-8c14-4dd8-842a-975eb6c8b7e4",
      "name": "Slack \u2013 Post Workflow Error Alert",
      "type": "n8n-nodes-base.slack",
      "position": [
        -2416,
        5808
      ],
      "parameters": {
        "text": "=\ud83d\udea8 *PR Crisis AI Workflow Error*\n\n*Workflow:* {{ $workflow.name }}\n*Failed Node:* {{ $execution.lastNodeExecuted }}\n*Time:* {{ $now.format('MMM D, YYYY \u2013 HH:mm') }}\n*Execution ID:* {{ $execution.id }}\n\nPlease check the n8n execution log and follow up with the PR team manually if needed.",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_SLACK_CHANNEL_ID",
          "cachedResultName": "your-alerts-channel"
        },
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "typeVersion": 2.3
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "0eb9c34c-3725-427d-9c30-056bfa057ea0",
  "nodeGroups": [],
  "connections": {
    "Log Incident": {
      "main": [
        [
          {
            "node": "Route by Severity",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Classify Severity": {
      "main": [
        [
          {
            "node": "Draft Crisis Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "On Workflow Error": {
      "main": [
        [
          {
            "node": "Slack \u2013 Post Workflow Error Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Route by Severity": {
      "main": [
        [
          {
            "node": "Notify Approver",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Notify Approver",
            "type": "main",
            "index": 0
          },
          {
            "node": "Post to PR Team Channel",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Notify Approver",
            "type": "main",
            "index": 0
          },
          {
            "node": "Post to PR Team Channel",
            "type": "main",
            "index": 0
          },
          {
            "node": "Escalate to Execs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Incoming Data": {
      "main": [
        [
          {
            "node": "Classify Severity",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Crisis Signal Webhook": {
      "main": [
        [
          {
            "node": "Format Incoming Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Draft Crisis Response": {
      "main": [
        [
          {
            "node": "Log Incident",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Approve or Reject": {
      "main": [
        [
          {
            "node": "Send Confirmation - Approved",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Send Confirmation - Rejected",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Approval Callback Listener": {
      "main": [
        [
          {
            "node": "Check Approve or Reject",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Confirmation - Approved": {
      "main": [
        [
          {
            "node": "Update Incident Status - Approved",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Confirmation - Rejected": {
      "main": [
        [
          {
            "node": "Update Incident Status - Rejected",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}