Telegram + Google Sheets: branded news posts, done
Your Telegram channel goes quiet, not because you don’t have content, but because turning “new article is live” into a polished post is annoyingly manual. You copy links, grab an image, rewrite the intro, try to keep the tone consistent, and then you still forget what you already shared.
This Telegram Sheets automation hits marketing managers first, but founders and agency folks running client channels feel it too. The outcome is simple: new articles become branded Telegram posts automatically, and every shared link is logged so you don’t repost the same thing next week.
Below you’ll see exactly how the workflow pulls articles from a webpage (no RSS needed), rewrites the text with AI, watermarks the image, posts to Telegram, and tracks it all in Google Sheets.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Telegram + Google Sheets: branded news posts, done
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:cog", form: "rounded", label: "No Operation, do nothing", pos: "b", h: 48 }
n1@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
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 Page"]
n3["<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/html.dark.svg' width='40' height='40' /></div><br/>Extract Links from HTML"]
n4["<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/>Clean and Trim Links"]
n5@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check: Should We Parse?", pos: "b", h: 48 }
n6["<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/>Open Article by Link"]
n7["<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/html.dark.svg' width='40' height='40' /></div><br/>Extract Article Description"]
n8["<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/>Clean and Trim Text"]
n9@{ icon: "mdi:database", form: "rounded", label: "Check Links in Google Sheet", pos: "b", h: 48 }
n10@{ icon: "mdi:database", form: "rounded", label: "Update Google Sheet with Cle..", pos: "b", h: 48 }
n11@{ icon: "mdi:robot", form: "rounded", label: "Text processing", pos: "b", h: 48 }
n12["<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/>Get Article Image"]
n13["<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 Post to Telegram"]
n14@{ icon: "mdi:cog", form: "rounded", label: "Add Watermark Text to Image", pos: "b", h: 48 }
n15@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", pos: "b", h: 48 }
n2 --> n3
n11 --> n12
n1 --> n2
n12 --> n14
n15 -.-> n11
n8 --> n10
n4 --> n9
n6 --> n7
n5 --> n0
n5 --> n6
n3 --> n4
n14 --> n13
n9 --> n5
n7 --> n8
n10 --> n11
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 n1 trigger
class n11 ai
class n15 aiModel
class n5 decision
class n9,n10 database
class n2,n6,n12 api
class n4,n8 code
classDef customIcon fill:none,stroke:none
class n2,n3,n4,n6,n7,n8,n12,n13 customIcon
The Problem: Keeping Telegram Active Without Reposting
Posting “fresh” news to Telegram sounds easy until you do it for a month. You’re juggling the website, a notes doc, a design tool for the image, and Telegram itself. Then the messy parts show up: the same link gets shared twice, a post goes out with a bland snippet, or the image looks off-brand next to yesterday’s post. It’s not hard work. It’s repeat work, and it steals attention from the stuff that actually grows your channel.
The friction compounds. Here’s where it breaks down most often.
- Someone has to check the site for new articles, and it usually happens “when there’s time.”
- Manual copy-paste creates inconsistent intros, which means more edits and weaker hooks.
- Without a simple log of posted links, duplicates creep in during busy weeks.
- Branding slips because the image process changes depending on who’s posting that day.
The Solution: Auto-Create Branded Telegram Posts From Any Webpage
This workflow runs on a schedule, visits the webpage you choose, and pulls out article links directly from the HTML. For each link, it checks a Google Sheet to see if it has been shared before. If it’s new, the workflow loads the article page, extracts the important details, and cleans the text so it’s ready for a Telegram-friendly post. Then an AI agent rewrites or summarizes the content in your preferred tone, keeping things readable instead of “copy-pasted from a website.” Finally, it fetches the article’s image, overlays a watermark so every post looks consistently branded, and publishes the finished message to your Telegram channel.
The workflow starts with a scheduled trigger and a webpage fetch. It turns raw HTML into a clean list of links, filters out anything already logged in Google Sheets, then generates a polished Telegram post with AI text plus a watermarked image. After that, it publishes and records the link so the next run stays tidy.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you publish 5 articles per week and you also share each one to Telegram. Manually, it’s usually about 20 minutes per post (find the link, write a short summary, prep an image, publish, then note it somewhere), so you’re spending roughly 2 hours a week on a task that doesn’t need your brain. With this workflow, the “work” is basically zero after setup: it runs on schedule, and you only step in when you want to tweak tone or branding. You still get posts going out, but the process feels automatic instead of fragile.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Telegram for publishing posts to a channel
- Google Sheets to log links and avoid duplicates
- OpenAI API key (get it from your OpenAI dashboard)
Skill level: Intermediate. You’ll paste a URL, connect accounts, and tweak a prompt and watermark settings.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A timed schedule kicks it off. n8n runs the workflow on the cadence you choose (every hour, twice a day, weekdays only). You control how “fresh” your channel feels.
The workflow pulls links from your webpage. It fetches the HTML, parses out article URLs, then normalizes them so comparisons work cleanly (small differences like tracking parameters don’t mess you up).
Google Sheets acts as your memory. Each link is checked against your sheet. If it already exists, the workflow stops for that item. If it’s new, the workflow logs it so future runs know it’s handled.
AI and branding take over the content packaging. The workflow loads the article, extracts and cleans the text, then sends it through an AI agent powered by an OpenAI chat model. It also grabs the article image and overlays watermark text so the post looks like it came from you.
You can easily modify the target webpage and the AI writing style based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Schedule Trigger
This workflow starts on a timed schedule, then pulls the latest news page before any parsing begins.
- Add and open Timed Automation Trigger.
- Set the schedule rule to run every hour by configuring the interval field to
hours. - Confirm the execution flow: Timed Automation Trigger → Retrieve News Page.
Tip: If you need more frequent checks, adjust the interval field (for example, every 30 minutes) before testing.
Step 2: Connect Google Sheets
These nodes track processed links to prevent duplicates and update the sheet once a new article is handled.
- Open Lookup Links in Sheet and select your spreadsheet in Document and the correct tab in Sheet (values are currently placeholders like
[YOUR_ID]). - Credential Required: Connect your googleSheetsOAuth2Api credentials in Lookup Links in Sheet.
- Open Update Sheet with Link and confirm Operation is set to
update. - In Update Sheet with Link, set the column mapping for url to
{{ $('Normalize Link Data').item.json.fullUrl }}and row_number to2. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Update Sheet with Link.
⚠️ Common Pitfall: Leaving [YOUR_ID] placeholders in Lookup Links in Sheet or Update Sheet with Link will cause the workflow to fail at runtime.
Step 3: Set Up Parsing and Validation
This block fetches the news page, extracts the latest link and image, checks for duplicates, then loads and cleans the article text.
- In Retrieve News Page, set URL to
https://www.film.ru/topic/newsand keep Send Headers enabled with the provided headers. - In Parse HTML Links, set Operation to
extractHtmlContentand confirm the CSS selectors:- link →
.redesign_topic_main strong - image →
.wrapper_block_stack var
- link →
- In Normalize Link Data, keep the JavaScript that builds
imageandfullUrlfrom the extracted values. - In Validate Parsing Need, set the condition to compare
{{ $json.url }}with{{ $('Normalize Link Data').item.json.fullUrl }}. - Confirm the routing: Lookup Links in Sheet → Validate Parsing Need, then the true/false output either goes to Idle Pass Through or Load Article Page.
- In Load Article Page, set URL to
{{ $('Normalize Link Data').item.json.fullUrl }}. - In Extract Article Details, set Operation to
extractHtmlContentwith CSS selectors:- Title →
.wrapper_articles_left h1 - Text →
.wrapper_articles_text
- Title →
- In Refine Article Text, keep the JavaScript that removes bracketed text and outputs
cleanText.
Tip: Idle Pass Through is a no-op node used to end the branch when no new article is detected—keep it in place for clean logic.
Step 4: Set Up AI Formatting, Image Processing, and Telegram Output
This segment formats the article text with AI, fetches and watermarks the image, then posts to Telegram.
- Open AI Text Formatter and keep Prompt Type set to
definewith the provided system message. - Ensure the prompt references are intact:
{{ $('Extract Article Details').item.json.Title }}and{{ $('Refine Article Text').item.json.cleanText }}. - Confirm that OpenAI Chat Engine is connected as the language model for AI Text Formatter.
- Credential Required: Connect your OpenAI credentials in OpenAI Chat Engine (AI tool credentials are added to the parent language model, not inside AI Text Formatter).
- In Fetch Article Image, set URL to
{{ $('Normalize Link Data').item.json.image }}. - In Overlay Watermark Text, set Operation to
text, Text toKINO ЛЕГЕНДЫ NET, Font Size to48, Font Color to#F3ECEC, and Position Y to150. Keep Data Property Name as=data. - In Post to Telegram Channel, set Operation to
sendPhoto, enable Binary Data, and set Caption to{{ $json.output }}with Parse Mode asMarkdown. - Credential Required: Connect your telegramApi credentials in Post to Telegram Channel.
⚠️ Common Pitfall: If OpenAI Chat Engine credentials are missing, AI Text Formatter will fail even though it doesn’t have its own credential field.
Step 5: Test and Activate Your Workflow
Run a manual test to confirm the end-to-end pipeline before enabling scheduled execution.
- Click Execute Workflow and observe the run from Timed Automation Trigger through Post to Telegram Channel.
- Verify that Update Sheet with Link writes the new URL to the correct row in your spreadsheet.
- Confirm that Telegram receives a photo with a watermarked image and a formatted caption from AI Text Formatter.
- Once successful, toggle the workflow to Active for production use.
Common Gotchas
- Google Sheets credentials can expire or need specific permissions. If things break, check the n8n Credentials page and confirm the sheet is shared with the connected Google account first.
- 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.
Frequently Asked Questions
About 45 minutes if your accounts are ready.
No. You will connect accounts, paste your webpage URL, and adjust a couple of text and watermark settings.
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, which are usually pennies per post unless you’re summarizing very long articles.
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, but you’ll want to do it cleanly. The easiest approach is duplicating the “Retrieve News Page” and parsing section per site, then writing to the same Google Sheet with an extra “Source” column. You can also swap the AI prompt in the AI Agent so each site gets a different tone, which is handy if one source is formal and another is more casual. If your sites have different layouts, expect to tweak the HTML extraction rules per site.
Usually it’s the bot token, the chat ID, or missing permission to post in the channel. Double-check that the bot is an admin in the channel, then re-save the Telegram credentials in n8n. If it still fails, look at the Telegram node error details, because Telegram’s API responses are normally specific about what it didn’t like.
A lot, as long as your hosting and plan can keep up. On n8n Cloud Starter plan, you can process up to a set number of executions per month, and higher plans handle more. If you self-host, there’s no execution cap, but your server CPU and memory become the limit. Practically, most small teams run this hourly or daily and process anywhere from a few new links to a few dozen without issues.
Often, yes, because this is not a simple “new item → post message” flow. You’re parsing HTML, cleaning article text, checking a sheet to prevent duplicates, generating AI copy, and watermarking an image. That’s a bunch of branching and processing that gets pricey or clunky on many no-code tools. n8n is also nicer when you want to self-host for unlimited runs. If you only need a basic RSS-to-Telegram forwarder, Zapier or Make can be quicker to set up. Talk to an automation expert if you want a second opinion on tool choice.
Once this is running, your channel stays consistent without someone babysitting it. Set it up, let it post, and use your time on content 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.