n8n Post New Articles from Feeds to Slack Channel

Overview

Type: AI Workflow
Node Types: code, cron, slack, stickyNote, googleSheets, rssFeedRead, string, main
Estimated Time: 8 min
Complexity: ⭐⭐⭐ Complex

📄 n8n Post New Articles from Feeds to Slack Channel

This n8n Post New Articles from Feeds to Slack Channel workflow automates the discovery and sharing of newly published articles from multiple RSS feeds. It checks for previously posted content to avoid duplicates, and then publishes only new articles to a designated Slack channel. All posted articles are logged in a Google Sheet for future reference.

🔧 Workflow Steps:

  1. Trigger Workflow: Uses a cron node to trigger the flow daily at 7 AM.
  2. Get Article Feeds: Reads RSS feed URLs from the Feeds tab of a Google Sheet.
  3. Read Latest Articles: Pulls articles from each feed URL using the RSS node.
  4. Get Historical Posts: Fetches previously posted article links from the Posted Articles tab of the same sheet.
  5. Filter Unpublished Articles: Uses a Code node to remove articles that have already been posted.
  6. Append New Articles: Logs the newly posted articles to the sheet to prevent reposting.
  7. Post to Slack: Sends each new article’s title, link, and publish date to a Slack channel.

🎯 Use Cases:

  • Internal team news digests
  • Industry trend monitoring
  • Curated content feeds
  • Marketing updates automation

🛠️ Required Credentials:

  • ✅ Google Sheets OAuth2 (for both reading and writing)
  • ✅ Slack OAuth2 (to send messages to a channel)

⚠️ Notes:

  • Ensure your Google Sheet has two tabs: Feeds (with title & link), and Posted Articles (with title, link, pubDate)
  • Slack channel ID should be correctly configured in the Slack node

Workflow Editor Screenshot

Workflow Screenshot

Workflow JSON Code

