Telegram + Google Sheets: approve AI posts faster
Posting “consistently” sounds simple until you’re stuck rewriting captions, chasing approvals, and digging through chats to find the latest version of an image. Then you finally publish… and realize you posted the wrong draft. Again.
This Telegram Sheets approval automation hits social media managers first, honestly. But founders running their own accounts and agency leads juggling clients feel the same drag. You send an idea once, approve in chat, and every version is logged cleanly in Google Sheets.
Below you’ll see how the workflow turns Telegram into an AI content pipeline, what gets automated, and what you need to run it without babysitting the process.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Telegram + Google Sheets: approve AI posts faster
flowchart LR
subgraph sg0["Listen for incoming events Flow"]
direction LR
n0@{ icon: "mdi:robot", form: "rounded", label: "AI Agent", pos: "b", h: 48 }
n1@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", 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/telegram.svg' width='40' height='40' /></div><br/>Listen for incoming events"]
n3@{ icon: "mdi:robot", form: "rounded", label: "Speech to Text", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Voice or Text", pos: "b", h: 48 }
n5["<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/>Get Voice File"]
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/code.svg' width='40' height='40' /></div><br/>Parse AI Output"]
n7@{ icon: "mdi:memory", form: "rounded", label: "Window Buffer Memory", pos: "b", h: 48 }
n8@{ icon: "mdi:cog", form: "rounded", label: "Upload media1", pos: "b", h: 48 }
n9@{ icon: "mdi:cog", form: "rounded", label: "Get post1", pos: "b", h: 48 }
n10@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
n11@{ icon: "mdi:cog", form: "rounded", label: "Wait1", pos: "b", h: 48 }
n12@{ icon: "mdi:swap-horizontal", form: "rounded", label: "In Progress?", pos: "b", h: 48 }
n13@{ icon: "mdi:cog", form: "rounded", label: "Give Blotat other 5s :)", pos: "b", h: 48 }
n14@{ icon: "mdi:swap-horizontal", form: "rounded", label: "In Progress?1", pos: "b", h: 48 }
n15@{ icon: "mdi:swap-horizontal", form: "rounded", label: "A Voice?", pos: "b", h: 48 }
n16["<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 questions or proposal t.."]
n17@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Approved from user?", 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/>Inform user about processing"]
n19@{ icon: "mdi:database", form: "rounded", label: "Save Prompt & Post-Text", pos: "b", h: 48 }
n20@{ icon: "mdi:cog", form: "rounded", label: "Check Post Status", pos: "b", h: 48 }
n21@{ icon: "mdi:cog", form: "rounded", label: "Give Blotat more time", pos: "b", h: 48 }
n22@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Published to Instagram?", pos: "b", h: 48 }
n23["<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/>Confirm publishing to Instag.."]
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 Instagram Error Message"]
n25@{ icon: "mdi:cog", form: "rounded", label: "Create x post", pos: "b", h: 48 }
n26@{ icon: "mdi:robot", form: "rounded", label: "Generate an image", pos: "b", h: 48 }
n27["<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 a photo message"]
n28["<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 message and wait for re.."]
n29@{ icon: "mdi:cog", form: "rounded", label: "Upload image1", pos: "b", h: 48 }
n30@{ icon: "mdi:cog", form: "rounded", label: "Download image from Drive", pos: "b", h: 48 }
n31@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If1", pos: "b", h: 48 }
n32@{ icon: "mdi:cog", form: "rounded", label: "Wait2", pos: "b", h: 48 }
n33@{ icon: "mdi:swap-horizontal", form: "rounded", label: "In Progress?2", pos: "b", h: 48 }
n34@{ icon: "mdi:cog", form: "rounded", label: "Give Blotat other 5s :)1", pos: "b", h: 48 }
n35@{ icon: "mdi:cog", form: "rounded", label: "Check Post Status1", pos: "b", h: 48 }
n36@{ icon: "mdi:cog", form: "rounded", label: "Create instagram Post", pos: "b", h: 48 }
n37@{ icon: "mdi:cog", form: "rounded", label: "Create FB post", pos: "b", h: 48 }
n38@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Published to Facebook ?", pos: "b", h: 48 }
n39["<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 Facebook Error Message"]
n40["<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/>Confirm publishing to Facebook"]
n41@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Published to X?", pos: "b", h: 48 }
n42["<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/>Confirm publishing to X"]
n43["<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 X Error Message"]
n31 --> n8
n10 --> n20
n11 --> n9
n32 --> n35
n15 --> n5
n15 --> n0
n0 --> n17
n9 --> n22
n12 --> n13
n12 --> n43
n25 --> n10
n14 --> n21
n14 --> n24
n33 --> n34
n33 --> n39
n29 --> n30
n8 --> n36
n8 --> n25
n8 --> n37
n4 --> n15
n37 --> n32
n5 --> n3
n3 --> n0
n6 --> n18
n41 --> n42
n41 --> n12
n20 --> n41
n26 --> n29
n26 --> n27
n1 -.-> n0
n35 --> n38
n17 --> n6
n17 --> n16
n27 --> n28
n7 -.-> n0
n36 --> n11
n21 --> n22
n13 --> n41
n38 --> n40
n38 --> n33
n22 --> n23
n22 --> n14
n19 --> n26
n34 --> n38
n30 --> n31
n2 --> n4
n18 --> n19
n28 --> n31
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 n2 trigger
class n0,n3,n26 ai
class n1 aiModel
class n7 ai
class n12,n14,n15,n17,n22,n31,n33,n38,n41 decision
class n19 database
class n6 code
classDef customIcon fill:none,stroke:none
class n2,n5,n6,n16,n18,n23,n24,n27,n28,n39,n40,n42,n43 customIcon
The Problem: Approvals and version control slow down posting
“Make an image, write a caption, get it approved, post it” turns into a messy loop the moment there’s more than one person involved (or you’re switching between phone and desktop). Drafts live in Telegram threads, captions live in Notes, the “final-final” image is somewhere in Drive, and the status of what actually got published is… a guess. The time cost is bad, but the mental load is worse. You waste energy doing admin work instead of making better creative decisions, and that’s usually what stalls consistency.
It adds up fast. Here’s where it breaks down in real life.
- You end up approving the wrong version because the latest caption is buried under three “quick tweaks” in chat.
- Voice notes help you move faster, but someone still has to transcribe them and turn them into a usable prompt.
- Manual posting across platforms means repeating the same upload and copy routine three times per post.
- No reliable log exists, so you can’t answer basic questions like “What did we publish last Tuesday?” without digging.
The Solution: A Telegram-based AI image + caption approval loop
This workflow turns Telegram into your content inbox and approval room. You send a text or voice idea to a Telegram bot, and the workflow normalizes the input so AI can work with it either way. An AI Agent (backed by an OpenAI chat model) drafts two things: a detailed image prompt for Google Gemini to generate the visual, and a ready-to-post caption for social media. You review the draft in Telegram, ask for revisions if needed, then approve. After that, Gemini generates the image, you get a preview in Telegram, and you approve one last time before anything goes public. Once approved, the workflow uploads the image, publishes to Instagram, X, and Facebook via Blotato, and keeps checking status until each platform is confirmed (or you’re notified of a failure). Google Sheets logs the prompt and post text so you always have a clean record of what was created and what was used.
The workflow starts with a Telegram message, then moves into an AI refinement loop that stays in the same chat thread. After your final “yes,” it generates the image, publishes to your chosen platforms, and sends Telegram confirmations as each post goes live.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you publish 5 image posts a week to Instagram, X, and Facebook. Manually, you’ll spend maybe 10 minutes writing and polishing the caption, then about 10 minutes per platform uploading and posting, plus another 10 minutes chasing approvals and finding the right file. That’s roughly 1 hour per post, or about 5 hours a week. With this workflow, the “work” becomes: send an idea in Telegram (a minute), reply with feedback, approve the image preview, done. You still review creatively, but the repeatable parts shrink to about 15 minutes per post, which is several hours back every week.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Telegram to capture ideas and approvals in chat
- Google Sheets to log prompts, captions, and versions
- Telegram Bot API Key (create a bot in BotFather)
- OpenAI API Key for Whisper transcription and the chat model
- Google Gemini API Key for AI image generation
- Google Drive to temporarily store generated images
- Blotato API Key to publish to Instagram, X, and Facebook
Skill level: Intermediate. You’ll connect accounts, add API keys, and test approvals end-to-end once.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
Telegram message triggers the workflow. A Telegram bot listens for incoming messages. If it’s a voice note, the audio file is pulled in and transcribed so you always end up with one clean text idea.
The AI drafts a prompt and caption, then waits for your approval. The AI Agent proposes a Gemini-ready image prompt plus social copy. You can reply with tweaks, and the workflow keeps the conversation context so revisions don’t restart from scratch.
Gemini generates the image and you approve the final preview. Once the text is approved, the workflow logs the prompt and caption to Google Sheets, generates the image in Gemini, and sends the preview to Telegram. If you don’t approve, it stops before publishing.
Publishing and status checks happen automatically. Approved images are uploaded to Google Drive briefly, then sent to Blotato as a media asset. Blotato creates the Instagram, X, and Facebook posts, and n8n polls status until each one is published or fails, then messages you in Telegram.
You can easily modify which platforms publish (or add a schedule) based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Telegram Trigger
This workflow starts when a message is received in Telegram and immediately maps the incoming text for downstream processing.
- Add and configure Telegram Event Listener as the trigger with Updates set to
message. - Credential Required: Connect your
telegramApicredentials in Telegram Event Listener. - Optional: keep Flowpast Branding as a sticky note for documentation (no configuration required).
Step 2: Connect Input Mapping and Voice Handling
Map text input and route voice messages to transcription before they reach the AI pipeline.
- In Map Input Text, set text to
{{$json?.message?.text || ""}}. - Configure Detect Voice Input to check leftValue
{{$json.message.text}}and route empty text to voice handling. - In Retrieve Voice File, set File ID to
{{$('Telegram Event Listener').item.json.message.voice.file_id}}. - Credential Required: Connect your
telegramApicredentials in Retrieve Voice File and all other Telegram action nodes used later. - In Audio Transcription, set Resource to
audioand Operation totranscribe. - Credential Required: Connect your
openAiApicredentials in Audio Transcription.
Detect Voice Input outputs to Retrieve Voice File or Prompt Orchestrator based on whether the message text is empty.
Step 3: Set Up AI Prompting and Memory
Use the agent to draft prompts and social text, with memory for ongoing Telegram conversations.
- In Prompt Orchestrator, set Text to
{{$json.text}}and keep the system message as provided to enforce the JSON approval format. - OpenAI Chat Engine is connected as the language model for Prompt Orchestrator — ensure credentials are added to OpenAI Chat Engine.
- Credential Required: Connect your
openAiApicredentials in OpenAI Chat Engine. - In Session Memory Buffer, set Session Key to
{{$('Telegram Event Listener').first().json.message.from.id}}and Context Window Length to10. - Session Memory Buffer is an AI sub-node attached to Prompt Orchestrator — add credentials to the parent node if your AI provider requires them.
- Configure Approval Detected? to check
{{$json.output}}for JSON approval markers (videoPrompt/socialMediaText). - In Send Draft for Review, set Text to
{{$('Prompt Orchestrator').item.json.output}}and Chat ID to{{$('Telegram Event Listener').first().json.message.chat.id}}.
Approval Detected? outputs to Extract AI Results if the JSON is present, or to Send Draft for Review if revisions are needed.
Step 4: Extract Results, Log Prompts, and Generate an Image
Parse the approved AI output, notify the user, save to Sheets, then generate a media asset.
- Keep Extract AI Results code as-is to parse JSON for
videoPromptandsocialMediaText. - In Notify Processing Start, set Text to
Okay. Your video is being prepared now. I'll let you know as soon as it's online.and Chat ID to{{$('Telegram Event Listener').item.json.message.chat.id}}. - In Append Prompt to Sheet, set Operation to
append, Document ID to[YOUR_ID], and Sheet Name to[YOUR_ID]. - Map prompt to
{{$('Extract AI Results').item.json.videoPrompt}}and text to{{$('Extract AI Results').item.json.socialMediaText}}. - Credential Required: Connect your
googleSheetsOAuth2Apicredentials in Append Prompt to Sheet. - In Generate Image, set Prompt to
{{$('Extract AI Results').item.json.videoPrompt}}and Resource toimage. - Credential Required: Connect your
googlePalmApicredentials in Generate Image.
Generate Image outputs to both Upload Image to Drive and Send Photo Preview in parallel.
[YOUR_ID] values in Append Prompt to Sheet and the social publishing nodes, otherwise the workflow will fail at runtime.Step 5: Configure Preview, Approval, and File Storage
Send a preview image for approval, store the file in Drive, and gate the publishing flow based on user response.
- In Send Photo Preview, set Operation to
sendPhoto, enable Binary Data, and set Chat ID to{{$('Telegram Event Listener').item.json.message.chat.id}}. - In Await Approval Reply, set Operation to
sendAndWaitwith MessageGood?and Chat ID to{{$('Telegram Event Listener').item.json.message.chat.id}}. - In Upload Image to Drive, set Name to
=dataand Input Data Field Name to=data, and select your target folder. - Credential Required: Connect your
googleDriveOAuth2Apicredentials in Upload Image to Drive and Download Image File. - In Download Image File, set File ID to
{{$('Upload Image to Drive').item.json.id}}and Operation todownload. - In Approval Gate, confirm the condition checks
{{$json.data.approved}}equalstrue.
Step 6: Configure Media Upload and Social Publishing
Upload the approved media to Blotato and publish it to three platforms in parallel.
- In Upload Media Asset, set Resource to
media, enable Use Binary Data, and set Binary Property Name to{{$('Generate Image').item.binary.data}}. - Credential Required: Connect your
blotatoApicredentials in Upload Media Asset and all Blotato publishing/status nodes. - In Create Instagram Post, set Post Content Text to
{{$('Extract AI Results').item.json.socialMediaText}}and Post Content Media URLs to{{$json.url}}. - In Create X Publication, set Platform to
twitter, Post Content Text to{{$('Extract AI Results').item.json.socialMediaText}}, and Post Content Media URLs to{{$json.url}}. - In Create Facebook Post, set Platform to
facebook, assign Facebook Page ID and Account ID, and map text/media as above.
Upload Media Asset outputs to Create Instagram Post, Create X Publication, and Create Facebook Post in parallel.
Step 7: Configure Publishing Status Checks and Notifications
Poll each platform for completion, handle in-progress delays, and notify the user of success or errors.
- Set Delay Check A to
30seconds and Delay Check B to10seconds to pace status polling. - Set Delay Check FB to
30seconds before Query Post Status FB. - In Fetch Post Status A, Query Post Status X, and Query Post Status FB, keep Post Submission ID as
{{$json.postSubmissionId}}. - Configure Instagram Published?, X Published?, and Facebook Published? to check
{{$json.status}}equalspublished. - Configure Status In Progress IG, Status In Progress X, and Status In Progress FB to check
{{$json.status}}equalsin-progress, then route to the respective Pause Extra Time node. - In Confirm Instagram Live, Confirm X Live, and Confirm Facebook Live, keep Text messages and map Chat ID to
{{$('Telegram Event Listener').item.json.message.chat.id}}. - Ensure Notify Instagram Error, Notify X Error, and Notify Facebook Error are connected to the “false” branches of the in-progress checks.
Credential Required: Connect your telegramApi credentials to all Telegram notification nodes (11+ nodes handle confirmations, previews, approvals, and errors).
Step 8: Test and Activate Your Workflow
Validate the end-to-end flow from Telegram input to social publishing before going live.
- Click Execute Workflow and send a Telegram message to trigger Telegram Event Listener.
- Approve the draft after Send Photo Preview and confirm that Approval Gate routes to Upload Media Asset.
- Verify success messages from Confirm Instagram Live, Confirm X Live, and Confirm Facebook Live with valid
{{$json.publicUrl}}links. - When satisfied, toggle the workflow to Active for production use.
Common Gotchas
- Telegram credentials can expire or you may be testing the wrong bot. If things break, check BotFather settings and the token stored in n8n credentials 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 you already have the API keys ready.
No. You’ll mostly connect accounts and paste API keys into n8n credentials.
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 and Gemini API usage, which usually stays low for a few posts per day.
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 do it at the publishing layer. Keep the Telegram approval loop, the OpenAI prompt/caption drafting, and the Gemini image generation the same, then swap or add a LinkedIn publishing branch where the Blotato “Create post” nodes live. Many teams also customize the AI Agent’s system message to generate a LinkedIn-style caption (tighter hook, fewer hashtags), while keeping the Instagram/X copy as a separate field in Google Sheets. If you want different approval rules, adjust the two approval checks: one for the text draft and one for the final image preview.
Usually it’s the bot token, not n8n. Regenerate the token in BotFather (or confirm you copied the right one), then update the Telegram credentials in n8n and re-test the trigger. It can also fail if your bot hasn’t been started by the user account you’re testing with, because Telegram won’t deliver messages to a bot that was never opened.
On n8n Cloud Starter, you can usually run thousands of executions per month, and self-hosting has no execution cap (it depends on your server). In practice, this workflow is limited more by image generation time and API rate limits than by n8n itself, so it’s a good fit for daily posting and small batch campaigns.
For this workflow, n8n is a better fit if you want the approval loop, memory for revisions, and multi-branch status checks without paying extra for every path. Zapier and Make can absolutely do “send message, get approval,” but the moment you add voice transcription, iterative AI drafting, and per-platform publish polling, it gets awkward and expensive. n8n also gives you the option to self-host, which is useful when volumes grow. Still, if your version is only “generate a caption and email it to me,” simpler tools may feel faster to maintain. Talk to an automation expert if you want help choosing.
Once this is running, content approval stops being a mini project. The workflow handles the repeatable parts so you can focus on ideas, not logistics.
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.