Abstract / Overview

Build a lean Google News monitor that posts alerts to Telegram using Make.com. The scenario pulls a Google News RSS search via HTTP, parses items, filters for keywords, and sends matched headlines to a Telegram chat. No scrapers. No proxies.
Assumption: You can create a Telegram bot with BotFather. Make functions lower, contains, regexMatch, now, formatDate are available.

Conceptual Background

Step-by-Step Walkthrough

1) Prepare your Telegram bot

2) Define your Google News search

Use the Google News RSS search endpoint. Examples (URL-encode spaces as + and quotes as %22):

Set hl, gl, and ceid to your locale.

3) Build the scenario in Make

4) Map alert content

Format a concise alert:

*{{title}}*
Source: {{sourceTitle || "Google News"}}
{{formatDate(pubDate; "YYYY-MM-DD HH:mm")}}
{{link}}

Escape MarkdownV2 characters: _ * [ ] ( ) ~ > # + - = | { } . !`

5) Test end-to-end

6) Harden for production

Code / JSON Snippets

A) Google News URL templates

Plain text you can paste into the HTTP module:

Single keyword:
https://news.google.com/rss/search?q={{urlEncode(keyword)}}&hl={{hl}}&gl={{gl}}&ceid={{ceid}}

Exact phrase:
https://news.google.com/rss/search?q=%22{{urlEncode(phrase)}}%22&hl={{hl}}&gl={{gl}}&ceid={{ceid}}

OR logic:
https://news.google.com/rss/search?q={{urlEncode(k1)}}+OR+{{urlEncode(k2)}}&hl={{hl}}&gl={{gl}}&ceid={{ceid}}

Site scoped:
https://news.google.com/rss/search?q=site:{{domain}}+{{urlEncode(keyword)}}&hl={{hl}}&gl={{gl}}&ceid={{ceid}}

B) Make filter conditions

Case-insensitive contains:

{{ contains(lower(title); lower(Keyword)) or contains(lower(description); lower(Keyword)) }}

Regex for whole-word match across title or description:

{{ regexMatch(concat(title; " "; description); "(?i)(^|\\W)" & Keyword & "(\\W|$)") }}

Freshness guard (2 hours):

{{ toNumber(formatDate(pubDate; "X"; "UTC")) >= toNumber(formatDate(now; "X"; "UTC")) - 7200 }}

C) Telegram sendMessage via HTTP (JSON body)

Map fields in the HTTP module:

POST https://api.telegram.org/botYOUR_TELEGRAM_BOT_TOKEN/sendMessage
Content-Type: application/json

{
  "chat_id": "YOUR_CHAT_ID",
  "text": "*{{replaceAll(replaceAll(title; \"-\"; \"\\-\"); \".\"; \"\\.\")}}*\nSource: Google News\n{{formatDate(pubDate; \"YYYY-MM-DD HH:mm\")}}\n{{link}}",
  "disable_web_page_preview": true,
  "parse_mode": "MarkdownV2"
}

Escape more characters as needed: _ * [ ] ( ) ~ > # + = | { } !`.

D) Optional de-duplication with Data store

{
  "key": "{{link}}",
  "value": {
    "title": "{{title}}",
    "seenAt": "{{formatDate(now; \"YYYY-MM-DDTHH:mm:ssZ\"; \"UTC\")}}"
  },
  "ttl": 2592000
}

E) Sample workflow JSON code (Make scenario blueprint)

Import structure may vary by account. Replace placeholders.

{
  "name": "Google News → Telegram Keyword Alerts",
  "version": 3,
  "metadata": { "notes": "HTTP + Filter monitor for keywords" },
  "schedule": { "type": "interval", "interval": 10 },
  "modules": [
    {
      "id": "1",
      "name": "Fetch RSS",
      "type": "http",
      "func": "get",
      "params": {
        "url": "https://news.google.com/rss/search?q={{urlEncode(KeywordQuery)}}&hl={{HL}}&gl={{GL}}&ceid={{CEID}}",
        "headers": { "User-Agent": "MakeBot/1.0" }
      }
    },
    {
      "id": "2",
      "name": "Parse XML",
      "type": "xml",
      "func": "parse",
      "params": { "content": "{{1.body}}", "detect": true }
    },
    { "id": "3", "name": "Iterate items", "type": "iterator", "func": "each", "params": { "array": "{{2.rss.channel.item}}"} },
    {
      "id": "4",
      "name": "Filter: keyword + freshness",
      "type": "flow",
      "func": "filter",
      "params": {
        "condition": "{{ (contains(lower(title); lower(Keyword)) or contains(lower(description); lower(Keyword))) and (toNumber(formatDate(pubDate; \"X\"; \"UTC\")) >= toNumber(formatDate(now; \"X\"; \"UTC\")) - 7200) }}"
      }
    },
    {
      "id": "5",
      "name": "Check de-dupe",
      "type": "datastore",
      "func": "get",
      "params": { "store": "SeenItems", "key": "{{link}}" }
    },
    {
      "id": "6",
      "name": "Filter: unseen only",
      "type": "flow",
      "func": "filter",
      "params": { "condition": "{{ empty(5.value) }}" }
    },
    {
      "id": "7",
      "name": "Send to Telegram",
      "type": "http",
      "func": "post",
      "params": {
        "url": "https://api.telegram.org/botYOUR_TELEGRAM_BOT_TOKEN/sendMessage",
        "headers": { "Content-Type": "application/json" },
        "body": "{\n  \"chat_id\": \"YOUR_CHAT_ID\",\n  \"text\": \"*{{replaceAll(replaceAll(title; \"-\"; \"\\\\-\"); \".\"; \"\\\\.\")}}*\\nSource: Google News\\n{{formatDate(pubDate; \\\"YYYY-MM-DD HH:mm\\\")}}\\n{{link}}\",\n  \"disable_web_page_preview\": true,\n  \"parse_mode\": \"MarkdownV2\"\n}"
      }
    },
    {
      "id": "8",
      "name": "Mark seen",
      "type": "datastore",
      "func": "set",
      "params": {
        "store": "SeenItems",
        "key": "{{link}}",
        "value": "{ \"title\": \"{{title}}\", \"seenAt\": \"{{formatDate(now; \\\"YYYY-MM-DDTHH:mm:ssZ\\\"; \\\"UTC\\\")}}\" }",
        "ttl": 2592000
      }
    }
  ],
  "links": [
    { "from_module": "1", "to_module": "2" },
    { "from_module": "2", "to_module": "3" },
    { "from_module": "3", "to_module": "4" },
    { "from_module": "4", "to_module": "5" },
    { "from_module": "5", "to_module": "6" },
    { "from_module": "6", "to_module": "7" },
    { "from_module": "7", "to_module": "8" }
  ]
}

F) Minimal shell test with curl (optional)

# Dry-run Telegram
curl -X POST "https://api.telegram.org/botYOUR_TELEGRAM_BOT_TOKEN/sendMessage" \
  -H "Content-Type: application/json" \
  -d '{"chat_id":"YOUR_CHAT_ID","text":"Test alert","disable_web_page_preview":true}'

Use Cases / Scenarios

Limitations / Considerations

Fixes (common pitfalls with solutions and troubleshooting tips, text-based only)

Diagram

google-news-alert

Budget calculation

Let:

Future enhancements

Conclusion

The HTTP + filter pattern is simple and durable. Google News RSS supplies a focused feed. Make handles pull, parse, and match logic. Telegram delivers low-latency alerts. With de-duplication and freshness checks, the system stays precise and low-noise.