n8n RSS Feed Reader: Auto-Publish Content Workflows 2026

Build an n8n RSS feed reader that monitors sources, filters posts, and auto-publishes to WordPress, Ghost, or a webhook — no manual copy-paste.

Problem: Manually Monitoring RSS Feeds Doesn't Scale

You follow 10+ blogs, newsletters, or news sources. Every day you open each site, scan for new posts, and copy content into your CMS or Slack channel by hand. That's 20–40 minutes of repetitive work — and you still miss things.

n8n can watch every feed on a schedule, filter by keyword, and publish straight to WordPress, Ghost, a Slack channel, or any webhook — automatically.

You'll learn:

  • How to poll multiple RSS feeds on a cron schedule
  • How to filter items by keyword or date to avoid duplicates
  • How to publish new items to WordPress (or any HTTP endpoint)

Time: 25 min | Difficulty: Intermediate


Why RSS Polling in n8n Works Better Than Zapier

n8n's RSS Feed Trigger node stores the last-seen item ID in its internal state. This means it won't re-publish duplicates when the workflow runs again — something you'd have to handle manually with a generic HTTP node in other tools.

You also get full control over the transformation step: rewrite titles with an AI node, strip HTML from summaries, or route posts to different destinations based on tags.


Solution

Step 1: Create a New Workflow with an RSS Trigger

Open your n8n instance and click New Workflow.

Add a node and search for RSS Feed Read. This is n8n's built-in RSS/Atom polling node.

Configure it:

FieldValue
Feed URLYour first RSS feed URL
Poll TimesEvery 1 hour (or adjust to your needs)
Example feeds to test with:
- https://hnrss.org/frontpage        (Hacker News)
- https://feeds.feedburner.com/TechCrunch
- https://blog.langchain.dev/rss/

Expected: On first activation, the node fetches the current feed and marks all existing items as "seen". Only new items trigger the workflow on subsequent runs.


Step 2: Add Multiple Feeds with a Merge Node

One RSS node = one feed. To monitor multiple sources, add one RSS Feed Read node per feed, then combine them.

Add a Merge node set to Combine → Append mode. Connect every RSS node's output into the Merge node's inputs.

[RSS: HackerNews] ──┐
[RSS: TechCrunch] ──┤── [Merge: Append] ── next step
[RSS: LangChain]  ──┘

This gives you a single stream of new items regardless of which feed they came from.

If it fails:

  • Merge node shows "no data" → Check each RSS node individually. Run them manually to confirm they return items before connecting to Merge.

Step 3: Filter Items by Keyword

You probably don't want every item — just posts relevant to your niche.

Add a Filter node after Merge. Set the condition:

FieldOperatorValue
{{$json["title"]}}Containsyour keyword

For multiple keywords, click Add Condition and set the combinator to OR:

title contains "LLM"
OR title contains "AI agent"
OR title contains "RAG"

To filter by date (skip posts older than 24 hours):

Add a Code node before Filter and append a computed field:

// Add an age check field — n8n's Filter can't do date math natively
const pubDate = new Date($json.pubDate || $json.isoDate);
const ageHours = (Date.now() - pubDate.getTime()) / 1000 / 3600;

return {
  ...$json,
  ageHours: Math.round(ageHours),
  isRecent: ageHours < 24
};

Then filter on isRecent equals true.


Step 4: Transform the Item for Your Destination

Before publishing, clean up the RSS data. RSS summaries often contain raw HTML tags.

Add another Code node:

// Strip HTML tags from the description
const stripHtml = (html) => html.replace(/<[^>]*>/g, '').trim();

// Build a clean payload ready for your CMS or webhook
return {
  title: $json.title,
  url: $json.link,
  summary: stripHtml($json.contentSnippet || $json.description || ''),
  source: $json.feedTitle || new URL($json.link).hostname,
  publishedAt: $json.isoDate,
  categories: $json.categories || []
};

Expected output field summary: Plain text with no <p> or <a> tags.


Step 5: Publish to WordPress

Add an HTTP Request node configured for the WordPress REST API.

FieldValue
MethodPOST
URLhttps://yoursite.com/wp-json/wp/v2/posts
AuthenticationBasic Auth (username + application password)
BodyJSON

Body JSON:

{
  "title": "{{ $json.title }}",
  "content": "<p>{{ $json.summary }}</p><p><a href='{{ $json.url }}'>Read the original →</a></p>",
  "status": "draft",
  "categories": [12]
}

Setting status to "draft" is safer for a first run — review posts before they go live. Change to "publish" once you trust the filter.

If it fails:

  • 401 Unauthorized → Use an Application Password from WordPress (Users → Profile → Application Passwords), not your login password.
  • 400 Bad Request → Log the full response body in n8n to see which field WordPress rejected.

Step 6: Publish to Ghost (Alternative)

If you run Ghost instead of WordPress, use the Ghost Admin API.

Add an HTTP Request node:

FieldValue
MethodPOST
URLhttps://yoursite.ghost.io/ghost/api/admin/posts/
Header: AuthorizationGhost YOUR_ADMIN_API_KEY
Header: Content-Typeapplication/json

Body:

{
  "posts": [{
    "title": "{{ $json.title }}",
    "html": "<p>{{ $json.summary }}</p><p><a href='{{ $json.url }}'>Source →</a></p>",
    "status": "draft",
    "tags": [{ "name": "rss-import" }]
  }]
}

Generate your Ghost Admin API key under Settings → Integrations → Add custom integration.


Step 7: Send to Slack Instead (Lightweight Option)

Don't need a CMS? Route new items directly to a Slack channel for your team to review.

Add a Slack node (or HTTP Request to Slack's Incoming Webhook URL):

{
  "text": "*New post from {{ $json.source }}*\n<{{ $json.url }}|{{ $json.title }}>\n{{ $json.summary }}"
}

This takes under 2 minutes to set up and is useful for a content curation feed your team watches.


Verification

Activate the workflow and manually trigger a test run from the RSS node.

In n8n: open the RSS Feed Read node → click "Execute Node"

Check that:

  1. The RSS node returns at least one item
  2. The Filter node passes items matching your keyword
  3. The Code node outputs a clean summary field with no HTML tags
  4. The HTTP Request node returns 201 Created (WordPress) or {"posts": [...]} (Ghost)

Then check your CMS — a new draft post should be waiting.


What You Learned

  • The RSS Feed Read node tracks last-seen items automatically — no deduplication logic needed
  • Multiple feeds feed into a single Merge node for unified filtering
  • A Code node is the right place for date math and HTML stripping — n8n's built-in Filter can't do either natively
  • Publishing as draft first protects against noisy or low-quality RSS items slipping through

Limitation: n8n's RSS node polls on a schedule — it's not real-time. For breaking news use cases, pair this with a webhook-based source or reduce the poll interval to 15 minutes.

Scale it further: Add an AI node (OpenAI or Ollama) between the Code node and the publish step to rewrite the summary in your brand voice before it goes to the CMS.

Tested on n8n 1.82.x, WordPress 6.7, Ghost 5.x, self-hosted on Docker