Your team is drowning in newsletters and blog feeds — important articles get missed and nobody has time to read everything. What if an AI bot automatically scanned your favorite RSS feeds every hour, wrote a crisp two-sentence summary of each new article, and posted it straight to your Discord channel? That’s exactly what you’ll build here: a fully automated n8n workflow that monitors RSS feeds, uses OpenAI to generate smart summaries, and delivers them to Discord — with a Google Sheet keeping track so nothing gets posted twice.
Prefer to skip the setup? Grab the ready-made template → and be up and running in under 10 minutes.
What You’ll Build
- A scheduled n8n workflow that wakes up every hour and fetches the latest items from any RSS feed you choose.
- A deduplication layer backed by Google Sheets so the same article is never posted twice, even across restarts.
- An OpenAI call that reads each article’s title and snippet and writes a punchy 2–3 sentence summary tailored for a Discord audience.
- An automatic Discord post that drops the summary, the article title, and the link into your chosen channel — formatted and ready to read.
- A log entry written back to Google Sheets so the system stays in sync across all future runs.
How It Works — The Big Picture
The workflow runs on a timer, pulls from your RSS feed, filters out anything already posted, summarizes the new items with AI, and delivers them to Discord — all without you touching a thing.
┌──────────────────────────────────────────────────────────────────┐ │ RSS FEED AI SUMMARIZER TO DISCORD │ │ │ │ [Schedule Trigger] │ │ │ (every 1 hour) │ │ ▼ │ │ [RSS Feed Read] │ │ │ (fetch all items from feed) │ │ ▼ │ │ [Get Tracked URLs] ◄── Google Sheets (Tracked tab) │ │ │ (read previously posted URLs) │ │ ▼ │ │ [Filter New Articles] │ │ │ (Code node: remove duplicates, cap at 5 items) │ │ ▼ │ │ [Summarize with OpenAI] │ │ │ (HTTP Request → OpenAI Chat Completions API) │ │ ▼ │ │ [Build Discord Message] │ │ │ (Set node: format title + summary + link) │ │ ▼ │ │ [Post to Discord] │ │ │ (HTTP Request → Discord Webhook URL) │ │ ▼ │ │ [Log URL to Sheet] │ │ (Append row: url, title, summary, posted_at) │ └──────────────────────────────────────────────────────────────────┘
What You’ll Need
- n8n — self-hosted (v1.0+) or n8n Cloud (any paid plan)
- An RSS feed URL — any public feed (TechCrunch, Hacker News, a podcast, a company blog…)
- An OpenAI account — API key from platform.openai.com; GPT-4o-mini usage is very cheap (roughly $0.002 per summary)
- A Google account — for the tracking spreadsheet (Google Sheets OAuth2)
- A Discord server — with permission to create a Webhook URL in the target channel
Estimated build time: 35–50 minutes from scratch, or under 10 minutes with the ready-made template.
Part 1 — The Workflow, Node by Node
1 Schedule Trigger (Schedule Trigger)
This is the engine that starts the whole thing. It fires the workflow automatically on a fixed interval so you never have to run it manually. Set Trigger Interval to Hours and the value to 1. The workflow will now run every hour.
Tip: For high-volume feeds (like Hacker News), consider 30 minutes. For low-volume feeds (weekly newsletters), daily is plenty.
2 RSS Feed Read (RSS Feed Read)
Fetches the RSS feed and returns all available items as individual records — typically 10–25 per feed. Paste your RSS feed URL into the URL field. For example, TechCrunch’s feed is https://techcrunch.com/feed/.
{
"title": "Anthropic Raises $4B Series E at $18B Valuation",
"link": "https://techcrunch.com/2026/04/05/anthropic-series-e/",
"pubDate": "Sat, 05 Apr 2026 14:22:00 +0000",
"contentSnippet": "Anthropic, the AI safety company behind Claude, has raised $4 billion..."
}
3 Get Tracked URLs (Google Sheets)
Before processing anything, the workflow reads a Google Sheet to see which article URLs have already been posted to Discord. Connect your Google Sheets OAuth2 credential, set Document ID to your spreadsheet ID, sheet name to Tracked, and operation to Read.
On the very first run, your sheet will be empty — that’s fine. The filter node handles an empty result gracefully and all items will be treated as new.
4 Filter New Articles (Code)
This JavaScript node cross-references the RSS items against the tracked URLs and returns only articles that haven’t been posted yet. It also caps the output at 5 items per run to prevent Discord channel flooding. Set the node to Run Once for All Items mode.
const rssItems = $('RSS Feed Read').all();
const trackedItems = $('Get Tracked URLs').all();
const trackedUrls = new Set(
trackedItems.map(item => (item.json.url || item.json.URL || '').trim()).filter(Boolean)
);
const newItems = rssItems.filter(item => {
const url = (item.json.link || item.json.url || '').trim();
return url && !trackedUrls.has(url);
});
return newItems.slice(0, 5).map(item => ({ json: item.json }));
5 Summarize with OpenAI (HTTP Request)
Sends each new article’s title and snippet to the OpenAI API and gets back a tight 2–3 sentence summary. Set method to POST, URL to https://api.openai.com/v1/chat/completions. Set authentication to HTTP Header Auth with header Authorization: Bearer YOUR_API_KEY.
{
"model": "gpt-4o-mini",
"messages": [
{"role": "system", "content": "Summarize this article in 2-3 sentences for a Discord audience."},
{"role": "user", "content": "Title: {{ $json.title }}\nContent: {{ $json.contentSnippet }}"}
],
"max_tokens": 200
}
Tip: GPT-4o-mini costs roughly $0.003 per summary — less than $0.10/day for continuous hourly operation.
6 Build Discord Message (Set)
This node assembles the final Discord message by combining the article title, AI summary, link, and timestamp. Add an assignment named discord_message:
📰 **{{ $('Filter New Articles').item.json.title }}**
{{ $json.choices[0].message.content }}
🔗 Read more: {{ $('Filter New Articles').item.json.link }}
_{{ $now.format('MMMM d, yyyy · h:mm a') }} UTC_
7 Post to Discord (HTTP Request)
Sends the formatted message to your Discord channel using a Webhook URL. To create a webhook: go to your Discord server → right-click the channel → Edit Channel → Integrations → Webhooks → New Webhook. Copy the URL and paste it as the node’s URL. Set method to POST with this JSON body:
{
"content": "{{ $json.discord_message }}",
"username": "RSS News Bot"
}
8 Log URL to Sheet (Google Sheets)
After posting, this node appends a row to the Google Sheet with the article URL, title, AI summary, and timestamp. Set operation to Append, use the same spreadsheet and Tracked sheet, and map columns: url, title, summary, posted_at.
The Data Structure
The Google Sheet is the workflow’s memory. Create a sheet named Tracked with these column headers in row 1:
| Column | Type | Example | Description |
|---|---|---|---|
url |
Text | https://techcrunch.com/2026/04/05/article/ | The canonical URL — this is the deduplication key |
title |
Text | Anthropic Raises $4B Series E | Article title for human review |
summary |
Text | Anthropic has secured $4B… | The AI-generated summary that was posted |
posted_at |
Text | 2026-04-05 14:22:00 | UTC timestamp of when it was posted |
The column name url must be lowercase. If you rename it, update the Code node’s lookup logic to match.
Full System Flow
Schedule Trigger (every hour)
│
▼
RSS Feed Read → [10-25 items: title, link, contentSnippet]
│
▼
Get Tracked URLs (Google Sheets READ) → [list of previously posted URLs]
│
▼
Filter New Articles (Code) → [0-5 new items only]
│
▼ (for each new item)
Summarize with OpenAI → [2-3 sentence AI summary]
│
▼
Build Discord Message → [formatted text with title + summary + link]
│
▼
Post to Discord (Webhook) → [message appears in channel]
│
▼
Log URL to Sheet (Google Sheets APPEND) → [new row: url|title|summary|time]
│
↑ cycle repeats next hour
Testing Your Workflow
- Before activating, run the workflow manually using the Test workflow button in n8n’s top toolbar.
- After the RSS Feed Read executes, click it and confirm you see article items in the output panel.
- On the first run your sheet is empty — Filter New Articles should pass through up to 5 items.
- Check your Discord channel — formatted news messages should appear within seconds.
- Check your Google Sheet — the Tracked tab should have rows for each posted article.
- Run the workflow a second time manually. Filter should return 0 items — deduplication is working.
| Problem | Likely Cause | Fix |
|---|---|---|
| No items from RSS Feed Read | Invalid RSS URL or feed is down | Test the URL in a browser — it should return XML |
| All items filtered on first run | Sheet already has URLs from a previous test | Clear data rows in your Tracked sheet and re-run |
| OpenAI returns 401 | API key missing or incorrectly configured | Check Authorization header starts with “Bearer ” (with space) |
| Discord message not appearing | Webhook URL invalid or deleted | Regenerate webhook in Discord and update the URL in the node |
| Duplicate posts in Discord | Column name mismatch in Google Sheet | Ensure sheet header is exactly url (lowercase) |
Frequently Asked Questions
Can I monitor multiple RSS feeds at once?
Yes — the simplest way is to add multiple RSS Feed Read nodes and use a Merge node to combine their outputs before the Filter node. The Google Sheet tracks deduplicated URLs across all feeds since URLs are globally unique.
Will it post to multiple Discord channels?
Add additional HTTP Request nodes after the Post to Discord node, each pointing to a different webhook URL. You can add an IF node before them to route different feed categories to different channels.
What happens if OpenAI is down or returns an error?
Enable Continue on Fail in the OpenAI node’s settings — the workflow will skip that item and continue. You can also set up an Error Trigger workflow in n8n to notify you via Telegram or email when something fails.
How do I change the AI summary style or tone?
Edit the system prompt inside the Summarize with OpenAI node. Change it to “summarize in one sentence with a market angle” or “write as a witty tech commentator” — the AI follows prompt instructions reliably for this task.
Will this work on n8n Cloud, or only self-hosted?
It works on both. The workflow uses only standard HTTP Requests and core n8n nodes — no special configuration is needed for cloud vs. self-hosted.
How much will the OpenAI API cost per month?
Running every hour, posting up to 5 articles per run on GPT-4o-mini: roughly $0.003 per summary, less than $0.10/day, under $3/month for continuous operation.
🚀 Get the RSS Feed AI Summarizer Template
Skip the build — get the complete workflow JSON, a step-by-step Setup Guide, and a Credentials Guide covering every API key. Works on n8n Cloud and self-hosted.
Instant download · Works on n8n Cloud and self-hosted
What’s Next?
- Add Slack support: Duplicate the Discord posting step and route summaries to a Slack channel.
- Filter by keyword: Add an IF node to only process articles containing keywords like “AI”, “funding”, or your company name.
- Weekly digest: Change the Schedule Trigger to run weekly and bundle all new items into a single long-form Discord post.
- Add sentiment scoring: Extend the OpenAI prompt to return a sentiment score, then route only positive articles to your channel.