# A daily competitor news digest in Slack for ~$1.50 a month (n8n + Google News)

> Source: <https://dev.to/fast_data_asap/a-daily-competitor-news-digest-in-slack-for-150-a-month-n8n-google-news-405e>
> Published: 2026-10-20 11:44:14+00:00

Google Alerts still exists, but it has been unreliable for years: late, incomplete, and stuck in your inbox. What I actually wanted was simpler: every morning, one Slack message with what was published about our brand and our competitors in the last 24 hours, with links to the original articles, and nothing I have already seen.

This is the n8n workflow that does it. It has five nodes, takes about five minutes to set up and costs around $1.50 a month.

**Disclosure:** the news data comes from the Google News Scraper on Apify, which I built. Prices and limits are below.

```
News digest 2026-10-20: 19 new article(s)

OpenAI (10)
- OpenAI races to raise $30 billion at $1.4 trillion valuation ahead of Anthropic IPO (CTech)
- EXCLUSIVE: OpenAI seeks to accelerate fundraising ahead of Anthropic IPO, sources say (Reuters)
- Lawsuit alleges OpenAI 'stole' children's user data (Mashable)
...

Anthropic (9)
- Former Google CEO Schmidt owns 1% stake in Anthropic, Bloomberg reports (Reuters)
- Anthropic is AI trade's last big hope for a major IPO this year (CNBC)
...
```

That is real output from a test run, with "OpenAI" and "Anthropic" as example queries. In Slack every headline is a link to the publisher's page, not to a Google redirect.

```
Schedule (daily 7:30)
  → HTTP Request: Google News Scraper
  → Remove Duplicates (previous executions, by URL)
  → Code: build digest
  → Slack (+ optional e-mail)
```

An HTTP Request node calls the Actor through Apify's synchronous endpoint (`run-sync-get-dataset-items`), which runs it and returns the results in one request:

```
{
  "queries": ["\"OpenAI\"", "\"Anthropic\""],
  "edition": "US:en",
  "timeRange": "1d",
  "maxArticlesPerSource": 10,
  "includeFullText": false
}
```

A few details that matter for monitoring:

`Acme Corp` also matches every article that mentions "acme" and "corp" separately.`"Acme" -jobs`, `intitle:acme`, `site:techcrunch.com`.` edition` sets country and language; 18 editions are supported (US, UK, Germany, France, Japan...).`title`, `source`, `publishedAt` and the `news.google.com/rss/articles/...` redirect links; the Actor decodes them. That matters for the next step.
Authentication is an n8n Header Auth credential: `Authorization: Bearer <Apify token>`.

The `1d` window overlaps from day to day, and big stories stay in the results for a while. The **Remove Duplicates** node in "Remove items processed in previous executions" mode, keyed on `{{ $json.url }}`, remembers every URL it has passed through and drops repeats. Because the URLs are the real publisher URLs, the key is stable.

Two caveats:

I don't want 20 Slack notifications. A Code node groups the articles by query, sorts each group newest first, caps it at 10 and builds Slack mrkdwn plus an HTML version for e-mail:

``` js
const groups = {};
for (const a of articles) {
  const key = String(a.query || a.topic || 'Other').replace(/"/g, '');
  (groups[key] = groups[key] || []).push(a);
}
// ... `- <${a.url}|${title}> (${source})` per article
```

If there are no new articles the node returns an empty array, so no message is sent. Quiet days stay quiet.

A standard Slack node posts `{{ $json.text }}` to `#news-alerts`. There is also a disabled Send Email node wired to the same output; enable it and add SMTP credentials to get the digest by mail as well.

The Actor charges **$0.0025 per article** (plus $0.0025 per article if you turn on full-text extraction and text was found). With two queries and a cap of 10 articles each, the worst case is 20 articles a day, about **$1.50 a month**. Quiet brands cost less. Note that duplicates are dropped in n8n *after* the run, so they are still paid for; set `maxArticlesPerSource` near the number of articles you realistically expect per day.

Apify's free plan includes $5 per month, enough for this and a few more workflows.

`includeFullText: true` and add an LLM step: "Summarise in two sentences and rate the sentiment towards our brand."`@channel` only when `"topics": ["TECHNOLOGY"]` to get the top headlines of whole sections.`"edition": "DE:de"` and merge.
Questions or ideas for the next recipe? Leave a comment.
