{
  "id": "G452NfcbwAErVDRu",
  "meta": {
    "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
      ],
      "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": "# \ud83d\udcc4 Post New Articles from Feeds to Slack Channel\n\n## \ud83e\udde0 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## \ud83d\udee0\ufe0f Prerequisites\n\nTo use this workflow, you must have:\n\n- \u2705 **Google Sheets** OAuth2 credentials set up in n8n  \n  (Used to access and update the RSS feed and post history sheets)\n\n- \u2705 **Slack** OAuth2 credentials  \n  (Used to post messages to a specific Slack channel)\n\n- \u2705 **A Google Spreadsheet** with:\n  - `Feeds` tab \u2013 Columns: `title`, `link`  \n  - `Posted Articles` tab \u2013 Columns: `title`, `link`, `pubDate`\n\n---\n\n## \ud83d\udd27 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## \u23f0 Trigger & Scheduling\n\n- **Trigger type**: `Cron` node  \n- **Default schedule**: Every day at **7:00 AM**\n\nYou can modify this in the **\u201cTrigger Workflow\u201d** node to suit your own schedule.\n\n---\n\n## \ud83c\udfaf 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,
  "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
          }
        ]
      ]
    }
  }
}