AutomationFlowsAI & RAG › Filter Breaking Geopolitical News with AI Scoring & Telegram Alerts

Filter Breaking Geopolitical News with AI Scoring & Telegram Alerts

ByDev Dutta @devdutta on n8n.io

Workflow Name: Geopolitics Breaking News Alert System Author: Devjothi Dutta Category: Productivity, News & Media, AI/Machine Learning Complexity: Medium Setup Time: 45-60 minutes

Cron / scheduled trigger★★★★★ complexityAI-powered30 nodesRSS Feed ReadTelegramAgentOpenAI ChatOutput Parser StructuredData TableHTTP Request
AI & RAG Trigger: Cron / scheduled Nodes: 30 Complexity: ★★★★★ AI nodes: yes Added:

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

This workflow follows the Agent → Datatable 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": "lShjTFAvAhSAuAA6",
  "name": "Geopolitics Breaking News Alert",
  "tags": [],
  "nodes": [
    {
      "id": "7bc7ba9e-31e0-4196-8d00-9f71ff966444",
      "name": "Every 30 Minutes",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -592,
        384
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "minutes",
              "minutesInterval": 30
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "46266983-54ba-4977-b6af-dabc6ee1ed4a",
      "name": "NYT RSS Feed",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        0,
        112
      ],
      "parameters": {
        "url": "https://rss.nytimes.com/services/xml/rss/nyt/World.xml",
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "05342734-972c-49d1-82d7-3622f96f42f1",
      "name": "TOI RSS Feed",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        0,
        240
      ],
      "parameters": {
        "url": "https://timesofindia.indiatimes.com/rssfeedstopstories.cms",
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "2f195f01-5e2e-439b-9954-a25f902f399f",
      "name": "Al Jazeera RSS Feed",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        0,
        368
      ],
      "parameters": {
        "url": "https://www.aljazeera.com/xml/rss/all.xml",
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "13811cd7-80cb-43cf-a18d-ecebfb56eea9",
      "name": "BBC RSS Feed",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        0,
        528
      ],
      "parameters": {
        "url": "http://feeds.bbci.co.uk/news/world/rss.xml",
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "e29a459e-5fbf-4703-bcfc-e389b36d7b89",
      "name": "Dynamic Filter",
      "type": "n8n-nodes-base.code",
      "position": [
        640,
        368
      ],
      "parameters": {
        "jsCode": "// Dynamic Filter Node - Config-Driven Filtering\n  const config = $('Load Config from Google Drive').first().json;\n\n  const primaryKeywords = config.primary_keywords;\n  const secondaryKeywords = config.secondary_keywords;\n\n  const filtered = [];\n\n  for (const item of $input.all()) {\n    const text = `${item.json.title} ${item.json.contentSnippet}`.toLowerCase();\n\n    // Must mention at least one primary keyword\n    const hasPrimary = primaryKeywords.some(kw => text.includes(kw.toLowerCase()));\n\n    // Must mention at least one secondary keyword\n    const hasSecondary = secondaryKeywords.some(kw => text.includes(kw.toLowerCase()));\n\n    if (hasPrimary && hasSecondary) {\n      filtered.push({\n        json: {\n          ...item.json,\n          config: config\n        }\n      });\n    }\n  }\n\n  return filtered;"
      },
      "typeVersion": 2
    },
    {
      "id": "4e7b8918-071d-43da-b39a-68f09d1aa720",
      "name": "Send Breaking News Alert",
      "type": "n8n-nodes-base.telegram",
      "position": [
        2032,
        576
      ],
      "parameters": {
        "text": "=={{ $json.message }}",
        "chatId": "={{ $json.config.telegram_chat_id }}",
        "additionalFields": {
          "parse_mode": "HTML"
        }
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "ba46bf0d-81a8-4ea5-8973-79452159ed0a",
      "name": "Breaking News Analyzer",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1136,
        368
      ],
      "parameters": {
        "text": "={{ \"Analyze this article:\\n\\nTitle: \" + $json.title + \"\\n\\nContent: \" + $json.contentSnippet + \"\\n\\nLink: \" +\n  $json.link + \"\\n\\nSource: \" + $json.source + \"\\n\\nPublished: \" + $json.pubDate }}",
        "options": {
          "systemMessage": "={{ $json.systemPrompt }}"
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "2fd4e417-8ac3-42eb-9a30-c7b9a1346317",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        1104,
        576
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini",
          "cachedResultName": "gpt-4o-mini"
        },
        "options": {
          "temperature": 0.3
        }
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "01953c30-52e2-46cd-8255-ec7373d1ff40",
      "name": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        1312,
        560
      ],
      "parameters": {
        "jsonSchemaExample": "{\n    \"score\": 8,\n    \"category\": \"Trade Policy\",\n    \"alert_topic\": \"India announces new tariffs on Chinese imports\",\n    \"alert_description\": \"Government unveils comprehensive tariff structure affecting electronics and manufacturing sectors\",\n    \"impact\": \"Significant escalation in trade tensions, potential retaliation expected\",\n    \"source\": \"Times of India\",\n    \"timestamp\": \"2025-10-25T20:30:00+05:30\",\n    \"link\": \"https://timesofindia.indiatimes.com/article/12345\",\n    \"should_alert\": true\n  }"
      },
      "typeVersion": 1.3
    },
    {
      "id": "5c161610-bfa8-4da1-a82a-23666d185de6",
      "name": "If",
      "type": "n8n-nodes-base.if",
      "position": [
        1664,
        592
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "8d463a8b-52db-4065-80cd-b6f6ff5ed5ec",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $json.output.should_alert }}",
              "rightValue": {}
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "edda078a-b0be-4ee3-845f-88aa6851416a",
      "name": "SCMP RSS Feed",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        0,
        704
      ],
      "parameters": {
        "url": "https://www.scmp.com/rss/3/feed",
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "95b00893-33a7-4b6c-b365-11c317760351",
      "name": "NDTV RSS Feed",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        0,
        880
      ],
      "parameters": {
        "url": "https://feeds.feedburner.com/ndtvnews-top-stories",
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "393a1952-9bb8-416b-8096-09c8d5b81ff0",
      "name": "Check for Duplicates",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        800,
        368
      ],
      "parameters": {
        "filters": {
          "conditions": [
            {
              "keyName": "article_link",
              "keyValue": "=={{ $json.link }}"
            }
          ]
        },
        "matchType": "allConditions",
        "operation": "rowNotExists",
        "dataTableId": {
          "__rl": true,
          "mode": "list",
          "value": "pYQedxIAvf9PQdAF",
          "cachedResultUrl": "/projects/5Iw2tLn8DOp3x4nk/datatables/pYQedxIAvf9PQdAF",
          "cachedResultName": "analyzed_articles"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "92a6bdd3-bc80-46e7-b0a3-3b806ef3bdc1",
      "name": "Record Analyzed Article",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        1504,
        272
      ],
      "parameters": {
        "columns": {
          "value": {
            "score": "={{ $json.output.score }}",
            "title": "=={{ $json.output.alert_topic }}",
            "analyzed_at": "={{ $now.toISO() }}",
            "article_link": "=={{ $json.output.link }}"
          },
          "schema": [
            {
              "id": "article_link",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "article_link",
              "defaultMatch": false
            },
            {
              "id": "title",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "title",
              "defaultMatch": false
            },
            {
              "id": "analyzed_at",
              "type": "dateTime",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "analyzed_at",
              "defaultMatch": false
            },
            {
              "id": "score",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "score",
              "defaultMatch": false
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "dataTableId": {
          "__rl": true,
          "mode": "list",
          "value": "pYQedxIAvf9PQdAF",
          "cachedResultUrl": "/projects/5Iw2tLn8DOp3x4nk/datatables/pYQedxIAvf9PQdAF",
          "cachedResultName": "analyzed_articles"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "4ff7d6dc-8421-439d-a98a-3e8233dbedd3",
      "name": "Cleanup Old Records",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        1744,
        272
      ],
      "parameters": {
        "filters": {
          "conditions": [
            {
              "keyName": "analyzed_at",
              "keyValue": "={{ $now.minus({days: 7}).toISO() }}",
              "condition": "lt"
            }
          ]
        },
        "options": {},
        "operation": "deleteRows",
        "dataTableId": {
          "__rl": true,
          "mode": "list",
          "value": "pYQedxIAvf9PQdAF",
          "cachedResultUrl": "/projects/5Iw2tLn8DOp3x4nk/datatables/pYQedxIAvf9PQdAF",
          "cachedResultName": "analyzed_articles"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "d339eb01-08c7-4d8b-9ed4-bfb88816f915",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        288,
        304
      ],
      "parameters": {
        "numberInputs": 6
      },
      "typeVersion": 3.2
    },
    {
      "id": "54527b07-b8c7-4744-80c8-257bad8bafb6",
      "name": "Aggregate Alerts",
      "type": "n8n-nodes-base.code",
      "position": [
        1856,
        576
      ],
      "parameters": {
        "jsCode": "// Aggregate all alerts into a single message\n  const items = $input.all();\n\n  if (items.length === 0) {\n    return [];\n  }\n\n  // Get config from first item\n  const config = items[0].json.output.config || items[0].json.config;\n\n  // Build consolidated message\n  let message = `\ud83d\udea8 BREAKING NEWS ALERTS (${items.length} items)\\n\\n`;\n\n  items.forEach((item, index) => {\n    const output = item.json.output;\n\n    message += `\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\\n`;\n    message += `${index + 1}. BREAKING: ${output.category}\\n\\n`;\n    message += `\ud83d\udcf0 Source: ${output.source}\\n`;\n    message += `\ud83d\udca5 Impact: ${output.impact}\\n\\n`;\n    message += `\ud83d\udccc ${output.alert_topic}\\n\\n`;\n    message += `\ud83d\udcc4 ${output.alert_description}\\n\\n`;\n    message += `\ud83d\udd17 Read More: ${output.link}\\n\\n`;\n    message += `\u23f0 Alert Time: ${output.timestamp}\\n`;\n    message += `Score: ${output.score}\\n\\n`;\n  });\n\n  // Return single item with consolidated message AND config\n  return [{\n    json: {\n      message: message,\n      config: config\n    }\n  }];"
      },
      "typeVersion": 2
    },
    {
      "id": "cd47ab51-4722-497e-874a-7b6f727c0616",
      "name": "Dynamic AI Prompt Generator",
      "type": "n8n-nodes-base.code",
      "position": [
        976,
        368
      ],
      "parameters": {
        "jsCode": "// Dynamic AI Prompt Generator\n  const items = $input.all();\n  const results = [];\n\n  for (const item of items) {\n    // Get config from item or Google Drive HTTP Request node\n    const config = item.json.config || $('Load Config from Google Drive').first().json;\n\n    // Build scoring criteria text\n    let criteriaText = '';\n    for (const rule of config.scoring_criteria) {\n      criteriaText += `  \u2022 ${rule.category} (${rule.score_min}-${rule.score_max}): ${rule.description}\\n`;\n    }\n\n    // Generate dynamic system prompt\n    const systemPrompt = `You are a ${config.ai_role}. Analyze RSS articles for breaking news urgency.\n\n  BREAKING NEWS CRITERIA:\n  ${criteriaText}\n  NOT BREAKING (1-4): Routine updates, opinion pieces\n\n  INSTRUCTIONS:\n  You receive: title, contentSnippet, link, source, pubDate\n\n  1. Analyze urgency score (1-10)\n  2. If score < ${config.alert_threshold}: Set should_alert = false\n  3. If score >= ${config.alert_threshold}: Set should_alert = true\n\n  Always return ALL these fields:\n  - score: [1-10 based on breaking news urgency]\n  - category: [Category name matching the score range]\n  - alert_topic: [use the article title]\n  - alert_description: [use contentSnippet]\n  - impact: [your one-sentence impact analysis]\n  - source: [use source field]\n  - timestamp: [use pubDate]\n  - link: [use link field]\n  - should_alert: [false if score < ${config.alert_threshold}, true if score >= ${config.alert_threshold}]`;\n\n    // Add systemPrompt to item\n    results.push({\n      json: {\n        ...item.json,\n        systemPrompt: systemPrompt,\n        config: config\n      }\n    });\n  }\n\n  return results;"
      },
      "typeVersion": 2
    },
    {
      "id": "1fa522e9-1f26-4b4f-98a6-f9815d31c9e4",
      "name": "RSS_Cleanup_Node",
      "type": "n8n-nodes-base.code",
      "position": [
        448,
        368
      ],
      "parameters": {
        "jsCode": " // Strip HTML tags helper function\n  const stripHTML = (html) => {\n    if (!html) return '';\n    return html.replace(/<[^>]*>/g, '').trim();\n  };\n\n  // Process all items and normalize to required fields only\n  const cleanedItems = [];\n\n  for (const item of $input.all()) {\n    const json = item.json;\n\n    // Extract source (try multiple fields with fallback chain)\n    const source = json.creator || json['dc:creator'] || json.author || 'Unknown';\n\n    // Handle empty contentSnippet - fallback to content and strip HTML\n    const contentSnippet = json.contentSnippet || stripHTML(json.content) || '';\n\n    // Use isoDate for consistency (standardized ISO 8601 format)\n    const pubDate = json.isoDate || json.pubDate;\n\n    // Build clean item with ONLY required fields\n    cleanedItems.push({\n      json: {\n        // CRITICAL fields (order matters for readability)\n        link: json.link,                    // Unique identifier\n        title: json.title,                  // Article headline\n        contentSnippet: contentSnippet,     // Clean summary text\n        pubDate: pubDate,                   // Timestamp\n        source: source                      // Source attribution\n      }\n    });\n  }\n\n  return cleanedItems;"
      },
      "typeVersion": 2
    },
    {
      "id": "ad0208aa-904a-40fa-8f76-bd0f67e705cd",
      "name": "Load Config from Google Drive",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -336,
        384
      ],
      "parameters": {
        "url": "https://drive.usercontent.google.com/download?id=15tO_RUnFTDkANVocx0es7k9PZ-VxFLgc&export=download",
        "options": {
          "response": {
            "response": {
              "responseFormat": "json"
            }
          }
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "c8910a76-d742-44ae-bf4b-50fa3ca4bf44",
      "name": "Re-attach Config",
      "type": "n8n-nodes-base.code",
      "position": [
        1504,
        592
      ],
      "parameters": {
        "jsCode": "// Re-attach config that was stripped by AI Agent\n  const items = $input.all();\n  const results = [];\n\n  for (const item of items) {\n    // Get config from earlier in the flow\n    const config = $('Load Config from Google Drive').first().json;\n\n    results.push({\n      json: {\n        ...item.json,\n        config: config\n      }\n    });\n  }\n\n  return results;"
      },
      "typeVersion": 2
    },
    {
      "id": "81d824f6-74e3-49bf-b460-fa8b700a778f",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1264,
        64
      ],
      "parameters": {
        "width": 528,
        "height": 768,
        "content": "# Geopolitics Breaking News Alert System\n\n**Smart filtering + AI scoring for cost-efficient geopolitical monitoring**\n\nThis workflow filters 200+ daily articles down to critical breaking news alerts using keyword filtering and AI urgency scoring.\n\n## \ud83c\udfaf Use Case\nMonitor any geopolitical region (India, China, Middle East, Russia-Ukraine) for breaking news. Smart dual-layer filtering reduces AI costs by 80-90%. AI scores urgency (1-10) to distinguish breaking news from routine coverage. Real-time Telegram alerts for high-priority events only.\n\n## \ud83d\udd27 How it Works\n1. Schedule Trigger runs every 30min (configurable)\n2. Load Config from Google Drive (keywords, scoring rules)\n3. Fetch RSS from 6 international news sources (~200 articles)\n4. Dynamic Filter applies primary + secondary keyword logic (~5 relevant articles)\n5. Check Duplicates to skip already-analyzed articles\n6. AI Analyzer scores geopolitical urgency (1-10 scale)\n7. Send Telegram Alert for consolidated breaking news (score >= threshold)\n\n**Entire documentation available in [Github Repo](https://github.com/devdutta/n8n-geopolitics-breaking-news-alert/tree/master)**\n#. [N8N Workflow Architecture](https://github.com/devdutta/n8n-geopolitics-breaking-news-alert/blob/master/ARCHITECTURE.md)\n#. [Config Files](https://github.com/devdutta/n8n-geopolitics-breaking-news-alert/tree/master/configs)\n#. [Set Up Guide](https://github.com/devdutta/n8n-geopolitics-breaking-news-alert/blob/master/SETUP_GUIDE.md)\n#. [Different Use Cases](https://github.com/devdutta/n8n-geopolitics-breaking-news-alert/blob/master/USE_CASES.md)"
      },
      "typeVersion": 1
    },
    {
      "id": "43e604e7-36b8-4ef9-a413-d13303419394",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -688,
        288
      ],
      "parameters": {
        "width": 288,
        "height": 416,
        "content": "## Scheduling Node\ncurrently set at 30 mins interval but change it as per your requirements"
      },
      "typeVersion": 1
    },
    {
      "id": "761c0e99-29a2-42d1-8d77-8b050e2c5438",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -384,
        288
      ],
      "parameters": {
        "width": 256,
        "height": 416,
        "content": "## [Loading Config Info.](https://github.com/devdutta/n8n-geopolitics-breaking-news-alert/blob/master/ARCHITECTURE.md)\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n[1) Link to different config json files](https://github.com/devdutta/n8n-geopolitics-breaking-news-alert/tree/master/configs)\n[2). Explanation about different config use cases](https://github.com/devdutta/n8n-geopolitics-breaking-news-alert/blob/master/USE_CASES.md)"
      },
      "typeVersion": 1
    },
    {
      "id": "085d279a-499c-4b4a-b1ae-b8dbc6596d21",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        224,
        64
      ],
      "parameters": {
        "width": 864,
        "height": 672,
        "content": "## [Pre-Processing Nodes](https://github.com/devdutta/n8n-geopolitics-breaking-news-alert/blob/master/ARCHITECTURE.md)\n1. Merge Data coming from various RSS Feeds\n2. Clean up info. not required for processing\n3. Use the Primary and Secondary Filters from the Load Config File\n4. Check for Duplicate Articles (i.e articles already triggered in previous runs) \n5. Create the Dynamic Prompt Generator for use in Breaking News Analyzer Node\n"
      },
      "typeVersion": 1
    },
    {
      "id": "6a57e769-e103-4da1-bb49-1997b2594334",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1104,
        64
      ],
      "parameters": {
        "width": 320,
        "height": 672,
        "content": "## Breaking News Analyzer\n1. Used to [Score Articles](https://github.com/devdutta/n8n-geopolitics-breaking-news-alert/blob/master/USE_CASES.md#customizing-scoring-mechanism) for different Alert Levels via the Dynamic System Prompt Generator using Scoring Rules coming from Config Files\n2. Uses AI Agent with Open AI Chat Model running gpt-4o-mini (with temperature set at 0.3 for consistent results)"
      },
      "typeVersion": 1
    },
    {
      "id": "44db6207-6985-44a7-b86b-4cdfcf267b62",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -112,
        64
      ],
      "parameters": {
        "width": 320,
        "height": 960,
        "content": "## Uses 6 RSS News Feeds"
      },
      "typeVersion": 1
    },
    {
      "id": "4e0237b2-ec6b-4494-9b0d-ce3fb7b831d3",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1456,
        64
      ],
      "parameters": {
        "width": 752,
        "height": 352,
        "content": "## Data Insertion and Clean Up Nodes\n1. Inserts all articles into the \"analyzed_articles\" n8n Data Table so that duplicate article checks can be done on next runs\n2. Clean Up Node - removes articles from \"analyzed_articles\" N8N Data Table for articles which are more than 7 days old"
      },
      "typeVersion": 1
    },
    {
      "id": "4ac931f5-7399-4b3c-b731-21a42aeaf52f",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1456,
        432
      ],
      "parameters": {
        "width": 752,
        "height": 304,
        "content": "## Post-Processing Nodes\n1. Re-attach Config - To bring the \"alert_threshold\" (Scoring Threshold) value from the upstream Config Files\n2. If Node - Only pass the Articles >6 score to the True Branch (alert_threshold is set to 6)\n3. Aggregate Alerts- Aggregates All Alerts passing the threshold\n4. Telegram Message Node - Send the aggregated messages to Telegram Chat Node using the Telegram Chat Id again referenced from the Config Files"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "d1251d3e-6269-4e02-a2cc-2a6322d81169",
  "connections": {
    "If": {
      "main": [
        [
          {
            "node": "Aggregate Alerts",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "RSS_Cleanup_Node",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "BBC RSS Feed": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 3
          }
        ]
      ]
    },
    "NYT RSS Feed": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "TOI RSS Feed": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "NDTV RSS Feed": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 5
          }
        ]
      ]
    },
    "SCMP RSS Feed": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 4
          }
        ]
      ]
    },
    "Dynamic Filter": {
      "main": [
        [
          {
            "node": "Check for Duplicates",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate Alerts": {
      "main": [
        [
          {
            "node": "Send Breaking News Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Every 30 Minutes": {
      "main": [
        [
          {
            "node": "Load Config from Google Drive",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "RSS_Cleanup_Node": {
      "main": [
        [
          {
            "node": "Dynamic Filter",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Re-attach Config": {
      "main": [
        [
          {
            "node": "If",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Breaking News Analyzer",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Al Jazeera RSS Feed": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "Check for Duplicates": {
      "main": [
        [
          {
            "node": "Dynamic AI Prompt Generator",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter India Keywords": {
      "main": [
        [
          {
            "node": "Check for Duplicates",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Breaking News Analyzer": {
      "main": [
        [
          {
            "node": "Re-attach Config",
            "type": "main",
            "index": 0
          },
          {
            "node": "Record Analyzed Article",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Record Analyzed Article": {
      "main": [
        [
          {
            "node": "Cleanup Old Records",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "Breaking News Analyzer",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Dynamic AI Prompt Generator": {
      "main": [
        [
          {
            "node": "Breaking News Analyzer",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Load Config from Google Drive": {
      "main": [
        [
          {
            "node": "NYT RSS Feed",
            "type": "main",
            "index": 0
          },
          {
            "node": "TOI RSS Feed",
            "type": "main",
            "index": 0
          },
          {
            "node": "Al Jazeera RSS Feed",
            "type": "main",
            "index": 0
          },
          {
            "node": "BBC RSS Feed",
            "type": "main",
            "index": 0
          },
          {
            "node": "SCMP RSS Feed",
            "type": "main",
            "index": 0
          },
          {
            "node": "NDTV RSS Feed",
            "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

Workflow Name: Geopolitics Breaking News Alert System Author: Devjothi Dutta Category: Productivity, News & Media, AI/Machine Learning Complexity: Medium Setup Time: 45-60 minutes

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

Staying up to date with fast-moving topics like AI, machine learning, or your specific industry can be overwhelming. You either drown in daily noise or miss important developments between weekly diges

HTTP Request, Data Table, OpenAI Chat +5
AI & RAG

This workflow automatically generates and publishes Instagram content using AI.

Agent, Output Parser Structured, Telegram +6
AI & RAG

We’ve released Version 4 of our AI Powered Blog Automation workflow. We heard your complains and made a complete redesign built for serious content creators.

RSS Feed Read, OpenAI Chat, Text Classifier +6
AI & RAG

Automatically scan major financial newswires for biotech catalyst events, score them with AI sentiment analysis, and surface ranked trade candidates — all without manual monitoring.

RSS Feed Read, Data Table, HTTP Request +4
AI & RAG

System Architecture Two integrated N8N workflows providing automated US stock portfolio management through Telegram:

Output Parser Autofixing, OpenAI Chat, Perplexity +10