DEV Community

Pirate Prentice
Pirate Prentice

Posted on

n8n RSS Feed Read Node: Aggregate, Monitor, and Route Feed Content - Free Workflow JSON

RSS is not dead. It is the most reliable way to monitor competitor blogs, job boards, news sources, and podcast feeds without fragile HTML scraping. n8n's RSS Feed Read node pulls any RSS 2.0 or Atom feed into your workflow in one step — no authentication dance, no HTML parser, no API key.

This guide covers every field the node exposes, three real-world patterns, the gotchas that trip people up, and a free workflow JSON you can import today.


What the RSS Feed Read node does

The node fetches the feed URL you provide, parses every <item> (RSS) or <entry> (Atom), and outputs one n8n item per entry. That means a feed with 20 posts produces 20 items downstream — ready for filtering, deduplication, storage, or notification.

Configuration fields

Field What it does
URL The full feed URL (supports both RSS 2.0 and Atom 1.0)
Limit Max items to return per execution. Default: 50. Set lower for high-volume feeds.

That is the entire configuration surface. Simple by design.

Output fields per item

Field Description
title Entry headline
link Canonical URL of the article/episode
pubDate Publication timestamp (string — normalize with DateTime node)
content Full entry body or summary (may be HTML)
guid Unique identifier for the entry (use for deduplication)
author Author name if present
categories Array of category/tag strings
enclosure Object with url, type, length — podcast audio files live here

Pattern 1: Competitive blog monitor -> Slack

Get a Slack DM whenever a competitor publishes a post containing a keyword you care about.

Schedule Trigger (every hour)
  -> RSSFeed Read (competitor blog feed URL)
  -> IF: {{ $json.title.toLowerCase().includes('your-keyword') || $json.content.toLowerCase().includes('your-keyword') }}
      True -> Slack (send message: "New post: {{ $json.title }} - {{ $json.link }}")
      False -> (nothing)
Enter fullscreen mode Exit fullscreen mode

Tip: Use {{ $json.pubDate }} in the Slack message so you can see at a glance how fresh the post is. Pair the DateTime node to convert pubDate to a readable local time if your team is not UTC.


Pattern 2: Multi-feed job board aggregator -> Google Sheets

Aggregate jobs from several RSS feeds (LinkedIn Jobs, Indeed, Greenhouse-based career pages all offer RSS) into a single Sheet, deduplicating by guid so re-runs do not create duplicate rows.

Schedule Trigger (every 6 hours)
  -> RSSFeed Read [feed 1]
  -> RSSFeed Read [feed 2] -> Merge (Append mode)
  -> RSS Feed Read [feed 3]
  -> Item Lists (Remove Duplicates: field = guid)
  -> Google Sheets (Append or Update: match on guid column)
Enter fullscreen mode Exit fullscreen mode

Why dedup by guid not link? Some job boards generate UTM-suffixed links that change between runs; guid is the stable canonical identifier.


Pattern 3: Podcast feed -> transcription queue

Detect new podcast episodes and queue them for automatic transcription (Whisper API, AssemblyAI, etc.).

Schedule Trigger (every 30 minutes)
  -> RSS Feed Read (podcast feed URL, Limit: 1)
  -> IF: {{ new Date($json.pubDate) > new Date(Date.now() - 3600000) }}
      True -> HTTP Request (POST to transcription API, body: { url: $json.enclosure.url })
      False -> (nothing)
Enter fullscreen mode Exit fullscreen mode

The enclosure.url field is where the MP3/M4A audio file URL lives in podcast feeds. Pass it directly to any transcription API as the source URL.

Limit: 1 fetches only the most recent episode -- perfect for a "new episode" trigger. Increase to 5-10 if you need to catch up after a gap.


Gotchas and fixes

Gotcha Fix
Feed requires authentication RSS Feed Read has no auth option. Use HTTP Request node instead (Basic Auth or header token), then parse the XML with a Code node or HTML Extract node
pubDate format varies wildly Never compare raw pubDate strings. Use the DateTime node to parse and normalize: {{ DateTime.fromRFC2822($json.pubDate).toISO() }}
Duplicate items on re-run Use Item Lists -> Remove Duplicates on guid. For Sheets, use "Append or Update" with guid as the match column
Feed uses Atom 1.0 Fully supported. The node maps Atom id -> guid, updated -> pubDate, summary/content -> content automatically
Feed returns 429 / rate-limits Slow your Schedule Trigger. Most feeds are fine at hourly; aggressive polling (every 5 min) can get you blocked
Content field is HTML Strip tags in a Code node: items[0].json.content.replace(/<[^>]+>/g, '')
Feeds with no guid Fall back to link for deduplication. Most well-formed feeds include guid; Atom feeds always include id

Free workflow JSON -- Competitive blog monitor

Import this directly into n8n (copy -> n8n canvas -> Ctrl+Shift+V):

{
  "name": "RSS Competitive Monitor -> Slack",
  "nodes": [
    {
      "parameters": { "rule": { "interval": [{ "field": "hours", "hoursInterval": 1 }] } },
      "name": "Every Hour",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [240, 300]
    },
    {
      "parameters": { "url": "https://feeds.feedburner.com/oreilly/radar", "limit": 20 },
      "name": "RSS Feed Read",
      "type": "n8n-nodes-base.rssFeedRead",
      "typeVersion": 1,
      "position": [440, 300]
    },
    {
      "parameters": {
        "conditions": {
          "string": [{
            "value1": "={{ $json.title.toLowerCase() }}",
            "operation": "contains",
            "value2": "automation"
          }]
        }
      },
      "name": "Keyword Filter",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [640, 300]
    },
    {
      "parameters": {
        "select": "channel",
        "channelId": { "value": "YOUR_SLACK_CHANNEL_ID" },
        "text": "New post: {{ $json.title }}\n{{ $json.link }}\n{{ $json.pubDate }}",
        "otherOptions": {}
      },
      "name": "Slack Alert",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.2,
      "position": [840, 200]
    }
  ],
  "connections": {
    "Every Hour": { "main": [[{ "node": "RSS Feed Read", "type": "main", "index": 0 }]] },
    "RSS Feed Read": { "main": [[{ "node": "Keyword Filter", "type": "main", "index": 0 }]] },
    "Keyword Filter": { "main": [[{ "node": "Slack Alert", "type": "main", "index": 0 }], []] }
  }
}
Enter fullscreen mode Exit fullscreen mode

To adapt: replace the feed URL and keyword, add your Slack credential, point the channel ID to your workspace.


When to use RSS Feed Read vs HTTP Request

  • RSS Feed Read -> any public RSS/Atom feed. Zero config.
  • HTTP Request -> feeds behind auth, or when you need request headers (User-Agent spoofing, API keys).
  • HTTP Request + HTML Extract -> pages with no RSS feed at all.

If you want a plug-and-play pack of 30+ pre-built n8n workflows (RSS monitors, Slack alerts, lead capture, database integrations), the n8n Workflow Starter Pack has you covered for $29.


What are you monitoring with RSS in n8n? Competitor blogs, job boards, government data feeds, something unusual? Drop it in the comments!

Top comments (1)

Collapse
 
pirateprentice profile image
Pirate Prentice

What RSS feeds are you monitoring with n8n? Competitor blogs, job boards, or something else? Drop your use case below — curious what people are building.