---
title: "Schedule a Daily AI News Digest to Slack with n8n"
description: "Build an n8n workflow that fetches RSS feeds, summarizes with AI, ranks stories, and posts to Slack every morning. AI credits included, always-on."
canonical: https://agentroost.app/en/blog/daily-ai-news-digest-slack-n8n
date: 2026-06-10T20:00:00Z
---

[Canonical URL](https://agentroost.app/en/blog/daily-ai-news-digest-slack-n8n)

Every morning, your team Slack fills up — standups, PR reviews, random GIFs. Important industry news gets buried or skipped entirely. The fix is a workflow that does the reading for you: fetch a handful of RSS feeds, let an AI model summarize and rank the stories, and post a clean digest to the channel before anyone opens their laptop.

This guide walks through building exactly that in n8n, step by step. The workflow is seven nodes. It takes about 20 minutes to configure. Once it is running, it runs forever.

---

## What You Are Building

A scheduled n8n workflow that:

1. Fires every weekday morning at a time you choose
2. Pulls items from multiple RSS feeds in parallel
3. Deduplicates and filters out weekend noise
4. Sends a batch of headlines to an AI node for summarization and ranking
5. Posts the finished digest to a Slack channel as a formatted message

The output in Slack looks something like:

> **AI & Tech Digest — Friday 13 Jun**
> 
> **1. Anthropic releases Claude 4 with extended context** — Major capability jump; worth reading if you work with long documents. [link]
> 
> **2. Google DeepMind paper on agent planning** — Dense but the conclusions section is accessible. [link]
>
> *3 more stories this week — [full feed]*

---

## Node-by-Node Build

### 1. Schedule Trigger

Add a **Schedule Trigger** node. Set it to **Cron** mode.

```
Cron expression: 0 7 * * 1-5
```

This fires at 07:00 UTC Monday through Friday. Adjust the hour for your timezone — if your team is in Istanbul (UTC+3), `0 4 * * 1-5` delivers at 07:00 local time. Leave the node's **Timezone** field blank and handle offset in the expression to avoid DST surprises.

### 2. RSS Feed Read (×N)

Add one **RSS Feed Read** node per source. Some reliable, low-noise feeds to start with:

| Source | Feed URL |
|---|---|
| MIT Tech Review | `https://www.technologyreview.com/feed/` |
| The Verge AI | `https://www.theverge.com/rss/ai-artificial-intelligence/index.xml` |
| Hacker News best | `https://hnrss.org/best` |
| Product Hunt AI | `https://www.producthunt.com/feed?category=artificial-intelligence` |

Set **Limit** to `10` on each node. You do not need 200 headlines — the AI will struggle to rank them usefully, and Slack posts get long fast.

Connect all RSS nodes to a **Merge** node set to **Append** mode. This concatenates the arrays from every feed into one flat list.

### 3. IF Node — Filter Stale Items

The Merge output may contain items published days ago (some feeds cache aggressively). Add an **IF** node:

- **Condition:** `{{ $json.isoDate }}` is after `{{ $now.minus(1, 'day').toISO() }}`

Items older than 24 hours are routed to the `false` branch, which you can leave unconnected (they are dropped). Only fresh items continue.

### 4. Aggregate (Code Node)

Rather than feeding each article to the AI one at a time — which burns more credits and produces disjointed output — aggregate all headlines into a single payload first.

Add a **Code** node (JavaScript) and run it **Once for All Items**:

```js
const items = $input.all();
const headlines = items.map((item, i) => {
  return `${i + 1}. ${item.json.title} — ${item.json.link}`;
}).join('\n');

return [{ json: { headlines, count: items.length } }];
```

This produces one item with a `headlines` string containing every title and URL, numbered.

### 5. AI / LLM Node — Summarize and Rank

Add an **AI** node (the **Chat Model** node in n8n's AI section). 

- **Model:** Choose any model from the dropdown. A fast, lower-cost model works well here; you do not need maximum capability for headline summarization.
- **Messages → User:** paste this prompt, referencing the aggregated field:

```
You are a senior editor curating a morning digest for a tech team.

Below is a numbered list of today's news headlines and links.

{{ $json.headlines }}

Tasks:
1. Pick the 5 most significant or interesting stories for a team that builds AI products.
2. For each, write ONE sentence explaining why it matters (max 20 words).
3. Output in this exact format (Markdown):

**1. [Title]** — [one-sentence take] [URL]
**2. [Title]** — [one-sentence take] [URL]
...

Do not invent information. If a title is unclear, say so honestly.
```

Keep the prompt tight. Loose prompts produce verbose output that renders badly in Slack.

### 6. Set Node — Build the Slack Message

Add a **Set** node to assemble the final message string:

- **Field name:** `slackMessage`
- **Value:**

```
*AI & Tech Digest — {{ $now.toFormat('cccc d LLL') }}*

{{ $('AI Node').item.json.text }}

_Sourced from {{ $('Code').item.json.count }} articles across {{ feeds.length }} feeds — built with n8n on AgentRoost_
```

Wrap the date in `*asterisks*` for Slack bold. Use `_underscores_` for italics. The `text` field from the AI node contains the formatted ranking the model returned.

### 7. Slack Node — Post to Channel

Add a **Slack** node:

- **Resource:** Message
- **Operation:** Post
- **Channel:** `#team-digest` (or whatever channel name you use)
- **Text:** `{{ $json.slackMessage }}`
- **Other Options → Markdown:** enable this — without it, Slack ignores the formatting.

Connect the Slack node's **credentials** to your workspace's Slack app (you will need to create one in the Slack API dashboard and grant `chat:write` scope). The connection takes about 3 minutes the first time.

---

## Handling Edge Cases

**What if a feed is down?** Wrap each RSS Read node with n8n's built-in **Error Trigger** or set **On Error** to `Continue` so one dead feed does not abort the whole workflow.

**What if the AI returns gibberish?** Add an **IF** node after the AI step that checks `{{ $json.text.length > 100 }}`. Route short responses to a fallback Slack message: `"Digest generation failed today — check the workflow run log."` This prevents a blank or malformed message from going out silently.

**Deduplication across runs:** If the same story appears in two feeds, the AI usually merges them naturally in the ranking. For exact deduplication across workflow runs, store published URLs in a **Redis** node or n8n's built-in **Static Data** using `$getWorkflowStaticData('global')`.

---

## Run It on AgentRoost

The workflow above works on any n8n instance. The challenge with self-hosting is keeping it alive: a laptop that sleeps through the trigger, a VPS you forget to renew, or a Docker container that needs restarting after a kernel update.

On AgentRoost you get your own n8n instance — your login, your workflows, your data — running on always-on dedicated hardware. The Schedule Trigger fires at exactly 07:00 every weekday regardless of what else is happening. More importantly, **AI/LLM credits are included in the subscription**, so the Chat Model node just works. No OpenAI account, no Anthropic console, no API key to paste anywhere. Pick a model from the dropdown and write your prompt.

**How to set it up:**

1. Create an account at [agentroost.app](/en/agents/n8n)
2. Pick the **n8n** framework, name your instance
3. Your private n8n editor opens at `https://<your-id>.agentroost.app`
4. Import the workflow above (paste as JSON or build node by node)
5. Configure your Slack credential once — done

Plans start at **$19.99/mo all-in** (compute + AI credits + HTTPS + no setup overhead). There is a 14-day money-back guarantee, so you can build and test the entire workflow before committing.

[Get started with n8n on AgentRoost](/en/agents/n8n) — or [compare plans](/en/pricing) if you want to see the credit tiers side by side.

---

## Tips Before You Ship

- **Test with a manual trigger first.** Disable the Schedule Trigger, hit **Execute Workflow**, and verify the Slack message renders before you go live.
- **Keep the feed list short.** Four to six sources is the sweet spot. More feeds → more noise → the AI starts hallucinating relevance.
- **Add a weekend gate.** Even though the cron skips Saturday and Sunday, if you deploy on a Friday afternoon you may want an extra IF node: `$now.weekday < 6` → continue, else → stop.
- **Rotate models occasionally.** The included credits cover a wide range of models. If the digest starts feeling repetitive, switch the Chat Model node to a different provider — no credential change needed.
