Google Gemini + Telegram: RSS drafts ready to review
RSS is supposed to make content easier. Then you realize you’re still copying links, skimming articles, outlining, writing, finding an image, and chasing approvals across DMs. It’s a lot of small steps that somehow steals your whole afternoon.
Content managers feel it first. But a marketing lead trying to ship weekly posts, or an agency owner juggling client reviews, runs into the same bottleneck. This RSS draft automation turns new feed items into review-ready drafts (with a cover image) and delivers them straight to Telegram.
You’ll see exactly what the workflow does, what you need to run it, and what results to expect once it’s set up.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Gemini + Telegram: RSS drafts ready to review
flowchart LR
subgraph sg0["RSS 1 Flow"]
direction LR
n0["<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/>Merge"]
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/merge.svg' width='40' height='40' /></div><br/>Merge1"]
n2@{ icon: "mdi:robot", form: "rounded", label: "Gemini Content Generation", pos: "b", h: 48 }
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/code.svg' width='40' height='40' /></div><br/>Json Parser"]
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Slug Selector", pos: "b", h: 48 }
n5@{ icon: "mdi:robot", form: "rounded", label: "Generate Image", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-vertical", form: "rounded", label: "Image Renamer", pos: "b", h: 48 }
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/s3.png' width='40' height='40' /></div><br/>Upload Image to Cloudflare R.."]
n8@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If Statement", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If Statement2", pos: "b", h: 48 }
n10@{ icon: "mdi:cog", form: "rounded", label: "Get an item", pos: "b", h: 48 }
n11@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items1", pos: "b", h: 48 }
n12@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n13@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items2", pos: "b", h: 48 }
n14@{ icon: "mdi:cog", form: "rounded", label: "Create or update an item", pos: "b", h: 48 }
n15["<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/>Merge3"]
n16@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n17@{ icon: "mdi:swap-vertical", form: "rounded", label: "Last Content Detection", pos: "b", h: 48 }
n18["<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/>Telegram Debugger"]
n19["<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/>Telegram Debugger1"]
n20["<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/>Telegram Debugger2"]
n21@{ icon: "mdi:cog", form: "rounded", label: "Convert to File", pos: "b", h: 48 }
n22@{ icon: "mdi:play-circle", form: "rounded", label: "RSS 1", pos: "b", h: 48 }
n23@{ icon: "mdi:play-circle", form: "rounded", label: "RSS 2", pos: "b", h: 48 }
n24@{ icon: "mdi:play-circle", form: "rounded", label: "RSS 3", pos: "b", h: 48 }
n25["<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/>Edit Chat ID"]
n16 --> n2
n16 --> n14
n16 --> n18
n0 --> n6
n22 --> n13
n23 --> n12
n24 --> n11
n1 --> n9
n15 --> n16
n10 --> n15
n3 --> n5
n3 --> n4
n3 --> n1
n8 --> n1
n8 --> n19
n9 --> n17
n9 --> n20
n6 --> n7
n4 --> n0
n5 --> n0
n21 --> n25
n12 --> n10
n12 --> n15
n11 --> n10
n11 --> n15
n13 --> n10
n13 --> n15
n17 --> n21
n2 --> n3
n7 --> n8
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 n22,n23,n24 trigger
class n2,n5 ai
class n8,n9,n16 decision
class n3 code
classDef customIcon fill:none,stroke:none
class n0,n1,n3,n7,n15,n18,n19,n20,n25 customIcon
The Problem: RSS Content Pipelines Break at Review Time
Pulling ideas from RSS sounds organized, but the process usually collapses when it’s time to turn “interesting link” into “draft someone can approve.” You read a post, paste the URL into a doc, write a rough version, then try to remember what you already processed last week. Meanwhile, someone asks for a cover image, a slug, a meta description, and a clean handoff to whoever publishes. If you’re doing this for multiple feeds, duplicates sneak in and you end up rewriting the same topic twice. Honestly, it’s the mental context switching that hurts most.
The friction compounds. Here’s where it breaks down.
- You spend about 30 minutes per article just getting to a “first draft” that’s structured well enough to review.
- Duplicate topics slip through, which means wasted writing time and messy editorial calendars.
- Images become a last-minute scramble, so posts get delayed or published without a consistent look.
- Drafts live in too many places, so approvals turn into “Can you resend that file?” threads.
The Solution: RSS → Gemini Draft + Cover → Telegram JSON
This workflow watches multiple RSS feeds on a schedule (hourly, daily, weekly, whatever you choose) and pulls in newly published items. For each item, it checks a DynamoDB table to confirm the URL hasn’t been processed before, so you don’t generate the same draft twice. When the article is truly new, Google Gemini produces a complete blog draft in a structured JSON format, including a title, meta description, slug, and a prompt for an on-brand cover image. The workflow then cleans and parses Gemini’s output (so you get valid JSON, not messy code blocks), generates the cover image, uploads it to Cloudflare R2, and finally packages everything into a single [slug].json file. That file gets sent to Telegram as a document, ready for review and quick feedback.
The workflow starts with RSS feed triggers and batching, then runs a deduplication check in DynamoDB. Gemini creates the post and the cover image, and n8n assembles the final payload. Telegram receives the finished JSON file, so reviews happen in one place.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you track 3 RSS sources and you typically turn 5 items per week into draft candidates. Manually, even a “quick” flow is about 20 minutes to read and outline, 40 minutes to draft, and another 10 minutes to find or brief an image. Call it about 70 minutes each, or roughly 6 hours a week. With this workflow, you mostly just review: the RSS trigger runs automatically, Gemini generates the draft, and Telegram gets a JSON file plus cover image link. Your time becomes “scan and approve,” often 10 minutes per draft, so you’re closer to an hour a week.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Gemini for article drafts and images
- Telegram to receive review-ready JSON files
- AWS DynamoDB credentials (create in AWS IAM, then add to n8n)
Skill level: Intermediate. You’ll connect a few services, set permissions, and verify the JSON output matches what your reviewers expect.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
RSS triggers pull new items. The workflow monitors multiple feeds (for example, publications like Search Engine Journal and TechCrunch) and collects fresh URLs on your schedule.
Deduplication blocks repeats. Each URL is checked against a DynamoDB table. If the link already exists, the workflow stops for that item and sends a quick debug note to Telegram, so you know it was intentionally skipped.
Gemini generates the content and the image prompt. For new articles, Gemini produces a complete draft in JSON, including a slug, meta description, and the full body content. A code step cleans the response and parses it reliably, because AI output can be messy if you don’t enforce formatting.
Cover image is created and stored. Gemini generates a 1200×630 image, the file is renamed using the slug, and it’s uploaded to Cloudflare R2. If the upload fails, Telegram gets an alert instead of silently losing the asset.
Telegram receives a single review artifact. The workflow merges the draft JSON with the hosted image URL, converts it into a [slug].json file, and sends it to your Telegram recipients as a document.
You can easily modify the RSS sources to match your niche, then route the finished file to a different channel based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the RSS Feed Trigger
Set up the three RSS trigger sources that feed the workflow and control how often new items are checked.
- Open RSS Trigger Alpha and set Feed URL to your primary RSS link (currently empty).
- In RSS Trigger Alpha, keep Poll Times as configured:
everyHourandeveryWeek. - Open RSS Trigger Beta and set Feed URL to a secondary RSS link, then keep Poll Times at
everyWeek. - Open RSS Trigger Gamma and set Feed URL to a third RSS link, with Poll Times set to
everyWeekandweekday: 5athour: 12. - Verify each trigger connects to its batch node: RSS Trigger Alpha → Batch Items A, RSS Trigger Beta → Batch Items B, RSS Trigger Gamma → Batch Items C.
Step 2: Connect AWS DynamoDB for De-duplication
Use DynamoDB to prevent duplicate blog posts and gate content creation based on previously processed links.
- Open Fetch Record and set Operation to
getwith Table Name set toprocessed_rss_linksand key article_url set to={{ $json.link }}.
Credential Required: Connect your aws credentials. - Ensure Batch Items A, Batch Items B, and Batch Items C route into Fetch Record and Combine Sources C for unified processing.
- Open Combine Sources C and confirm Mode is
combinewith Combine By set tocombineAll. - Configure New Article Gate to check whether article_url is empty, using
={{ $json.article_url }}with the empty operator. - Open Upsert Record and set Table Name to
processed_rss_links, mapping article_url to={{ $json.link }}.
Credential Required: Connect your aws credentials. - Confirm the parallel split: New Article Gate outputs to both Gemini Article Draft and Upsert Record in parallel.
Step 3: Set Up AI Drafting and Parsing
Generate the blog draft with Gemini and parse it into a structured JSON payload for downstream steps.
- Open Gemini Article Draft and confirm Model is
models/gemini-2.5-flashwith the prompt message that includes{{ $json.link }}.
Credential Required: Connect your googlePalmApi credentials. - Review Parse Gemini Output and keep the provided JavaScript parsing logic intact to extract the blog JSON.
- Note the parallel split: Parse Gemini Output outputs to Create Cover Image, Select Slug Field, and Combine Streams B in parallel.
- Open Select Slug Field and set slug to
={{ $json.slug }}to pass the slug forward. - Configure Create Cover Image with Resource set to
imageand Prompt set to=**Image Size: 1200x630 aspect Ratio 1.91:1** {{ $json.image_generation_prompt }}.
Credential Required: Connect your googlePalmApi credentials.
Step 4: Configure Image Handling and Storage
Merge the slug and image data, rename the image, upload it to R2, and validate upload success.
- Confirm Combine Streams merges the slug from Select Slug Field and the image data from Create Cover Image using Mode
combineand Combine BycombineAll. - Open Rename Image File and set fileName to
={{ $json.slug }}.{{ $json.fileExtension }}with Include Other Fields enabled. - Open Upload Image to R2 and set Operation to
upload, Bucket Name tosaywize-media, and File Name to={{ $json.fileName }}.
Credential Required: Connect your s3 credentials. - Check Image Upload Check to validate
={{ $json.success }}istruebefore continuing.
Step 5: Map Final Content and Deliver the JSON File
Validate content, map fields to the final schema, serialize to JSON, and send to Telegram.
- Confirm Combine Streams B merges the parsed content and image upload status before the validation step.
- Open Content Validation Check and keep the current condition chain to gate final output creation.
- In Map Final Content, map fields exactly as configured, including image_url set to
=https://cdn.saywize.com/{{ $json.slug }}.pngand article_url set to={{ $('Combine Sources C').item.json.link }}. - Open Serialize to File and confirm Operation is
toJsonwith File Name set to={{ $json.slug }}.json. - Open Send File to Telegram and set Operation to
sendDocumentwith Binary Data enabled.
Credential Required: Connect your telegramApi credentials.
Step 6: Add Error and Status Alerts
Configure Telegram alerts for existing content, image failures, and validation failures.
- Open Alert Existing Article and confirm the message text:
=Since the article already exists, the blog post could not be created: {{ $json.article_url }}.
Credential Required: Connect your telegramApi credentials. - Open Alert Image Failure and keep the message
An error occurred during image creation..
Credential Required: Connect your telegramApi credentials. - Open Alert Blog Failure and keep the message
I encountered a problem while creating a blog..
Credential Required: Connect your telegramApi credentials. - Verify the routing: New Article Gate false path → Alert Existing Article, Image Upload Check false path → Alert Image Failure, and Content Validation Check false path → Alert Blog Failure.
Step 7: Test and Activate Your Workflow
Run a full test to confirm RSS ingestion, AI generation, image upload, and Telegram delivery.
- Manually execute RSS Trigger Alpha (or any trigger) with a sample RSS item to start the workflow.
- Verify New Article Gate allows a new item through and that Gemini Article Draft produces a valid response parsed by Parse Gemini Output.
- Confirm the image is uploaded by checking Upload Image to R2 and a
trueresult in Image Upload Check. - Check that Serialize to File produces a JSON file and Send File to Telegram delivers the document to your chat.
- Once verified, toggle the workflow Active to enable automated execution in production.
Common Gotchas
- AWS DynamoDB credentials can expire or need specific permissions. If things break, check the AWS IAM access key status and the table permissions 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 and keys are ready.
No. You’ll mostly connect services and paste in credentials. The only “code” is already included in the workflow for cleaning Gemini’s JSON output.
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 Google Gemini API usage and storage costs for Cloudflare R2.
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 change the final delivery step. Replace the “Send File to Telegram” node with a Slack file upload (or a message with a link), and keep the “Serialize to File” node so reviewers still get one clean artifact. Common tweaks include changing the RSS sources, tightening the Gemini prompt for your brand voice, and adjusting the validation checks so low-quality drafts get flagged instead of delivered.
Usually it’s the bot token or chat ID. Re-check the Telegram credentials in n8n, confirm the bot is added to the target chat, and make sure it has permission to send documents. If you’re sending to a channel, the bot often needs admin access. Also watch for workflow runs that fail earlier (like image upload), because the file node may never receive a valid attachment.
A lot, as long as your plan and API limits support it. On n8n Cloud Starter, you’re working within monthly execution limits; on higher tiers you can run more. If you self-host, there’s no execution cap, but your server resources and Gemini rate limits become the bottleneck. In practice, most teams comfortably process dozens to a few hundred RSS items a week once batching and deduplication are in place.
For this workflow, n8n is usually the better fit. Deduping against DynamoDB, cleaning malformed AI JSON, branching on validation, and handling file generation as a document are all easier when you have full control over logic. Zapier and Make can do pieces of this, but complex flows get expensive and brittle fast. If you only need “RSS item → send a summary,” those tools are fine. If you want a review-ready draft package with storage and guardrails, n8n wins more often than not. Talk to an automation expert if you want a quick recommendation based on your volume.
Once this is running, RSS stops being a reading list and becomes a steady stream of drafts you can actually approve. Set it up once, then spend your time editing the ideas that deserve it.
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.