# Build an AI Automation with an RSS Trigger in n8n

> Source: <https://dev.to/gym_growthx_b19a6a17c1306/build-an-ai-automation-with-an-rss-trigger-in-n8n-fic>
> Published: 2026-10-22 14:39:01+00:00

Most n8n + AI tutorials end with a workflow that works once. This one is built to keep running: it triggers on an RSS feed, summarizes new items with an LLM, filters out noise, and posts to Slack. It also covers what happens when things fail.

The workflow

RSS Feed Trigger → Basic LLM Chain (Claude) → Code (validate JSON) → IF (relevance) → Slack

Plus a separate Error Workflow for alerts.

Do you even need AI here?

If you only want “post every new item to Slack,” skip the LLM. RSS Trigger + Slack is two nodes and costs nothing. Add AI when you need judgment: summarizing, scoring relevance, extracting entities, or rewriting for an audience.

Step 1: RSS Feed Trigger

Add an RSS Feed Trigger node.

Feed URL: your feed

Poll Times: every 30 minutes (RSS has no webhooks, so polling is the trigger)

n8n remembers which items it has already emitted, so you get deduplication for free. This is one of the best reasons to use n8n for this. Note that the very first activation can emit a batch of existing items, so test with a small or low-traffic feed first.

Step 2: Summarize with an LLM

Add a Basic LLM Chain node and attach an Anthropic Chat Model sub-node with your credentials. Pick the model from the dropdown, and check Anthropic’s docs for current model names.

Set the prompt to:

Title: {{ $json.title }}

Content: {{ ($json.contentSnippet || $json.content || '').slice(0, 6000) }}

And the system message to:

You summarize articles for a busy web developer.

Respond with ONLY a JSON object:

{"summary": string (max 2 sentences), "relevance": number 1-10, "tags": string[]}

No markdown, no preamble.

The .slice(0, 6000) caps token cost per item. Some feeds ship full article HTML, which gets expensive fast.

In the node’s Settings tab, turn on Retry On Fail (3 tries, a few seconds between). That covers rate limits and temporary API errors.

Step 3: Validate the output (Code node)

Never trust raw LLM output. Add a Code node (JavaScript, “Run Once for Each Item”):

js

const raw = ($json.text || '').replace(/

``` js
/g, '').trim();

let d;
try {
  d = JSON.parse(raw);
} catch (e) {
  throw new Error('Model returned invalid JSON: ' + raw.slice(0, 200));
}

if (
  typeof d.summary !== 'string' ||
  typeof d.relevance !== 'number' ||
  !Array.isArray(d.tags)
) {
  throw new Error('Unexpected shape: ' + JSON.stringify(d));
}

return {
  json: {
    title: $('RSS Feed Trigger').item.json.title,
    link: $('RSS Feed Trigger').item.json.link,
    ...d,
  },
};

Throwing on bad output is intentional. It turns “weird message in Slack” into a clean, visible failure. If you prefer, n8n’s Structured Output Parser sub-node can enforce a schema for you, but the Code node gives you more control over error messages.

Step 4: Relevance gate (IF node)

Add an IF node: {{ $json.relevance }} is greater than or equal to 6. Connect the true branch onward. This is where the AI earns its cost, because noise is filtered out before it reaches your channel.

Step 5: Slack

Add a Slack node (Send Message) on the true branch:

*<{{ $json.link }}|{{ $json.title }}>* ({{ $json.relevance }}/10)
{{ $json.summary }}
_{{ $json.tags.join(', ') }}_

Step 6: Error handling

Create a new workflow called “Alert on failure” starting with an Error Trigger node, followed by a Slack or email node that sends {{ $json.workflow.name }} and {{ $json.execution.error.message }}.
In your main workflow, open Settings and set Error Workflow to the one you just made.

Now any failure pings you instead of dying silently.

What breaks, and what happens

What breaks Result
Feed is down    Execution fails, the Error Workflow alerts you, and the next poll retries
API rate limit  Retry On Fail handles it, and the Error Workflow alerts you if retries run out
Model returns bad JSON  Code node throws and you get an alert
Slack is down   Slack node fails and you get an alert
Big first run   Add a Limit node after the trigger (e.g. 20 items) to cap cost on backfill

One thing to know: if a node fails mid-run, that item has already been consumed by the trigger, so it won’t be retried automatically on the next poll. For anything critical, either send failed items to a Google Sheet or database in the error branch, or re-run the failed execution manually from the Executions tab.

Where to take it next

Swap Slack for email, Notion, or a database
Merge several feeds and tag each by source
Have the model draft a social post for high-relevance items
Add a Wait node and a human approval step before anything gets published

Wrapping up

An RSS trigger is the simplest way into event-driven AI automation. The LLM call is the easy part. The real work is validation, retries, and knowing what happens when something fails.

What feeds are you pointing yours at? Let me know in the comments.
```


