AutomationFlowsSlack & Telegram › Smart RSS News Alert System with Deepseek AI and Slack Notifications

Smart RSS News Alert System with Deepseek AI and Slack Notifications

ByȚugui Dragoș @tuguidragos on n8n.io

This workflow fetches articles from any RSS feed, processes them with an AI model (DeepSeek), and sends only the most relevant alerts directly to Slack. Normalizes and deduplicates RSS items Extracts article text and cleans HTML Summarizes and classifies with AI (sentiment +…

Event trigger★★★★☆ complexityAI-powered13 nodesLm Chat Deep SeekHTTP RequestChain LlmSlackRss Feed Read Trigger
Slack & Telegram Trigger: Event Nodes: 13 Complexity: ★★★★☆ AI nodes: yes Added:
Smart RSS News Alert System with Deepseek AI and Slack Notifications — n8n workflow card showing Lm Chat Deep Seek, HTTP Request, Chain Llm integration

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

This workflow follows the Chainllm → HTTP Request 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": "cZqsFsT0dT7XJO3K",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "RSS AI News Slack Automation v010925",
  "tags": [
    {
      "id": "7ASMGI4lVr4Eo8rL",
      "name": "tuguidragos.com",
      "createdAt": "2025-08-23T19:10:40.177Z",
      "updatedAt": "2025-08-23T19:10:40.177Z"
    },
    {
      "id": "KBQZBD4R6LVuuFK2",
      "name": "slack-alerts",
      "createdAt": "2025-09-01T16:14:22.027Z",
      "updatedAt": "2025-09-01T16:14:22.027Z"
    },
    {
      "id": "NtEM4qJBPpIvfcPu",
      "name": "automation",
      "createdAt": "2025-08-31T21:12:32.130Z",
      "updatedAt": "2025-08-31T21:12:32.130Z"
    },
    {
      "id": "kcwb9hV3Q0yE899g",
      "name": "ai-analysis",
      "createdAt": "2025-09-01T16:14:14.257Z",
      "updatedAt": "2025-09-01T16:14:14.257Z"
    },
    {
      "id": "n3yKbZ1k0G32PsQK",
      "name": "rss",
      "createdAt": "2025-09-01T16:14:02.175Z",
      "updatedAt": "2025-09-01T16:14:02.175Z"
    },
    {
      "id": "t2EcIvqmhXhIFZHS",
      "name": "news",
      "createdAt": "2025-09-01T16:14:05.043Z",
      "updatedAt": "2025-09-01T16:14:05.043Z"
    }
  ],
  "nodes": [
    {
      "id": "1ef0840b-0b56-4f2e-911f-2c125ec88860",
      "name": "DeepSeek Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatDeepSeek",
      "position": [
        1672,
        -672
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "deepSeekApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "1bb5f3f8-d8b7-4804-a80e-4dadb448acbb",
      "name": "normalize & hash",
      "type": "n8n-nodes-base.code",
      "position": [
        480,
        -896
      ],
      "parameters": {
        "jsCode": "function fnv1a(str) {\n  let h = 0x811c9dc5;\n  for (let i = 0; i < str.length; i++) {\n    h ^= str.charCodeAt(i);\n    h += (h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24);\n  }\n  return (h >>> 0).toString(16);\n}\n\nreturn items.map(item => {\n  const url = item.json.link || item.json.url || '';\n  const title = item.json.title || '';\n  const content = (item.json.content || item.json['content:encoded'] || item.json.contentSnippet || '').toString();\n\n  const text = [title, content]\n    .join('\\n')\n    .replace(/<[^>]+>/g, ' ')\n    .replace(/\\s+/g, ' ')\n    .trim();\n\n  item.json.url = url;\n  item.json.title = title;\n  item.json.text_rss = text.slice(0, 6000);\n  item.json.url_hash = fnv1a(String(url).toLowerCase());\n  return item;\n});"
      },
      "typeVersion": 2
    },
    {
      "id": "f3f640db-0c04-42ca-9cb7-fb5e8e24a8af",
      "name": "parse HTML",
      "type": "n8n-nodes-base.code",
      "position": [
        704,
        -896
      ],
      "parameters": {
        "jsCode": "const keepDays = 14;\nconst maxEntries = 800;\nconst now = Date.now();\n\nconst store = $getWorkflowStaticData('global');\nif (!store.seen) store.seen = {};\n\nreturn items.map(item => {\n  const key = item.json.url_hash;\n  const isNew = !store.seen[key];\n  store.seen[key] = now;\n\n  for (const [k, t] of Object.entries(store.seen)) {\n    if (now - t > keepDays * 86400000) delete store.seen[k];\n  }\n  const entries = Object.entries(store.seen);\n  if (entries.length > maxEntries) {\n    entries.sort((a,b) => a[1] - b[1]);\n    for (let i = 0; i < entries.length - maxEntries; i++) delete store.seen[entries[i][0]];\n  }\n\n  item.json._isNew = isNew;\n  return item;\n});"
      },
      "typeVersion": 2
    },
    {
      "id": "9ce66c28-7b0e-49e9-bf49-5f0086b4a127",
      "name": "New?",
      "type": "n8n-nodes-base.if",
      "position": [
        928,
        -896
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "1ae4fafc-43ff-41d7-8796-d26fe6ba33e7",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{$json[\"_isNew\"]}}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "880f6698-0a30-4e65-8401-7d64ac043fe4",
      "name": "fetch article",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1152,
        -896
      ],
      "parameters": {
        "url": "={{$json[\"url\"]}}",
        "options": {
          "timeout": 8000,
          "response": {
            "response": {
              "responseFormat": "text"
            }
          }
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "cf2066e8-5f49-4688-a5a0-2c0d7c191d36",
      "name": "analyze with LLM",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        1600,
        -896
      ],
      "parameters": {
        "text": "=You are a precise news triager. Summarize (<=120 words), sentiment (positive|negative|neutral), up to 6 keywords, flags from [funding, acquisition, partnership, product_launch, regulation, hiring].\n\nTITLE: {{ $('parse HTML').item.json.title }}\nURL: {{ $('parse HTML').item.json.link }}\nTEXT: {{$json[\"text_for_llm\"]}}\n\nReturn JSON only:\n{\"summary\":\"\",\"sentiment\":\"\",\"keywords\":[],\"flags\":[]}",
        "batching": {},
        "promptType": "define"
      },
      "typeVersion": 1.7
    },
    {
      "id": "ae6ca7e3-efac-4bb7-a161-423739d1ec83",
      "name": "parse LLM JSON",
      "type": "n8n-nodes-base.code",
      "position": [
        1952,
        -896
      ],
      "parameters": {
        "jsCode": "return items.map(item => {\n  const raw = item.json.text || item.json.data || item.json.output || '';\n  let o = {};\n  try { o = typeof raw === 'string' ? JSON.parse(raw) : raw; } catch {}\n  item.json.summary   = o.summary || '';\n  item.json.sentiment = (o.sentiment || 'neutral').toLowerCase();\n  item.json.keywords  = Array.isArray(o.keywords) ? o.keywords : [];\n  item.json.flags     = Array.isArray(o.flags) ? o.flags : [];\n  return item;\n});"
      },
      "typeVersion": 2
    },
    {
      "id": "ccec8360-a00f-486e-a3c6-ef482a04b68c",
      "name": "Relevant?",
      "type": "n8n-nodes-base.if",
      "position": [
        2176,
        -896
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "or",
          "conditions": [
            {
              "id": "ef132948-33d8-475a-b876-a7c4cf1ac302",
              "operator": {
                "type": "string",
                "operation": "notEquals"
              },
              "leftValue": "={{$json[\"sentiment\"]}}",
              "rightValue": "neutral"
            },
            {
              "id": "dd76bbc8-a056-4f58-a75f-1d5a38220224",
              "operator": {
                "type": "string",
                "operation": "contains"
              },
              "leftValue": "={{$json[\"flags\"].join(\",\")}}",
              "rightValue": "acquisition"
            },
            {
              "id": "1f015b50-723d-4e58-943e-7cda07bd25f1",
              "operator": {
                "type": "string",
                "operation": "contains"
              },
              "leftValue": "={{$json[\"flags\"].join(\",\")}}",
              "rightValue": "funding"
            },
            {
              "id": "5db4476c-c8ee-475d-9d0e-1b267b362fa3",
              "operator": {
                "type": "string",
                "operation": "contains"
              },
              "leftValue": "={{$json[\"flags\"].join(\",\")}}",
              "rightValue": "product_launch"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "be7cd945-61aa-4512-9d3d-28f8ce4cbfad",
      "name": "send to Slack",
      "type": "n8n-nodes-base.slack",
      "position": [
        2400,
        -896
      ],
      "parameters": {
        "text": "=*News Alert* \ud83d\udcf0  \n*{{ $('RSS Feed').item.json.title }}*  \n{{$json[\"summary\"]}}  \n\nSentiment: {{$json[\"sentiment\"]}}  \nFlags: {{ $json[\"flags\"].join(\", \") || \"\u2014\" }}  \n\n<{{ $('RSS Feed').item.json.link }}>",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "id",
          "value": "ID"
        },
        "otherOptions": {
          "includeLinkToWorkflow": false
        }
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "notesInFlow": true,
      "typeVersion": 2.3
    },
    {
      "id": "44220e76-0e66-43e3-8c4d-f4b0ae6d16e1",
      "name": "RSS Feed",
      "type": "n8n-nodes-base.rssFeedReadTrigger",
      "position": [
        256,
        -896
      ],
      "parameters": {
        "feedUrl": "https://techcrunch.com/feed/",
        "pollTimes": {
          "item": [
            {
              "hour": 9
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "80032ebb-5641-4c04-8aed-ee82e7b23f9a",
      "name": "Prepare LLM Input",
      "type": "n8n-nodes-base.code",
      "position": [
        1376,
        -896
      ],
      "parameters": {
        "jsCode": "return items.map(item => {\n  const html = item.json.data || item.json.body || '';\n  const plain = html\n    .replace(/<script[\\s\\S]*?<\\/script>/gi, ' ')\n    .replace(/<style[\\s\\S]*?<\\/style>/gi, ' ')\n    .replace(/<[^>]+>/g, ' ')\n    .replace(/\\s+/g, ' ')\n    .trim();\n\n  const txt = (plain && plain.length > 500 ? plain : item.json.text_rss).slice(0, 9000);\n  item.json.text_for_llm = txt;\n  item.json.data = txt;\n  return item;\n});"
      },
      "typeVersion": 2
    },
    {
      "id": "bd11a1a1-ad63-46ec-89d7-f07e3fc2b501",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        256,
        -1104
      ],
      "parameters": {
        "color": 4,
        "width": 432,
        "content": "##  How it works\n- Collects news from RSS feeds  \n- Extracts and cleans article text  \n- Sends text to LLM for analysis  \n- Filters only relevant content  \n- Posts alerts directly to Slack  "
      },
      "typeVersion": 1
    },
    {
      "id": "94b2ba0e-3e3d-4a65-8ce8-276a106f4f16",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        256,
        -736
      ],
      "parameters": {
        "color": 4,
        "width": 432,
        "content": "##  Setup steps\n1. Add your RSS feed URL in the **RSS Feed** node  \n2. Configure your Slack Bot Token in the **Send to Slack** node  \n3. Add your LLM (DeepSeek/OpenAI) API key in the **analyze with LLM** node  \n4. Save & activate the workflow  "
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "6fb7c8f1-01e6-4fa3-9ba6-71f70ab0d242",
  "connections": {
    "New?": {
      "main": [
        [
          {
            "node": "fetch article",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "RSS Feed": {
      "main": [
        [
          {
            "node": "normalize & hash",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Relevant?": {
      "main": [
        [
          {
            "node": "send to Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "parse HTML": {
      "main": [
        [
          {
            "node": "New?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "fetch article": {
      "main": [
        [
          {
            "node": "Prepare LLM Input",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "send to Slack": {
      "main": [
        []
      ]
    },
    "parse LLM JSON": {
      "main": [
        [
          {
            "node": "Relevant?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "analyze with LLM": {
      "main": [
        [
          {
            "node": "parse LLM JSON",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "normalize & hash": {
      "main": [
        [
          {
            "node": "parse HTML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare LLM Input": {
      "main": [
        [
          {
            "node": "analyze with LLM",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "DeepSeek Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "analyze with LLM",
            "type": "ai_languageModel",
            "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 fetches articles from any RSS feed, processes them with an AI model (DeepSeek), and sends only the most relevant alerts directly to Slack. Normalizes and deduplicates RSS items Extracts article text and cleans HTML Summarizes and classifies with AI (sentiment +…

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

Test Webhooks in n8n Without Changing WEBHOOK_URL (PostBin & BambooHR Example). Uses manualTrigger, stickyNote, httpRequest, postBin. Event-driven trigger; 58 nodes.

HTTP Request, Post Bin, Debug Helper +6
Slack & Telegram

Story Generation – Your idea is transformed into a narrative split into scenes using DeepSeek LLM. Visuals – Each scene is illustrated with AI images via Replicate, then animated into cinematic video

Lm Chat Deep Seek, Output Parser Structured, Chain Llm +4
Slack & Telegram

🧩 What this template does

HTTP Request, Slack, DeepL +3
Slack & Telegram

The Recap AI - VEO 3 Bigfoot Video. Uses formTrigger, lmChatAnthropic, chainLlm, slack. Event-driven trigger; 26 nodes.

Form Trigger, Anthropic Chat, Chain Llm +4
Slack & Telegram

This workflow is designed for n8n users who manage multiple production workflows and want to: Receive intelligent, actionable error alerts instead of raw stack traces Understand root causes without ma

Error Trigger, Chain Llm, Gmail +5