AutomationFlowsAI & RAG › Monitor Cloudflare Incidents and Alert via Slack, Telegram, and Jira

Monitor Cloudflare Incidents and Alert via Slack, Telegram, and Jira

ByTrung Tran @trungtran on n8n.io

Decodo is a powerful public data access platform offering managed web scraping APIs and proxy infrastructure to collect structured web data at scale. It handles proxies, anti-bot protection, JavaScript rendering, retries, and global IP rotation—so you can focus on data, not…

Cron / scheduled trigger★★★★★ complexityAI-powered33 nodesOpenAI ChatAgentSlackTelegramGoogle SheetsOutput Parser StructuredJira@Decodo/N8N Nodes Decodo
AI & RAG Trigger: Cron / scheduled Nodes: 33 Complexity: ★★★★★ AI nodes: yes Added:
Monitor Cloudflare Incidents and Alert via Slack, Telegram, and Jira — n8n workflow card showing OpenAI Chat, Agent, Slack integration

This workflow corresponds to n8n.io template #12086 — 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": "HE3PNecqsN8WiMSP",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Cloudflare Incident Monitoring & Alerting Workflow",
  "tags": [
    {
      "id": "vx2KtjCPUPLpD567",
      "name": "Decodo",
      "createdAt": "2025-09-05T06:01:07.861Z",
      "updatedAt": "2025-09-05T06:01:07.861Z"
    }
  ],
  "nodes": [
    {
      "id": "9e622461-598f-4303-878e-6907b4039a82",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        5072,
        2400
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "minutes",
              "minutesInterval": 30
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "54f835b5-b978-49a8-8314-ebb1a9e869d0",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        7152,
        3120
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-5-mini",
          "cachedResultName": "gpt-5-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "72f99f7c-9dc9-412a-a4fc-6878eeb0745f",
      "name": "CloudFlare OK?",
      "type": "n8n-nodes-base.if",
      "position": [
        5520,
        2400
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "0036f077-51c2-4044-992a-a869c50e3e1a",
              "operator": {
                "type": "array",
                "operation": "empty",
                "singleValue": true
              },
              "leftValue": "={{ $json.data.results[0].content.parseJson().incidents }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "e328505a-34e3-476a-9b28-8f3f8587feea",
      "name": "CloudFlare Alert Bot",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        7072,
        2896
      ],
      "parameters": {
        "text": "=Here is the enriched Cloudflare telemetry bundle. Use the instructions to craft Telegram-safe alerts.\nContext JSON:\n{{ $('UTIL: Prepare Notification Payload').item.json.aiPromptContext }}",
        "options": {
          "systemMessage": "You are an AI assistant that turns Cloudflare incident telemetry into rich yet Telegram-safe alerts.\n\nGOAL\n\t\u2022\tRead the aggregated payload (incidents array, stats, maintenance windows, and degraded components).\n\t\u2022\tSummarize EACH incident that is not fully resolved.\n\t\u2022\tCall out overall stats (counts, impacted components, ongoing maintenances) at the end.\n\t\u2022\tProduce concise, human-friendly messages ready to send to both Telegram and Slack.\n\t\u2022\tAll timestamps must be converted to Singapore time (Asia/Singapore, UTC+8).\n\nINPUT FORMAT\n\t\u2022\tYou will receive JSON with the following structure:\n\t\t\u2022\tincidents[] (enriched incidents)\n\t\t\u2022\tstats (counts, impacted components, dedupe window)\n\t\t\u2022\tmaintenanceWindows[]\n\t\t\u2022\tcomponentStatus (including degraded components)\n\nTIMEZONE RULE\n\t\u2022\tConvert every time you show to Singapore time: UTC+8, timezone name: SGT.\n\t\u2022\tUse this format: YYYY-MM-DD HH:mm:ss SGT\n\nOUTPUT RULES\n\t\u2022\tFor each incident, follow the template provided previously (emoji impact, status, created, updated, component, link).\n\t\u2022\tAfter listing incidents, add a \"Run stats\" footer with counts and any active maintenances.\n\t\u2022\tImpact emoji mapping remains the same as before.\n\t\u2022\tIf there are no incidents (skipNotifications true), output exactly: No active Cloudflare incidents at the moment.\n\nTELEGRAM SAFETY\n\t\u2022\tOutput MUST be plain text only.\n\t\u2022\tAvoid characters that break Telegram parsing (* _ [ ] ( ) ~ \\ > # + = | { }`). Replace them as necessary.\n\nDO NOT\n\t\u2022\tExplain your reasoning.\n\t\u2022\tRepeat the JSON.\n\t\u2022\tMention timezone conversions."
        },
        "promptType": "define"
      },
      "typeVersion": 2.2
    },
    {
      "id": "ee1d93bf-ce60-4928-9c4e-c278ace68024",
      "name": "Is top of hour?",
      "type": "n8n-nodes-base.if",
      "position": [
        5776,
        1936
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "2ec22ee4-5435-4eec-a56c-38132797c88a",
              "operator": {
                "type": "number",
                "operation": "equals"
              },
              "leftValue": "={{ $now.minute }}",
              "rightValue": 0
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "b3009251-13de-4426-9550-fee2c63e6d14",
      "name": "No Operation, do nothing",
      "type": "n8n-nodes-base.noOp",
      "position": [
        6000,
        2128
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "3d9d0727-ec9f-41a8-b062-20003a8eb2a8",
      "name": "Send message via Slack",
      "type": "n8n-nodes-base.slack",
      "position": [
        6000,
        1744
      ],
      "parameters": {
        "text": "\u2705 Cloudflare Status: All systems are operational. No active incidents at the moment.",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "name",
          "value": "#cloudflare-alert"
        },
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.4
    },
    {
      "id": "28e0539c-c932-4f05-a649-e533a47afd8c",
      "name": "Send message via Telegram",
      "type": "n8n-nodes-base.telegram",
      "position": [
        6000,
        1936
      ],
      "parameters": {
        "text": "=\u2705 Cloudflare Status: All systems are operational. No active incidents at the moment.",
        "chatId": "-1003460669186",
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "c0527bc3-75c9-4742-a955-c2e3c59efb1a",
      "name": "Alert team via Telegram",
      "type": "n8n-nodes-base.telegram",
      "position": [
        7424,
        2752
      ],
      "parameters": {
        "text": "={{ $json.output }}",
        "chatId": "-1003460669186",
        "additionalFields": {
          "parse_mode": "HTML",
          "appendAttribution": false
        }
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "18d40d7d-555d-4ebd-8998-3218f577d95a",
      "name": "Send message via Slack1",
      "type": "n8n-nodes-base.slack",
      "position": [
        7424,
        2992
      ],
      "parameters": {
        "text": "={{ $json.output }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "name",
          "value": "#social"
        },
        "otherOptions": {
          "includeLinkToWorkflow": false
        }
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.4
    },
    {
      "id": "57e09a2d-64a7-459a-82cd-29bc781ea38d",
      "name": "Log Incidents",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        6112,
        2800
      ],
      "parameters": {
        "columns": {
          "value": {},
          "schema": [],
          "mappingMode": "autoMapInputData",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1MkYnxLqre-eRocUJ3Etxx2MxdtCU0rdopF2mb6sAF1g/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1MkYnxLqre-eRocUJ3Etxx2MxdtCU0rdopF2mb6sAF1g",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1MkYnxLqre-eRocUJ3Etxx2MxdtCU0rdopF2mb6sAF1g/edit?usp=drivesdk",
          "cachedResultName": "Cloudflare Incidents"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "aa37409e-607f-4c5a-a3b1-0a5039fcd2d6",
      "name": "Enrich Incidents & Score",
      "type": "n8n-nodes-base.code",
      "position": [
        5904,
        2736
      ],
      "parameters": {
        "jsCode": "const payload = $input.first().json || {};\nconst incidents = payload.incidents || [];\nconst components = payload.result?.components || [];\nconst activeMaintenances = payload.scheduled_maintenances || [];\nconst formatter = new Intl.DateTimeFormat('en-SG', {\n  timeZone: 'Asia/Singapore',\n  year: 'numeric',\n  month: '2-digit',\n  day: '2-digit',\n  hour: '2-digit',\n  minute: '2-digit',\n  second: '2-digit',\n  hour12: false,\n});\nconst toSgt = (iso) => {\n  if (!iso) {\n    return null;\n  }\n  return `${formatter.format(new Date(iso))} SGT`;\n};\nconst severityMap = {\n  critical: 4,\n  major: 3,\n  minor: 2,\n  maintenance: 1,\n  none: 1,\n};\nconst emojiMap = {\n  critical: '\ud83d\udd34',\n  major: '\ud83d\udfe0',\n  minor: '\ud83d\udfe1',\n  maintenance: '\ud83d\udd35',\n  none: '\ud83d\udd35',\n};\nconst degradedComponents = components\n  .filter(component => component.status && component.status !== 'operational')\n  .map(component => ({\n    name: component.name,\n    status: component.status,\n    updated_at: component.updated_at || component.updated || null,\n  }));\nconst componentSnapshot = {\n  components: components.map(component => ({\n    name: component.name,\n    status: component.status,\n    group_id: component.group_id || null,\n    updated_at: component.updated_at || component.updated || null,\n  })),\n  degradedComponents,\n  generated_at: new Date().toISOString(),\n};\nconst baseSnapshot = {\n  run_id: `${payload.page?.id || 'cloudflare'}-${Date.now()}`,\n  maintenances: activeMaintenances,\n  component_summary: componentSnapshot,\n};\nif (!incidents.length) {\n  return [\n    {\n      json: {\n        skipNotifications: true,\n        platform_snapshot: baseSnapshot,\n      },\n    },\n  ];\n}\nconst enriched = incidents.map(incident => {\n  const updates = [...(incident.incident_updates || [])].sort((a, b) => {\n    return new Date(b.created_at || b.updated_at || 0) - new Date(a.created_at || a.updated_at || 0);\n  });\n  const latestUpdate = updates[0] || {};\n  const componentNames = ((incident.components || incident.affected_components) || [])\n    .map(component => component.name || component)\n    .filter(Boolean);\n  const impact = incident.impact || 'none';\n  const severityScore = severityMap[impact] || 1;\n  const dedupeKey = `${incident.id}-${incident.status}-${latestUpdate.status || latestUpdate.body || ''}`;\n  return {\n    incident_id: incident.id,\n    name: incident.name,\n    status: incident.status,\n    impact,\n    impact_emoji: emojiMap[impact] || '\ud83d\udd35',\n    severityScore,\n    shortlink: incident.shortlink || '',\n    created_at_sgt: toSgt(incident.created_at),\n    updated_at_sgt: toSgt(incident.updated_at || latestUpdate.updated_at || latestUpdate.created_at),\n    latest_update: latestUpdate.body || 'Awaiting official update',\n    latest_update_status: latestUpdate.status || 'unknown',\n    component_names: componentNames.join(', ') || 'Global',\n    ops_tags: [impact, incident.status, latestUpdate.status || 'pending'],\n    dedupeKey,\n    platform_snapshot: baseSnapshot,\n  };\n});\nreturn enriched;"
      },
      "typeVersion": 2
    },
    {
      "id": "6c2fcc9e-bcf5-4282-bb1a-678d2c830493",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3920,
        1936
      ],
      "parameters": {
        "width": 1040,
        "height": 1280,
        "content": "# Cloudflare Incident Monitoring & Escalation Workflow\n## \ud83d\ude80 Try Decodo \u2014 Web Scraping & Data API (Coupon: **TRUNG**)\n![Decodo Logo](https://s3.ap-southeast-1.amazonaws.com/automatewith.me/decodo-logo-black.jpg)\n**Decodo** is a powerful public data access platform offering managed web scraping APIs and proxy infrastructure to collect structured web data at scale. It handles proxies, anti-bot protection, JavaScript rendering, retries, and global IP rotation\u2014so you can focus on data, not scraping complexity.\n**Why Decodo**\n- Managed **Web Scraping API** with anti-bot bypass & high success rates  \n- Works with JS-heavy sites; outputs JSON/HTML/CSV  \n- Easy integration (Python, Node.js, cURL) for eCommerce, SERP, social & general web data\n**\ud83c\udf9f\ufe0f Special Discount**\nUse coupon **`TRUNG`** to get the **Advanced Scraping API** plan \u2014 ~**23,000 requests for ~$5**.\n\n## Who this workflow is for\nFor **DevOps, SRE, IT Ops, and Platform teams** running production traffic behind Cloudflare who need reliable incident awareness without alert fatigue.\nUse it if you want:\n- Continuous Cloudflare incident monitoring\n- Clear severity-based routing\n- Automatic escalation into JIRA\n- Clean Slack & Telegram notifications\n- Deduplicated, noise-controlled alerts\n## What this workflow does\nThis workflow polls the **Cloudflare Status API**, detects unresolved incidents, scores their impact, and routes them to the right channels.\nHigh-impact incidents are escalated to JIRA.\nLower-impact updates are notified (or skipped) to reduce noise.\n## How it works (high level)\n1. Runs on a fixed schedule (e.g. every 5 minutes)\n2. Fetches current Cloudflare incidents\n3. Stops early if no active issues exist\n4. Normalizes and scores incidents (severity, impact, affected service)\n5. Deduplicates previously-alerted incidents\n6. Builds human-readable notification payloads\n7. Routes by impact:\n   - **High** \u2192 create JIRA incident + notify\n   - **Low** \u2192 notify or suppress\n8. Sends alerts to Slack and Telegram\n## Requirements\n- Decoco Scrapper API credential\n- n8n (self-hosted or Cloud)\n- Cloudflare Status API (public)\n- Slack bot (`chat:write`)\n- Telegram bot + chat ID\n- JIRA project with issue-create permission\n- Optional LLM credentials (summarization/classification)\n## Notes\n- All secrets are stored in **n8n Credentials**\n- Workflow is **idempotent** and safe to rerun\n- No assumptions about root cause or remediation\nBuilt for production-grade incident visibility with **n8n**.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "1124c901-6389-49e9-b7d3-9e10e1d0b17b",
      "name": "UTIL: Filter Already Alerted",
      "type": "n8n-nodes-base.code",
      "position": [
        6192,
        2304
      ],
      "parameters": {
        "jsCode": "const items = $input.all();\nconst staticData = $getWorkflowStaticData('global');\nstaticData.alertCache = staticData.alertCache || {};\nconst now = Date.now();\nconst ttl = 30 * 60 * 1000;\nconst fresh = [];\nfor (const item of items) {\n  const data = item.json || {};\n  if (data.skipNotifications) {\n    continue;\n  }\n  const key = data.dedupeKey || data.incident_id || data.name;\n  if (!key) {\n    continue;\n  }\n  const last = staticData.alertCache[key];\n  if (!last || now - last > ttl) {\n    staticData.alertCache[key] = now;\n    fresh.push({ json: data });\n  }\n}\nif (fresh.length) {\n  return fresh;\n}\nconst snapshot = items[0]?.json?.platform_snapshot || {\n  maintenances: [],\n  component_summary: {},\n};\nreturn [\n  {\n    json: {\n      skipNotifications: true,\n      platform_snapshot: snapshot,\n      dedupeWindowMinutes: 30,\n      note: 'No new incident deltas detected within the dedupe window.',\n    },\n  },\n];"
      },
      "typeVersion": 2
    },
    {
      "id": "24fd2998-10cb-45fa-b4f1-476de2dc1ff0",
      "name": "UTIL: Prepare Notification Payload",
      "type": "n8n-nodes-base.code",
      "position": [
        6576,
        2752
      ],
      "parameters": {
        "jsCode": "const rawItems = $input.all();\nconst snapshot = rawItems[0]?.json?.platform_snapshot || {\n  maintenances: [],\n  component_summary: {},\n};\nconst incidents = rawItems\n  .map(item => item.json)\n  .filter(data => !data.skipNotifications && data.incident_id);\nconst byImpact = incidents.reduce((acc, incident) => {\n  const impact = incident.impact || 'none';\n  acc[impact] = (acc[impact] || 0) + 1;\n  return acc;\n}, {});\nconst impactedComponents = Array.from(new Set(\n  incidents.flatMap(incident => (incident.component_names || '')\n    .split(',')\n    .map(value => value.trim())\n    .filter(Boolean)),\n));\nconst highImpact = incidents.filter(incident => ['critical', 'major'].includes(incident.impact)).length;\nconst stats = {\n  totalIncidents: incidents.length,\n  highImpact,\n  byImpact,\n  impactedComponents,\n  dedupeWindowMinutes: 30,\n  maintenanceWindows: (snapshot.maintenances || []).length,\n  degradedComponents: (snapshot.component_summary?.degradedComponents || []).map(component => component.name),\n};\nconst opsDigestLines = [];\nopsDigestLines.push(`Detected ${stats.totalIncidents} incident(s); ${stats.highImpact} high-impact.`);\nif (impactedComponents.length) {\n  opsDigestLines.push('Impacted components: ' + impactedComponents.join(', '));\n}\nif (stats.degradedComponents.length) {\n  opsDigestLines.push('Cloudflare reports degraded components: ' + stats.degradedComponents.join(', '));\n}\nconst maints = snapshot.maintenances || [];\nif (maints.length) {\n  const maintSummary = maints.map(maint => `${maint.name || maint.id} (${maint.status})`).join(' | ');\n  opsDigestLines.push('Active maintenances: ' + maintSummary);\n}\nopsDigestLines.push(`Dedupe window: ${stats.dedupeWindowMinutes} minutes.`);\nconst skip = incidents.length === 0;\nconst aiPayload = {\n  incidents,\n  stats,\n  maintenanceWindows: snapshot.maintenances || [],\n  componentStatus: snapshot.component_summary || {},\n  generatedAt: new Date().toISOString(),\n};\nreturn [\n  {\n    json: {\n      skipNotifications: skip,\n      incidents,\n      stats,\n      opsDigest: opsDigestLines.join(''), aiPromptContext: JSON.stringify(aiPayload, null, 2),\n    },\n  },\n];"
      },
      "typeVersion": 2
    },
    {
      "id": "a7f692fe-6fad-4ce1-aff4-c1fc92090a65",
      "name": "Should broadcast notifications?",
      "type": "n8n-nodes-base.if",
      "position": [
        6784,
        2752
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "60fd5010-2700-42ff-9b67-f1eea5a15450",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $json.skipNotifications }}",
              "rightValue": true
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "3f1752dc-4f71-4d0a-999f-c9c7652168a9",
      "name": "High Impact Escalation?",
      "type": "n8n-nodes-base.if",
      "position": [
        6544,
        2384
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "or",
          "conditions": [
            {
              "id": "653938ee-6660-49c8-b5a3-887467bcd7dc",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.impact }}",
              "rightValue": "critical"
            },
            {
              "id": "406d13f2-5b00-4d9e-832e-b686879e02df",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.impact }}",
              "rightValue": "major"
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "8ea9c809-bee4-4978-85a9-ee8af6d274e3",
      "name": "Skip Notification Broadcast",
      "type": "n8n-nodes-base.noOp",
      "position": [
        7136,
        2592
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "be4fdd41-b901-4f00-9b50-afa4da0c64a6",
      "name": "Low Impact Buffer",
      "type": "n8n-nodes-base.noOp",
      "position": [
        6784,
        2560
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "2529daf1-b31c-47bf-9a68-3d5b57f176e7",
      "name": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        7120,
        2064
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"summary\": \"\",\n  \"description\": \"\"\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "2f515191-bd3f-4521-afd9-0e410179c755",
      "name": "Support Request Reader Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        6976,
        1840
      ],
      "parameters": {
        "text": "=Below is a Cloudflare Status API incident payload in JSON format.\nAnalyze the incident and extract all information required to create a JIRA ticket.\n\nCloudflare Incident JSON:\n---\n{{ $json.toJsonString() }}\n---",
        "options": {
          "systemMessage": "=You are an intelligent Incident Management Assistant.\n\nYour responsibility is to analyze Cloudflare Status API incident data and transform it into a structured JIRA ticket for internal tracking and escalation.\n\nFollow these rules strictly:\n\n1. Read the entire Cloudflare incident payload.\n2. Identify the incident context, including:\n   - Affected product/service\n   - Impact level\n   - Incident status\n   - Timeline (created, updated, resolved if available)\n3. Determine ownership:\n   - Requested by: \"Cloudflare (Automated Status Monitor)\"\n   - Reported via: Cloudflare Status API\n4. Classify the incident:\n   - Category must be one of:\n     - Incident\n     - Degraded Service\n     - Partial Outage\n     - Major Outage\n   - Priority must be derived from impact:\n     - Critical \u2192 outage / major impact\n     - High \u2192 partial outage / severe degradation\n     - Medium \u2192 minor degradation\n     - Low \u2192 informational / monitoring only\n5. Generate the following JIRA ticket fields:\n   - Reporter\n   - Affected Service(s)\n   - Issue Type\n   - Priority\n   - Summary (short, actionable title)\n   - Description:\n     - What is happening\n     - Who is affected\n     - Current status\n     - Known updates from Cloudflare\n     - Incident link (if provided)\n   - Start time\n   - Last updated time\n   - Resolution status (if available)\n6. Do NOT assume internal root cause or resolution steps.\n7. Do NOT add opinions, speculation, or remediation advice unless explicitly stated in the incident data.\n8. Preserve all important timestamps and identifiers.\n9. Include the **full original Cloudflare incident JSON** at the end for reference.\n\nReturn the output as **clearly structured text sections** suitable for direct mapping into JIRA fields.\n\nDo NOT return JSON.  \nDo NOT format as markdown tables.  \nDo NOT omit critical incident details."
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 1.8
    },
    {
      "id": "5214ec5c-5bc0-4558-97f0-4002cde89d4e",
      "name": "Submit JIRA request ticket",
      "type": "n8n-nodes-base.jira",
      "position": [
        7392,
        1936
      ],
      "parameters": {
        "project": {
          "__rl": true,
          "mode": "list",
          "value": "10003",
          "cachedResultName": "Support"
        },
        "summary": "={{ $json.output.summary }}",
        "issueType": {
          "__rl": true,
          "mode": "list",
          "value": "10005",
          "cachedResultName": "Task"
        },
        "additionalFields": {
          "assignee": {
            "__rl": true,
            "mode": "id",
            "value": "712020:49f03c74-eab4-4903-aee6-662433856e97",
            "__regex": "^([-:a-z0-9]{2,})"
          },
          "priority": {
            "__rl": true,
            "mode": "list",
            "value": "2",
            "cachedResultName": "High"
          },
          "description": "={{ $json.output.description }}"
        }
      },
      "credentials": {
        "jiraSoftwareCloudApi": {
          "name": "<your credential>"
        }
      },
      "executeOnce": false,
      "retryOnFail": false,
      "typeVersion": 1
    },
    {
      "id": "ba5cc4a1-035c-4255-a76e-9d3f0a207ad9",
      "name": "OpenAI Chat Model1",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        6992,
        2064
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "9ecfeb06-566f-4e24-b9d3-32f7d22e8d5e",
      "name": "Send message to IT Support team",
      "type": "n8n-nodes-base.slack",
      "position": [
        7840,
        1936
      ],
      "parameters": {
        "text": "=\ud83d\udce9 *New IT Support Request Submitted*\n\ud83d\udd17 *Track in Jira:* {{ $json[\"Jira base URL\"] }}/browse/{{ $('Submit JIRA request ticket').item.json.key }}\n\ud83d\udce3 Please take action or assign accordingly.",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $json['IT support slack channel'] }}"
        },
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "233096f4-59e2-487f-bb16-a9ac966c42ee",
      "name": "Setup Jira, Slack, Email",
      "type": "n8n-nodes-base.set",
      "position": [
        7616,
        1936
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "d6d4633f-b2b1-4789-a373-6a37e7965203",
              "name": "Jira base URL",
              "type": "string",
              "value": "https://your-company.atlassian.net"
            },
            {
              "id": "eec503dc-6604-4e29-acb8-71dbc2c7ec4f",
              "name": "IT support slack channel",
              "type": "string",
              "value": "social"
            },
            {
              "id": "2e7685df-5c0c-476c-aa2c-bbf72c255dfa",
              "name": "IT support email",
              "type": "string",
              "value": "it@your-company.com"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "230ad70b-caf5-460f-b62b-5608daf6fe18",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        5024,
        2192
      ],
      "parameters": {
        "color": 7,
        "width": 656,
        "height": 576,
        "content": "## SECTION 1 \u2014 Ingestion & Detection\n\nFetches the latest Cloudflare service status on a fixed schedule and checks for active or unresolved incidents.\nIf no incidents are detected, the workflow exits early to avoid unnecessary processing."
      },
      "typeVersion": 1
    },
    {
      "id": "fcc6055e-4963-4429-9c9e-daf48652e5ce",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        5712,
        2576
      ],
      "parameters": {
        "color": 7,
        "width": 688,
        "height": 400,
        "content": "## SECTION 2 \u2014 Enrichment, Scoring & History\n\nNormalizes incident data and derives severity, impact, and affected components.\nAll incidents are logged to support auditing, reporting, and post-incident reviews."
      },
      "typeVersion": 1
    },
    {
      "id": "3b14ea5d-4ddc-40be-9b7a-38235a6672ef",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        5728,
        1616
      ],
      "parameters": {
        "color": 7,
        "width": 672,
        "height": 912,
        "content": "## SECTION 3 \u2014 Noise Control & Deduplication\n\nApplies time-based guards and deduplication rules to prevent repeated or excessive alerts.\nPreviously notified incidents are filtered out to avoid alert fatigue."
      },
      "typeVersion": 1
    },
    {
      "id": "337e3c2e-0af0-4a47-9368-faec248fffd3",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        6912,
        1696
      ],
      "parameters": {
        "color": 7,
        "width": 1104,
        "height": 528,
        "content": "## SECTION 5 \u2014 Notification & Escalation\n\nPrepares human-readable alert payloads and sends notifications to Slack and Telegram.\nCritical incidents are escalated by creating structured JIRA incident tickets for tracking and response.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "f8b21c18-2d49-4e79-8244-3bc7c91d4c64",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        6480,
        2256
      ],
      "parameters": {
        "color": 7,
        "width": 1184,
        "height": 1008,
        "content": "## SECTION 4 \u2014 Decision & Routing\n\nEvaluates incident impact and determines the appropriate handling path.\nHigh-impact incidents are escalated, while low-impact incidents may be buffered or skipped."
      },
      "typeVersion": 1
    },
    {
      "id": "a63fa3c7-5486-4952-bf83-c3c14535dc6d",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        8064,
        1904
      ],
      "parameters": {
        "color": 7,
        "width": 720,
        "height": 176,
        "content": "![Alt text](https://s3.ap-southeast-1.amazonaws.com/automatewith.me/cloudflare-incident-monitoring-and-alerting-workflow-2.png)"
      },
      "typeVersion": 1
    },
    {
      "id": "9f346527-863e-4591-b652-33dcae093b95",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        7712,
        2768
      ],
      "parameters": {
        "color": 7,
        "width": 720,
        "height": 496,
        "content": "![Alt text](https://s3.ap-southeast-1.amazonaws.com/automatewith.me/cloudflare-incident-monitoring-and-alerting-workflow-1.png)"
      },
      "typeVersion": 1
    },
    {
      "id": "c99ac06b-88fa-446e-af9d-15c93ee0c737",
      "name": "Decodo HTTP Request",
      "type": "@decodo/n8n-nodes-decodo.decodo",
      "position": [
        5296,
        2400
      ],
      "parameters": {
        "url": "=https://www.cloudflarestatus.com/api/v2/incidents/unresolved.json"
      },
      "credentials": {
        "decodoApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "callerPolicy": "workflowsFromSameOwner",
    "timeSavedMode": "fixed",
    "availableInMCP": false,
    "executionOrder": "v0"
  },
  "versionId": "28bce785-b90f-475b-8ae3-a708ab49fdf7",
  "connections": {
    "CloudFlare OK?": {
      "main": [
        [
          {
            "node": "Is top of hour?",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Enrich Incidents & Score",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Is top of hour?": {
      "main": [
        [
          {
            "node": "Send message via Telegram",
            "type": "main",
            "index": 0
          },
          {
            "node": "Send message via Slack",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "No Operation, do nothing",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Decodo HTTP Request",
            "type": "main",
            "index": 0
          },
          {
            "node": "CloudFlare OK?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "CloudFlare Alert Bot",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "Support Request Reader Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Decodo HTTP Request": {
      "main": [
        [
          {
            "node": "CloudFlare OK?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "CloudFlare Alert Bot": {
      "main": [
        [
          {
            "node": "Alert team via Telegram",
            "type": "main",
            "index": 0
          },
          {
            "node": "Send message via Slack1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "High Impact Escalation?": {
      "main": [
        [
          {
            "node": "Support Request Reader Agent",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Low Impact Buffer",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Enrich Incidents & Score": {
      "main": [
        [
          {
            "node": "Log Incidents",
            "type": "main",
            "index": 0
          },
          {
            "node": "UTIL: Filter Already Alerted",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Setup Jira, Slack, Email": {
      "main": [
        [
          {
            "node": "Send message to IT Support team",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "Support Request Reader Agent",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Submit JIRA request ticket": {
      "main": [
        [
          {
            "node": "Setup Jira, Slack, Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Support Request Reader Agent": {
      "main": [
        [
          {
            "node": "Submit JIRA request ticket",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "UTIL: Filter Already Alerted": {
      "main": [
        [
          {
            "node": "UTIL: Prepare Notification Payload",
            "type": "main",
            "index": 0
          },
          {
            "node": "High Impact Escalation?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Should broadcast notifications?": {
      "main": [
        [
          {
            "node": "Skip Notification Broadcast",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "CloudFlare Alert Bot",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "UTIL: Prepare Notification Payload": {
      "main": [
        [
          {
            "node": "Should broadcast notifications?",
            "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

Decodo is a powerful public data access platform offering managed web scraping APIs and proxy infrastructure to collect structured web data at scale. It handles proxies, anti-bot protection, JavaScript rendering, retries, and global IP rotation—so you can focus on data, not…

Source: https://n8n.io/workflows/12086/ — 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

This workflow is designed for social media managers, content creators, digital marketers, and entrepreneurs who want to automate the entire lifecycle of creating and publishing short-form video conten

Tool Think, Output Parser Structured, Google Sheets +6
AI & RAG

Stay ahead in your job search with this Automated Job Intelligence System! This workflow scans company career pages daily for new job listings, uses AI to analyze job relevance and seniority levels, a

Output Parser Structured, OpenAI Chat, Agent +4
AI & RAG

This workflow contains community nodes that are only compatible with the self-hosted version of n8n.

Agent, Output Parser Structured, @Decodo/N8N Nodes Decodo +4
AI & RAG

Created by: Peyton Leveillee Last updated: October 2025

OpenAI Chat, Google Sheets, HTTP Request +5
AI & RAG

staying consistent with personal brand content is hard when you're running everything yourself. you know what you want to say — but turning raw thoughts into polished posts takes hours.

Output Parser Structured, Telegram, OpenAI +4