Telegram + OpenAI, newsletters that send only real news
Your “newsletter” starts as a good idea, then turns into a chore. You skim 30 links, rewrite the same story twice, and still send something that feels… optional. Telegram news automation fixes that by only sending an edition when there’s actually something worth reading.
This hits marketing leads hardest because consistency matters, but agency owners and operators running a niche community feel it too. You want timely updates without blasting your list (or your channel) with noise.
This workflow pulls real news twice a day, deduplicates it against what you’ve already sent, asks OpenAI to make an editorial call, then delivers a clean brief to Telegram. You’ll see how it works, what you need, and what to tweak so it matches your topics and tone.
How This Automation Works
Here’s the complete workflow you’ll be setting up:
n8n Workflow Template: Telegram + OpenAI, newsletters that send only real news
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set topics and language", pos: "b", h: 48 }
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Build topic queries"]
n2["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Fetch news from SerpAPI (Duc.."]
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split SerpAPI results into a..", pos: "b", h: 48 }
n4@{ icon: "mdi:cog", form: "rounded", label: "Upsert articles into News ta..", pos: "b", h: 48 }
n5@{ icon: "mdi:cog", form: "rounded", label: "Get previous newsletters", pos: "b", h: 48 }
n6@{ icon: "mdi:cog", form: "rounded", label: "Sort newsletters by newest f..", pos: "b", h: 48 }
n7@{ icon: "mdi:cog", form: "rounded", label: "Get most recent newsletter", pos: "b", h: 48 }
n8@{ icon: "mdi:cog", form: "rounded", label: "Limit previous newsletters t..", pos: "b", h: 48 }
n9@{ icon: "mdi:cog", form: "rounded", label: "Aggregate previous newslette..", pos: "b", h: 48 }
n10["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Combine articles with last n.."]
n11@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter articles newer than l..", pos: "b", h: 48 }
n12@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Stop if last newsletter is t..", pos: "b", h: 48 }
n13@{ icon: "mdi:cog", form: "rounded", label: "Aggregate candidate articles..", pos: "b", h: 48 }
n14["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Combine candidate articles w.."]
n15@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If AI decided to send newsle..", pos: "b", h: 48 }
n16@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split selected articles for ..", pos: "b", h: 48 }
n17@{ icon: "mdi:brain", form: "rounded", label: "GPT-5.1", pos: "b", h: 48 }
n18@{ icon: "mdi:cog", form: "rounded", label: "Tavily web search tool", pos: "b", h: 48 }
n19@{ icon: "mdi:robot", form: "rounded", label: "Parse enriched article JSON", pos: "b", h: 48 }
n20@{ icon: "mdi:robot", form: "rounded", label: "AI: enrich & write article", pos: "b", h: 48 }
n21@{ icon: "mdi:robot", form: "rounded", label: "AI: decide send + select art..", pos: "b", h: 48 }
n22@{ icon: "mdi:cog", form: "rounded", label: "Aggregate enriched articles", pos: "b", h: 48 }
n23@{ icon: "mdi:cog", form: "rounded", label: "Insert newsletter content in..", pos: "b", h: 48 }
n24["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/telegram.svg' width='40' height='40' /></div><br/>Send newsletter to Telegram"]
n25@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n17 -.-> n20
n25 --> n0
n1 --> n2
n18 -.-> n20
n0 --> n1
n0 --> n5
n5 --> n6
n20 --> n22
n7 --> n10
n22 --> n23
n19 -.-> n20
n4 --> n10
n15 --> n16
n6 --> n7
n6 --> n8
n21 --> n15
n13 --> n14
n3 --> n4
n8 --> n9
n12 --> n13
n16 --> n20
n9 --> n14
n2 --> n3
n11 --> n12
n10 --> n11
n14 --> n21
n23 --> n24
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n25 trigger
class n19,n20,n21 ai
class n17 aiModel
class n11,n12,n15 decision
class n2 api
class n1 code
classDef customIcon fill:none,stroke:none
class n1,n2,n10,n14,n24 customIcon
Why This Matters: Newsletters Get Noisy Fast
Fast-moving topics punish you in both directions. If you send daily, you burn time filtering weak stories and your audience learns to ignore you. If you send weekly, you miss the one update that mattered on Tuesday and show up late with a “roundup” nobody asked for. The worst part is the mental load: you’re constantly deciding what’s new, what’s repeated, and what’s genuinely relevant, then formatting it all into something readable. It’s not hard work. It’s relentless work.
The friction compounds. Here’s where it breaks down in real life.
- You end up covering the same story again because last week’s newsletter isn’t searchable or structured.
- Manual curation turns into “just send something,” which trains your audience to expect filler.
- Fresh news gets buried when you only publish on a fixed schedule.
- Once you add more topics, it becomes impossible to keep quality consistent without adding hours.
What You’ll Build: An AI Editor That Sends Only Worthy Editions
This workflow acts like a small editorial desk that runs on a schedule but doesn’t publish on a schedule. Twice a day, it searches for fresh articles for each topic you care about, then stores them in a simple database so it can recognize repeats later. Next, it checks what you’ve sent before (recent editions) and filters out anything older than your last newsletter. After that, OpenAI gets a clear brief: decide “send” or “don’t send” using your rules, and select the best 3–5 articles when it is worth it. If the decision is yes, a second AI step enriches each selected story using web search, then everything is formatted as a clean Telegram newsletter and archived so future runs can avoid déjà vu.
The workflow starts with a schedule trigger and your topic settings. It then pulls real news from SerpAPI (DuckDuckGo News), compares candidates against your own newsletter history, and asks OpenAI to make the editorial call. Finally, it sends a formatted brief to Telegram and saves the edition for deduplication next time.
What You’re Building
| What Gets Automated | What You’ll Achieve |
|---|---|
|
|
Expected Results
Say you track 3 topics (like AI, automation, and your industry niche) and you check news twice daily. Manually, that’s maybe 10 minutes per topic to scan, decide, and copy links, plus another 20 minutes to format and write, so about an hour per day. With this workflow, you spend a couple minutes setting topics once, then it runs at 9:00 and 17:00 and only posts when the AI says “YES.” Most days you get your time back, and on busy news days you get a clean brief without the scramble.
Before You Start
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- SerpAPI for DuckDuckGo News search results
- OpenAI to make send decisions and draft briefs
- Tavily API key (get it from app.tavily.com)
- SerpAPI key (get it from serpapi.com dashboard)
- OpenAI API key (get it from your OpenAI platform account)
- Telegram bot + chat ID (create via BotFather, then copy target chat/channel ID)
Skill level: Intermediate. You’ll connect a few accounts, paste API keys, and adjust a small set of workflow settings like topics, schedule, and send limits.
Want someone to build this for you? Talk to an automation expert (free 15-minute consultation).
Step by Step
A scheduled check runs twice daily. The Schedule Trigger fires at set times (the default is morning and late afternoon). You can keep that cadence, or tighten it if your niche moves faster.
Your topics get split into individual searches. Instead of one messy query, the workflow creates one query per topic (for example: “AI” and “n8n” separately). That tends to produce more relevant results, and it gives the editor (OpenAI) cleaner inputs.
Fresh results are fetched, stored, and filtered. An HTTP Request pulls the last day of news via SerpAPI’s DuckDuckGo News engine. Each article is saved into a News table with an upsert rule, then compared against your last newsletter so only newer items make it forward.
OpenAI decides if you should send, then writes what to include. The “editor” sees candidates and the last few newsletters, checks for duplicates and weak stories, and returns a simple YES/NO plus the top articles. If it’s a YES, a second AI step enriches each story using Tavily web search and produces concise, factual copy.
The newsletter is delivered and remembered. The final edition is formatted in markdown, stored in a Newsletters table, then sent to Telegram. That archive is what prevents repeat coverage next week.
You can easily modify topics and language to match your audience, or switch the delivery destination from Telegram to email later. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Scheduled Trigger
Set the schedule that kicks off the digest building workflow.
- Add and open Scheduled Run Trigger.
- Set the Cron Expression to
0 0 9,17 * * *(runs at 09:00 and 17:00). - Confirm the node connects to Configure Topics & Language.
Step 2: Connect Topics, Language, and Parallel Inputs
Define your newsletter topics and language, then fan out to topic queries and newsletter history in parallel.
- Open Configure Topics & Language and set topics to
AI, n8n. - Set language to
English. - Set minDaysBetween to
2and maxDaysBetween to5. - Verify parallel execution: Configure Topics & Language outputs to both Generate Topic Queries and Retrieve Past Newsletters in parallel.
Step 3: Fetch and Store Fresh News Articles
Generate topic-specific queries, fetch news results, expand them, and upsert to your news database.
- In Generate Topic Queries, keep the JavaScript as provided to split
topicsinto separate items. - Open Retrieve SerpAPI News and set the URL to
https://serpapi.com/search.html. - Set query parameters: engine =
duckduckgo_news, q ={{ $json.topic }}, and df =d. - Credential Required: Connect your httpQueryAuth credentials in Retrieve SerpAPI News.
- In Expand News Results, set Field to Split Out to
results. - In Upsert Articles to News DB, set Operation to
upsertand map fields like{{ $json.url }},{{ $json.title }},{{ $json.source }},{{ $json.excerpt }}, and{{ DateTime.fromSeconds(Number($json.date), {zone: 'utc'}).toISO() }}. - Select your News data table ID in Upsert Articles to News DB (replace
[YOUR_ID]).
title and url, you may create duplicates. Keep both matching conditions enabled.Step 4: Load Newsletter History and Filter Candidates
Retrieve past newsletters, sort them, and merge with current articles to filter out content that’s too recent.
- In Retrieve Past Newsletters, set Operation to
getand Return All totrue, then select your Newsletters data table ID (replace[YOUR_ID]). - In Order Newsletters Latest, set Sort Field to
createdAtand Order todescending. - Confirm parallel execution: Order Newsletters Latest outputs to both Select Latest Newsletter and Restrict Newsletters to 5 in parallel.
- In Restrict Newsletters to 5, set Max Items to
5, then aggregate with Bundle Past Newsletters using Destination Field Namenewsletters. - In Merge Articles with Latest Meta, set Mode to
combineand Combine By tocombineAll. - In Filter Newer Articles, use the date condition
{{ $json.date_2 }}is after{{ $json.createdAt_1 ? $json.createdAt_1 : DateTime.fromISO('2024-01-01T00:00:00.000Z') }}. - In Halt If Newsletter Too Recent, keep the createdAt check against
{{ $now.minus({ days: $('Configure Topics & Language').item.json.minDaysBetween }) }}. - In Collect Candidate Articles, include fields
title_2, excerpt_2, source_2, url_2and set Destination Field Name toresults.
Step 5: Set Up AI Decisioning and Article Selection
Use an LLM to decide whether to send a newsletter and choose the top articles.
- In Merge Candidates with History, keep Mode as
combineand Combine By ascombineAllto mergeresultsandnewsletters. - Open AI: Decide Send & Pick Articles and keep JSON Output enabled.
- Confirm expressions reference:
{{ $('Configure Topics & Language').item.json.topics }},{{ $('Configure Topics & Language').item.json.maxDaysBetween }},{{ $('Select Latest Newsletter').item.json.createdAt ? Math.floor($now.diff(DateTime.fromISO($('Select Latest Newsletter').item.json.createdAt), 'days').days) : 999 }}, and{{ $('Configure Topics & Language').item.json.language }}. - Credential Required: Connect your openAiApi credentials in AI: Decide Send & Pick Articles.
- In Branch on AI Send Decision, keep the condition
{{ $json.message.content.decision }}equalsYES. - In Split Chosen Articles, set Field to Split Out to
message.content.articles.
Step 6: Enrich Articles with Research and Drafting
Use an AI agent with tools and an output parser to enrich each selected article.
- Open AI: Enrich and Draft Article and keep Prompt Type as
definewith the provided prompt text. - Confirm language is injected from Configure Topics & Language using
{{ $('Configure Topics & Language').item.json.language }}. - Ensure the AI tool Tavily Search Utility is connected and set its query to
{{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Query', ``, 'string') }}. - Credential Required: Connect your tavilyApi credentials in Tavily Search Utility (credentials are used by the parent AI: Enrich and Draft Article agent).
- Ensure OpenAI Model GPT-5.1 is connected as the language model for AI: Enrich and Draft Article.
- Credential Required: Connect your openAiApi credentials in OpenAI Model GPT-5.1.
- Ensure Decode Enriched Article JSON is attached as the output parser for AI: Enrich and Draft Article (credentials are managed on the parent node).
- In Aggregate Enriched Drafts, aggregate the
outputfield to prepare the newsletter content.
Step 7: Store and Dispatch the Newsletter
Archive the newsletter and send the final digest to Telegram.
- In Store Newsletter in Archive, map content to the expression that formats the articles:
{{ $json.output.map(article => { const title = JSON.stringify(article.title).slice(1, -1); const content = JSON.stringify(article.content).slice(1, -1); const source = JSON.stringify(article.source).slice(1, -1); const url = JSON.stringify(article.url).slice(1, -1); return `*${title}*\n${content}\nSource: [${source}](${url})`; }).join('\n\n') }}. - Select your Newsletters data table ID in Store Newsletter in Archive (replace
[YOUR_ID]). - In Dispatch Newsletter to Telegram, set chatId to
[YOUR_ID]and keep the text expression as provided. - Credential Required: Connect your telegramApi credentials in Dispatch Newsletter to Telegram.
Step 8: Test and Activate Your Workflow
Run a manual test to validate each branch and ensure the digest posts correctly.
- Click Execute Workflow to run Scheduled Run Trigger manually.
- Verify that Retrieve SerpAPI News returns results, and Upsert Articles to News DB stores new entries.
- Check that AI: Decide Send & Pick Articles returns
decisionand a list of articles in JSON format. - Confirm that Aggregate Enriched Drafts produces formatted output and Dispatch Newsletter to Telegram sends a message.
- When satisfied, toggle the workflow to Active for scheduled runs.
Troubleshooting Tips
- SerpAPI credentials can expire or hit usage limits. If results suddenly come back empty, check your SerpAPI dashboard usage and the API key stored in your n8n HTTP Request credentials.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Quick Answers
About 45 minutes if you already have the API keys and a Telegram bot.
No. You’ll connect services, paste keys, and adjust the topics and schedule.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in OpenAI API costs and your SerpAPI/Tavily usage (SerpAPI includes 250 free searches per month on its free tier).
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and it’s mostly edits in the “Configure Topics & Language” node. Common changes include adding more topics, switching the output language, tightening the minDaysBetween and maxDaysBetween guardrails, and changing the schedule trigger times. You can also swap the final “Dispatch Newsletter to Telegram” step for an email sender later, while keeping the same decision + dedupe core.
Most of the time it’s the bot token or the chat ID. Make sure the bot is added to the target channel or chat, confirm the chat ID is correct, then re-save credentials in n8n and test the Telegram send node. If it still fails, check Telegram permissions (channels often block posting unless the bot is an admin) and look for rate limiting if you’re sending multiple messages in a tight loop.
Practically, it’s limited by your API quotas more than n8n. On n8n Cloud, your plan’s monthly executions cap how often you can run it, while self-hosting removes execution limits and shifts the bottleneck to your server. This workflow is designed for a handful of topics checked twice daily; if you scale to dozens of topics, expect higher SerpAPI usage and longer AI processing times.
Often, yes, because the logic here is not a simple “if X then send Y.” You’ve got state (tables for News and Newsletters), deduplication, branching decisions, and two AI stages, which is where Zapier scenarios can get expensive and awkward. n8n also gives you self-hosting, so you can run twice-daily checks without worrying about per-task pricing spiraling. If you only want a basic daily digest, Zapier or Make can be quicker to set up. If you want “send only when it’s worth it,” n8n is a better fit. Talk to an automation expert if you want help picking the simplest option.
A newsletter that only speaks when it has something to say is easier to run and easier to trust. Set this up once, let it curate, and use the time you get back for work that actually moves the needle.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.