{
  "id": "G452NfcbwAErVDRu",
  "meta": {
    "instanceId": "05cd306a73f97150c796adf49d28dcc97084b722b0b212b8c228ea8b71d87571",
    "templateCredsSetupCompleted": true
  },
  "name": "Post New Articles from Feeds to Slack Channel",
  "tags": [
    {
      "id": "HKMgMooCXhG1RvQ4",
      "name": "RSS",
      "createdAt": "2025-06-25T20:39:25.066Z",
      "updatedAt": "2025-06-25T20:39:25.066Z"
    },
    {
      "id": "LrtcE3ptvaKdYplW",
      "name": "Slack",
      "createdAt": "2025-06-25T20:39:34.824Z",
      "updatedAt": "2025-06-25T20:39:34.824Z"
    },
    {
      "id": "msIodL6e7sVaa5aZ",
      "name": "Google Sheets",
      "createdAt": "2025-06-25T20:39:20.673Z",
      "updatedAt": "2025-06-25T20:39:20.673Z"
    },
    {
      "id": "mv8twTYqHvotykOz",
      "name": "Filter",
      "createdAt": "2025-06-25T20:39:31.349Z",
      "updatedAt": "2025-06-25T20:39:31.349Z"
    }
  ],
  "nodes": [
    {
      "id": "5555a9ce-26d1-45a3-9672-5f54b0cf28a3",
      "name": "Filter Unpublished Articles",
      "type": "n8n-nodes-base.code",
      "notes": "Filter previously published articles from those received from the feeds.",
      "position": [
        -460,
        -340
      ],
      "parameters": {
        "jsCode": "const sheetLinks = $('Get Historically Posted Articles from Google Sheet').all().map(row => row.json.link);\nconst articles = $('Read Latest Articles from Feeds').all();\nreturn articles.filter(item => !sheetLinks.includes(item.json.link));              "
      },
      "notesInFlow": true,
      "typeVersion": 2,
      "alwaysOutputData": true
    },
    {
      "id": "235db786-a37c-4f70-9fb8-a23903399056",
      "name": "Trigger Workflow",
      "type": "n8n-nodes-base.cron",
      "notes": "cron-based Workflow trigger. Recommend once per day.",
      "position": [
        -1340,
        -340
      ],
      "parameters": {
        "triggerTimes": {
          "item": [
            {
              "hour": 7
            }
          ]
        }
      },
      "notesInFlow": true,
      "typeVersion": 1
    },
    {
      "id": "195bea58-205a-4d30-bab0-ef137b157ab5",
      "name": "Post New Articles to Slack Channel",
      "type": "n8n-nodes-base.slack",
      "notes": "Post new articles to Slack Channel.",
      "position": [
        -20,
        -340
      ],
      "webhookId": "637dea4d-c4e0-4369-93bb-f98268950d65",
      "parameters": {
        "text": "=*{{$json[\"title\"]}}* | {{$json[\"link\"]}} _Published: {{$json[\"pubDate\"]}}_",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C09281Y80AH",
          "cachedResultName": "daily-industry-news-automation"
        },
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "notesInFlow": true,
      "typeVersion": 2.3
    },
    {
      "id": "e1ea7e51-5f0f-4089-a4c0-9308bc72c85a",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2340,
        -420
      ],
      "parameters": {
        "width": 900,
        "height": 1380,
        "content": "# 📄 Post New Articles from Feeds to Slack Channel\n\n## 🧠 What This Workflow Does\n\nThis workflow automates the discovery and sharing of fresh articles from a curated list of RSS feeds. It performs the following steps:\n\n1. **Reads a list of RSS feed URLs** from a Google Sheet (`Feeds` tab).\n2. **Fetches the latest articles** from each feed.\n3. **Checks for duplicates** against previously published links stored in another sheet (`Posted Articles` tab).\n4. **Filters out already shared articles**.\n5. **Posts the new articles** to a designated Slack channel with formatted titles and links.\n6. **Logs the newly shared articles** back into the Google Sheet to prevent duplicates.\n\n---\n\n## 🛠️ Prerequisites\n\nTo use this workflow, you must have:\n\n- ✅ **Google Sheets** OAuth2 credentials set up in n8n  \n  (Used to access and update the RSS feed and post history sheets)\n\n- ✅ **Slack** OAuth2 credentials  \n  (Used to post messages to a specific Slack channel)\n\n- ✅ **A Google Spreadsheet** with:\n  - `Feeds` tab – Columns: `title`, `link`  \n  - `Posted Articles` tab – Columns: `title`, `link`, `pubDate`\n\n---\n\n## 🔧 Environment Variables or Custom Values\n\nYou will need to set the following n8n variable or replace with direct input:\n\n- `{{$vars.Daily_Industry_News_Automation_Google_Sheet}}`:  \n  Reference to the Google Sheet Document ID (you can use a static ID if preferred)\n\nAlso update:\n- Slack `channelId`: Replace with your actual Slack channel ID if not dynamically referenced\n\n---\n\n## ⏰ Trigger & Scheduling\n\n- **Trigger type**: `Cron` node  \n- **Default schedule**: Every day at **7:00 AM**\n\nYou can modify this in the **“Trigger Workflow”** node to suit your own schedule.\n\n---\n\n## 🎯 Intended Use Case\n\nThis workflow is ideal for:\n\n- Marketing teams curating daily or weekly news digests\n- Founders or industry professionals monitoring sector updates\n- Automating internal Slack news updates\n- Avoiding duplicate content when sourcing from multiple feeds"
      },
      "typeVersion": 1
    },
    {
      "id": "146f4c93-a72c-4356-99ab-bcbc7747e671",
      "name": "Get Article Feeds",
      "type": "n8n-nodes-base.googleSheets",
      "notes": "Get a list of RSS feeds to poll from the Feeds Google Sheet (title, link).",
      "position": [
        -1120,
        -340
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1768028583,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1HIldK5vDx2luvmYEstU2PQzSS68xBrpp7lJ-8rQb2No/edit#gid=1768028583",
          "cachedResultName": "Feeds"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "={{$vars.Daily_Industry_News_Automation_Google_Sheet}}"
        }
      },
      "notesInFlow": true,
      "typeVersion": 4.6,
      "alwaysOutputData": true
    },
    {
      "id": "3a2f3d00-333f-477f-8634-1b3c703d4061",
      "name": "Read Latest Articles from Feeds",
      "type": "n8n-nodes-base.rssFeedRead",
      "notes": "Get articles from each feed in Google Sheet.",
      "position": [
        -900,
        -340
      ],
      "parameters": {
        "url": "={{ $json.link }}",
        "options": {}
      },
      "notesInFlow": true,
      "typeVersion": 1.2,
      "alwaysOutputData": true
    },
    {
      "id": "74fec81d-bd50-4cce-87d5-fa6808658581",
      "name": "Get Historically Posted Articles from Google Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "notes": "Get a list of articles previously posted from Posted Articles Google Sheet (title, link, pubDate).",
      "position": [
        -680,
        -340
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1HIldK5vDx2luvmYEstU2PQzSS68xBrpp7lJ-8rQb2No/edit#gid=0",
          "cachedResultName": "Posted Articles"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "={{$vars.Daily_Industry_News_Automation_Google_Sheet}}"
        }
      },
      "executeOnce": true,
      "notesInFlow": true,
      "typeVersion": 4.6,
      "alwaysOutputData": true
    },
    {
      "id": "f0c01201-06f4-4154-8010-f134e5506f27",
      "name": "Append New Articles to Google Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "notes": "Append the un-published articles to the Published Articles Google Sheet.",
      "position": [
        -240,
        -340
      ],
      "parameters": {
        "columns": {
          "value": {
            "link": "={{ $json.link }}",
            "title": "={{ $json.title }}",
            "pubDate": "={{ $json.pubDate }}"
          },
          "schema": [
            {
              "id": "title",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "link",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "link",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "pubDate",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "pubDate",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "creator",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "creator",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "content:encoded",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "content:encoded",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "content:encodedSnippet",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "content:encodedSnippet",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "dc:creator",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "dc:creator",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "content",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "content",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "contentSnippet",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "contentSnippet",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "guid",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "guid",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "categories",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "categories",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "isoDate",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "isoDate",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "date",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "author",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "author",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "dc:date",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "dc:date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "comments",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "comments",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1HIldK5vDx2luvmYEstU2PQzSS68xBrpp7lJ-8rQb2No/edit#gid=0",
          "cachedResultName": "Posted Articles"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "={{$vars.Daily_Industry_News_Automation_Google_Sheet}}"
        }
      },
      "executeOnce": false,
      "notesInFlow": true,
      "typeVersion": 4.6,
      "alwaysOutputData": true
    }
  ],
  "active": true,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "2799c1bc-9306-4ff8-b6e9-8341fac3cfdb",
  "connections": {
    "Trigger Workflow": {
      "main": [
        [
          {
            "node": "Get Article Feeds",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Article Feeds": {
      "main": [
        [
          {
            "node": "Read Latest Articles from Feeds",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Unpublished Articles": {
      "main": [
        [
          {
            "node": "Append New Articles to Google Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read Latest Articles from Feeds": {
      "main": [
        [
          {
            "node": "Get Historically Posted Articles from Google Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Append New Articles to Google Sheet": {
      "main": [
        [
          {
            "node": "Post New Articles to Slack Channel",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Historically Posted Articles from Google Sheet": {
      "main": [
        [
          {
            "node": "Filter Unpublished Articles",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}