Build an AI Automation with an RSS Trigger in n8n A developer published a step-by-step n8n workflow that polls an RSS feed every 30 minutes, summarizes new items with an Anthropic Claude model via the Basic LLM Chain node, validates the model's JSON output in a Code node, gates items on a 1-10 relevance score of 6 or higher, and posts the survivors to Slack. The build includes Retry On Fail settings for rate limits, a separate Error Trigger workflow that alerts on failures, and a Limit node to cap cost on the first backfill run. The developer advises skipping the LLM entirely for simple feed-to-Slack posting and adding AI only when summarization, scoring, or entity extraction is needed. 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.