DEV Community

Fast Data
Fast Data

Posted on

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

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.

The result

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)
...
Enter fullscreen mode Exit fullscreen mode

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.

The workflow

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

1. Search Google News

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
}
Enter fullscreen mode Exit fullscreen mode

A few details that matter for monitoring:

  • Quotes make a query an exact phrase. Without them, Acme Corp also matches every article that mentions "acme" and "corp" separately.
  • Google News operators work: "Acme" -jobs, intitle:acme, site:techcrunch.com.
  • edition sets country and language; 18 editions are supported (US, UK, Germany, France, Japan...).
  • Every article comes back with title, source, publishedAt and the original publisher URL. Google News RSS only gives you 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>.

2. Only new articles

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:

  • The first run has an empty history, so it posts everything.
  • The node keeps a limited history (I set 50,000 keys). If it ever fills up, n8n stops with "exceeds the maximum history size"; raise the limit or clear the history.

3. Build one message

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:

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
Enter fullscreen mode Exit fullscreen mode

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

4. Slack and e-mail

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.

Cost

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.

Ideas

  • Summaries and sentiment: set includeFullText: true and add an LLM step: "Summarise in two sentences and rate the sentiment towards our brand."
  • Tiered alerts: a Filter node that pings @channel only when source is Reuters, Bloomberg or the FT.
  • Industry radar: add "topics": ["TECHNOLOGY"] to get the top headlines of whole sections.
  • Several markets: duplicate the HTTP node with "edition": "DE:de" and merge.
  • Archive: append every new article to Google Sheets for monthly reporting.

Get it

Questions or ideas for the next recipe? Leave a comment.

Top comments (0)