AutomationFlowsSlack & Telegram › Triage Brand Crises with Openai, Telegram, Slack, and Google Sheets

Triage Brand Crises with Openai, Telegram, Slack, and Google Sheets

ByRahul Joshi @rahul08 on n8n.io

This workflow receives negative brand mentions via webhook, uses OpenAI to classify crisis severity and draft a holding statement, logs incidents to Google Sheets, and notifies approvers and teams via Telegram and Slack with severity-based escalation plus an approval callback to…

Webhook trigger★★★★☆ complexityAI-powered23 nodesOpenAIGoogle SheetsTelegramSlackTelegram TriggerError Trigger
Slack & Telegram Trigger: Webhook Nodes: 23 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the Error Trigger → 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": "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
          }
        ]
      ]
    }
  }
}

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

This workflow receives negative brand mentions via webhook, uses OpenAI to classify crisis severity and draft a holding statement, logs incidents to Google Sheets, and notifies approvers and teams via Telegram and Slack with severity-based escalation plus an approval callback to…

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

More Slack & Telegram workflows → · Browse all categories →

Related workflows

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

Slack & Telegram

This workflow handles customer order complaints submitted via Telegram by looking up order details in Google Sheets, using OpenAI to classify message sentiment, and routing each case to auto-approval,

Telegram Trigger, Google Sheets, Telegram +3
Slack & Telegram

This workflow handles COD order confirmation and abandoned-cart recovery by combining webhooks, Google Sheets logging, OpenAI message generation, and Telegram messaging with inline buttons, plus Slack

Telegram Trigger, Google Sheets, Telegram +3
Slack & Telegram

This workflow runs a Telegram restaurant ordering flow that uses OpenAI to parse orders and suggest an upsell, sends a Razorpay payment link, confirms paid orders via a Razorpay webhook, logs orders a

Telegram Trigger, OpenAI, Telegram +3
Slack & Telegram

This workflow handles dental clinic patient conversations in Telegram, using OpenAI to answer treatment-plan and general questions, logging bookings and payment plans in Google Sheets, sending automat

Telegram Trigger, Google Sheets, Telegram +3
Slack & Telegram

This workflow uses Google Sheets, OpenAI, Telegram, and Slack to send post-therapy check-in messages, analyze patient replies for sentiment and risk, alert therapists to at-risk responses, and log non

Google Sheets, OpenAI, Telegram +3