Google Sheets to Slack, clean RSS posts no repeats
Your Slack channel is supposed to keep people informed. Instead, it turns into a noisy stream of repeated links, “didn’t we already share this?”, and someone quietly giving up on checking it.
This is the kind of Sheets Slack automation that saves Marketing Managers from daily link wrangling. It also helps founders who want a quick “what matters today” feed, plus ops folks who hate chasing duplicates across tools.
You’ll see how this workflow pulls RSS feeds from Google Sheets, posts only fresh items to Slack, and logs everything so repeats don’t sneak back in.
How This Automation Works
See how this solves the problem:
n8n Workflow Template: Google Sheets to Slack, clean RSS posts no repeats
flowchart LR
subgraph sg0["Flow 1"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Filter Unpublished Articles"]
n1@{ icon: "mdi:cog", form: "rounded", label: "Trigger Workflow", pos: "b", h: 48 }
n2["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Post New Articles to Slack C.."]
n3@{ icon: "mdi:database", form: "rounded", label: "Get Article Feeds", pos: "b", h: 48 }
n4@{ icon: "mdi:cog", form: "rounded", label: "Read Latest Articles from Fe..", pos: "b", h: 48 }
n5@{ icon: "mdi:database", form: "rounded", label: "Get Historically Posted Arti..", pos: "b", h: 48 }
n6@{ icon: "mdi:database", form: "rounded", label: "Append New Articles to Googl..", pos: "b", h: 48 }
n1 --> n3
n3 --> n4
n0 --> n6
n4 --> n5
n6 --> n2
n5 --> n0
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n3,n5,n6 database
class n0 code
classDef customIcon fill:none,stroke:none
class n0,n2 customIcon
The Challenge: Sharing RSS Without Spamming Slack
Curating articles sounds simple until it’s on the calendar every day. You collect RSS feeds, scan headlines, copy links into Slack, and then someone points out that the same post showed up yesterday (or last week). Now you’re checking channel history, searching a spreadsheet, and second-guessing yourself. The annoying part isn’t posting one link. It’s managing the “did we already send this?” question across multiple feeds, across time, with different people taking turns.
It adds up fast. And the friction compounds in predictable ways.
- Slack channels get tuned out when duplicates show up, even if the content is good.
- Manual copy-paste invites small mistakes like broken links or missing context, which means extra back-and-forth.
- When you track “posted” items by memory (or Slack search), you eventually miss one and re-share it.
- Handovers are painful because nobody knows which feeds are “covered” unless you document it somewhere.
The Fix: Google Sheets + RSS to Slack, With a No-Duplicates Log
This workflow turns your Google Sheet into the control center for curated RSS sharing. At a set time each day, it reads your list of RSS feed URLs from a “Feeds” tab, pulls the latest items from each feed, and then compares those links to a “Posted Articles” tab that acts like a memory. Anything already logged gets skipped. Anything new gets formatted and sent to your chosen Slack channel, and the workflow immediately writes those new items back into the log so tomorrow’s run doesn’t repeat them. Set it once, then let it quietly do the boring part for you.
The workflow starts on a schedule (default is 7:00 AM). It loads feeds from Google Sheets, reads RSS items, removes duplicates using your posted log, then posts the new links to Slack and records what it sent.
What Changes: Before vs. After
| What This Eliminates | Impact You’ll See |
|---|---|
|
|
Real-World Impact
Say you curate from 10 RSS feeds and share 8 new links per day. Manually, you’ll usually spend about 5 minutes per feed checking what’s new and avoiding repeats, plus another 10 minutes formatting and posting, so call it about an hour each day. With this workflow, the “work” is adding feeds once in Google Sheets and letting the 7:00 AM run do the rest. You might spend 5 minutes a week adjusting the feed list. That’s a lot of mornings saved.
Requirements
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets to store feeds and posted history
- Slack to publish new articles to a channel
- Google Sheets OAuth2 + Slack OAuth2 (create in n8n credentials)
Skill level: Beginner. You’ll connect accounts, paste your Sheet ID, and select a Slack channel.
Need help implementing this? Talk to an automation expert (free 15-minute consultation).
The Workflow Flow
A scheduled run kicks it off. A Cron trigger runs daily (7:00 AM by default), so you don’t rely on someone remembering to post updates.
Your feed list comes from Google Sheets. The workflow reads the “Feeds” tab, which is just a simple table of RSS sources you approve. Add a new industry blog and you’re done.
RSS items are fetched, then deduped against your log. n8n pulls the latest articles from each feed, loads your “Posted Articles” history sheet, and runs a dedupe check so previously shared links are filtered out.
New links get posted and recorded. Fresh items are posted into Slack (title + link), then written back into the “Posted Articles” tab with key fields like title, link, and pubDate.
You can easily modify the schedule (daily to weekly) or change which Slack channel receives posts based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Cron Trigger
Set when the workflow runs so your feed sources are checked on a schedule.
- Add and open Scheduled Automation Trigger.
- Under Trigger Times, set the hour to
7to run daily at 7 AM. - Connect Scheduled Automation Trigger to Retrieve Feed Sources to follow the execution flow.
Step 2: Connect Google Sheets
These nodes read the feed source list and log which articles have already been posted.
- Open Retrieve Feed Sources and set Document ID to
={{$vars.Daily_Industry_News_Automation_Google_Sheet}}. - Set Sheet Name to the
Feedssheet (gid1768028583). - Open Fetch Posted Article Log and set Document ID to
={{$vars.Daily_Industry_News_Automation_Google_Sheet}}. - Set Sheet Name to
Posted Articles(gid0). - Open Log New Articles to Sheet and set Operation to
append. - In Columns, map link to
={{ $json.link }}, title to={{ $json.title }}, and pubDate to={{ $json.pubDate }}.
Credential Required: Connect your Google Sheets credentials in Retrieve Feed Sources, Fetch Posted Article Log, and Log New Articles to Sheet.
Step 3: Set Up Feed Processing Logic
Pull recent items from each RSS feed and filter out anything already posted.
- Open Load Recent Feed Items and set URL to
={{ $json.link }}so each feed source row is read dynamically. - Open Exclude Published Items and confirm the JavaScript Code uses
$('Fetch Posted Article Log').all()and$('Load Recent Feed Items').all()to filter new items. - Ensure the connection flow is Load Recent Feed Items → Fetch Posted Article Log → Exclude Published Items → Log New Articles to Sheet.
⚠️ Common Pitfall: If your feed source sheet doesn’t include a link column, Load Recent Feed Items will fail. Ensure each source row has a valid RSS URL.
Step 4: Configure Output to Slack
Send a formatted message for each new article and keep the posting log updated.
- Open Send Slack Article Update and set Authentication to
oAuth2. - Select the Channel using your channel ID (e.g.,
[YOUR_ID]). - Set Text to
=*{{$json["title"]}}* | {{$json["link"]}} _Published: {{$json["pubDate"]}}_to format the update. - Confirm Log New Articles to Sheet connects to Send Slack Article Update so only new items are posted.
Credential Required: Connect your Slack OAuth2 credentials in Send Slack Article Update.
Step 5: Test and Activate Your Workflow
Run a manual test to verify RSS retrieval, deduplication, logging, and Slack delivery.
- Click Execute Workflow to run the workflow manually.
- Verify that Log New Articles to Sheet appends new rows with
link,title, andpubDate. - Confirm Send Slack Article Update posts messages in the selected channel with the formatted text.
- If results look correct, toggle the workflow to Active to enable scheduled runs.
Watch Out For
- Google Sheets OAuth credentials can expire or lack access to the right document. If things break, check the n8n Credentials screen and confirm the connected Google account can open the spreadsheet.
- RSS feeds are inconsistent, and some return older items or change their link formats. If you see “new” posts that feel like repeats, adjust the dedupe logic to compare the canonical link (not just the title).
- Slack posting can fail silently if the channelId is wrong or the app isn’t invited to the channel. Confirm the channel ID and make sure your Slack app has permission to post there.
Common Questions
About 30 minutes if your Google Sheets and Slack credentials are ready.
Yes. You will mostly be connecting accounts and copying in your Sheet ID and Slack channel.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Slack and Google Sheets access (usually already included in your existing accounts).
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
You can change the Cron schedule in the “Scheduled Automation Trigger” node and point posting to a different Slack channel by updating the channelId used by “Send Slack Article Update.” Common tweaks include limiting posts to a max number per run, posting as a single digest message instead of individual messages, and adding extra columns in Google Sheets (like “category”) so different feeds route to different channels.
Usually the Slack app isn’t invited to the channel, or the channelId is incorrect.
On n8n Cloud, capacity mainly depends on your monthly execution limit and how many feed items you pull per run. Self-hosting has no execution cap, but your server still has to fetch feeds and post to Slack reliably, so a small VPS is typically fine for dozens of feeds. If you’re pulling hundreds of items every day, you’ll want to batch items and cap “latest items” per feed so Slack doesn’t get flooded. Also keep an eye on Google Sheets write volume, because logging each posted article is a separate update.
Often, yes. n8n makes it easier to do “compare against a log, filter duplicates, then write back” without awkward workarounds, and self-hosting is a big deal if you don’t want per-task pricing. Zapier and Make can still work if your version is very simple, like one feed to one channel with no history tracking. The minute you need a Google Sheets “posted items” table, multi-feed handling, or tighter control over formatting, n8n tends to feel less fragile. If you want a second opinion on the trade-offs, Talk to an automation expert.
Once this is running, Slack stops feeling like a dumping ground. Your channel becomes a reliable “new stuff only” feed, and you get your mornings back.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.