Telegram + TikTok posting, approve once, publish everywhere
Your content process probably isn’t “hard.” It’s just annoying. Ideas show up in DMs, voice notes live in random chats, captions get rewritten three times, and then you still have to upload the same video to multiple places without messing up a hashtag or account.
This is where Telegram TikTok automation pays off fast. Content managers feel it when approvals stall. Agency owners feel it when clients want “just one more tweak.” And solo creators get crushed by the repeat uploads.
This workflow turns Telegram into your “single inbox” for idea → approval → video generation → publishing, with status updates that come back to the same chat so you’re not guessing what posted.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Telegram + TikTok posting, approve once, publish everywhere
flowchart LR
subgraph sg0["Listen for incoming events Flow"]
direction LR
n0@{ icon: "mdi:robot", form: "rounded", label: "Generate a video", pos: "b", h: 48 }
n1@{ icon: "mdi:robot", form: "rounded", label: "AI Agent", pos: "b", h: 48 }
n2@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", 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/telegram.svg' width='40' height='40' /></div><br/>Listen for incoming events"]
n4@{ icon: "mdi:robot", form: "rounded", label: "Speech to Text", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "Voice or Text", 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/telegram.svg' width='40' height='40' /></div><br/>Get Voice File"]
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/code.svg' width='40' height='40' /></div><br/>Parse AI Output"]
n8@{ icon: "mdi:memory", form: "rounded", label: "Window Buffer Memory", pos: "b", h: 48 }
n9@{ icon: "mdi:cog", form: "rounded", label: "Download Video from Drive1", pos: "b", h: 48 }
n10@{ icon: "mdi:cog", form: "rounded", label: "Upload media1", pos: "b", h: 48 }
n11@{ icon: "mdi:cog", form: "rounded", label: "Create post1", pos: "b", h: 48 }
n12@{ icon: "mdi:cog", form: "rounded", label: "Get post1", pos: "b", h: 48 }
n13@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
n14@{ icon: "mdi:cog", form: "rounded", label: "Wait1", pos: "b", h: 48 }
n15@{ icon: "mdi:swap-horizontal", form: "rounded", label: "In Progress?", pos: "b", h: 48 }
n16@{ icon: "mdi:cog", form: "rounded", label: "Give Blotat other 5s :)", pos: "b", h: 48 }
n17@{ icon: "mdi:swap-horizontal", form: "rounded", label: "In Progress?1", pos: "b", h: 48 }
n18@{ icon: "mdi:cog", form: "rounded", label: "Wait2", pos: "b", h: 48 }
n19@{ icon: "mdi:swap-horizontal", form: "rounded", label: "In Progress?2", pos: "b", h: 48 }
n20@{ icon: "mdi:cog", form: "rounded", label: "Give Blotat other 5s :)2", pos: "b", h: 48 }
n21@{ icon: "mdi:swap-horizontal", form: "rounded", label: "A Voice?", pos: "b", h: 48 }
n22["<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.."]
n23@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Approved from user?", 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/>Inform user about processing"]
n25@{ icon: "mdi:database", form: "rounded", label: "Save Prompt & Post-Text", pos: "b", h: 48 }
n26@{ icon: "mdi:cog", form: "rounded", label: "Upload video", pos: "b", h: 48 }
n27@{ icon: "mdi:cog", form: "rounded", label: "Create TikTok post", pos: "b", h: 48 }
n28@{ icon: "mdi:cog", form: "rounded", label: "Check Post Status", pos: "b", h: 48 }
n29@{ icon: "mdi:cog", form: "rounded", label: "Give Blotat more time", pos: "b", h: 48 }
n30@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Published to TikTok?", pos: "b", h: 48 }
n31@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Published to Instagram?", pos: "b", h: 48 }
n32["<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.."]
n33["<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 Tiktok"]
n34["<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 TikTok Error Message"]
n35["<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"]
n36["<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"]
n37@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Published to Facebook?", pos: "b", h: 48 }
n38@{ icon: "mdi:cog", form: "rounded", label: "Create Facebook post", pos: "b", h: 48 }
n39@{ icon: "mdi:cog", form: "rounded", label: "Get Facebook post", pos: "b", h: 48 }
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"]
n13 --> n28
n14 --> n12
n18 --> n39
n21 --> n6
n21 --> n1
n1 --> n23
n12 --> n31
n11 --> n14
n15 --> n16
n15 --> n34
n26 --> n9
n17 --> n29
n17 --> n35
n19 --> n20
n19 --> n36
n10 --> n11
n10 --> n27
n10 --> n38
n5 --> n21
n6 --> n4
n4 --> n1
n7 --> n24
n0 --> n26
n28 --> n30
n39 --> n37
n2 -.-> n1
n27 --> n13
n23 --> n7
n23 --> n22
n38 --> n18
n30 --> n33
n30 --> n15
n8 -.-> n1
n29 --> n31
n37 --> n40
n37 --> n19
n16 --> n30
n31 --> n32
n31 --> n17
n25 --> n0
n20 --> n37
n9 --> n10
n3 --> n5
n24 --> n25
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 n3 trigger
class n0,n1,n4 ai
class n2 aiModel
class n8 ai
class n15,n17,n19,n21,n23,n30,n31,n37 decision
class n25 database
class n7 code
classDef customIcon fill:none,stroke:none
class n3,n6,n7,n22,n24,n32,n33,n34,n35,n36,n40 customIcon
The Problem: Multi-Platform Posting Turns Into Rework
Posting a video should be the easy part. In reality, it’s where momentum dies. You’ve got the idea, then you hunt for the file, then you paste captions into TikTok, then you repeat it for Instagram and Facebook, and each platform has its own little “gotcha.” A missed flag, the wrong account, a caption that gets clipped, a video that uploads but never publishes. Now you’re reuploading, apologizing, and trying to remember what version was “final.”
The friction compounds. After a few cycles, people post less often because it’s mentally expensive.
- Manual uploads across TikTok, Instagram, and Facebook easily take about 30 minutes per finished video once you include switching accounts and double-checking captions.
- Approval happens in one place, but publishing happens somewhere else, so teams lose the “approved” version and accidentally post an older draft.
- Status is unclear, which means you keep refreshing apps or asking “did that go live?” instead of moving on.
- When a platform fails, you often find out late, and you end up redoing work you already did once.
The Solution: Telegram In, Approved Content Out (Auto-Published)
This workflow gives you a clean pipeline that starts in Telegram and ends with published posts. You send a text idea or a voice note to a Telegram bot. If it’s voice, the workflow downloads the audio and uses OpenAI Whisper to transcribe it into text. Then an AI agent (backed by an OpenAI chat model) drafts two things: a video prompt for Gemini and a ready-to-post caption with hashtags. You review it right inside Telegram, ask for changes if needed, and only when you reply “approved” does the workflow move forward.
From there, Gemini generates a vertical 9:16 video. The file gets staged in Google Drive (upload, then download as binary so it’s easy to pass along). Blotato uploads the media once and creates posts for TikTok, Instagram, and Facebook using the same approved caption. Finally, the workflow polls each platform’s posting status and sends you a Telegram confirmation when each one is published (or an error message if something fails).
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you publish 4 videos a week, and each one needs to go to TikTok, Instagram, and Facebook. If manual posting takes maybe 10 minutes per platform, that’s about 2 hours a week just uploading and checking. With this workflow, you drop a voice note into Telegram (about 1 minute), approve the draft in the same chat, then wait for generation and publishing while you do other work. You still spend time reviewing, but the repetitive uploading mostly disappears.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Telegram for the bot-based content inbox
- OpenAI to transcribe voice and draft text
- Google Gemini (Vertex) to generate the video
- Google Drive to stage the generated video file
- Blotato to publish to TikTok, Instagram, Facebook
- Google Sheets (optional) to log prompts and captions
- Telegram Bot API Key (get it from BotFather in Telegram)
- OpenAI API Key (get it from your OpenAI dashboard)
- Blotato API Key (get it from your Blotato settings)
Skill level: Intermediate. You’ll connect a few accounts, paste API keys, and test a publish to make sure permissions are right.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A message hits your Telegram bot. The workflow triggers on every incoming Telegram message, then normalizes it so downstream steps always receive a single text field.
Voice gets transcribed, text passes through. If you sent a voice note, n8n downloads the audio file and runs it through OpenAI Whisper to get a transcript. If you sent text, it skips the transcription path.
AI drafts, you approve, and it keeps context. The AI agent proposes a video prompt (for Gemini) plus a social caption with hashtags, then asks what you want changed. A memory buffer keeps the conversation coherent so “make it punchier” actually sticks. When you reply “approved,” the workflow parses the final JSON and logs the prompt/caption to Google Sheets.
Video gets generated, staged, and published everywhere. Gemini generates the 9:16 video, Google Drive temporarily stores it, and Blotato uploads the media once and creates posts for TikTok, Instagram, and Facebook. n8n then polls each post status and sends Telegram confirmations as each platform finishes.
You can easily modify the approval wording to match your team’s style based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Telegram Trigger
Set up the workflow entry point so messages in Telegram start the automation.
- Add and open Telegram Incoming Trigger.
- Credential Required: Connect your telegramApi credentials.
- In Updates, keep
messageselected to capture text and voice messages. - Save and note the webhook URL if you need to register it with your Telegram bot.
Step 2: Extract Text and Route Voice Messages
Normalize incoming Telegram data and handle voice messages by transcription.
- Open Extract Message Text and set text to
{{$json?.message?.text || ""}}. - In Is Voice Message?, keep the condition that checks
{{$json.message.text}}is empty to route voice uploads. - Open Fetch Voice File and set File ID to
{{ $('Telegram Incoming Trigger').item.json.message.voice.file_id }}. - Credential Required: Connect your telegramApi credentials on Fetch Voice File.
- Open Transcribe Audio and keep Resource set to
audioand Operation set totranscribe. - Credential Required: Connect your openAiApi credentials on Transcribe Audio.
Step 3: Set Up the AI Prompting Layer
Configure the AI agent to generate a video prompt and social copy, plus memory for iterative feedback.
- Open Prompt Assistant and keep Text set to
{{$json.text}}and Prompt Type set todefine. - Ensure OpenAI Chat Engine is connected as the language model for Prompt Assistant.
- Credential Required: Connect your openAiApi credentials on OpenAI Chat Engine (credentials are added to the parent, not the agent).
- Open Conversation Window Memory and set Session Key to
{{ $('Telegram Incoming Trigger').first().json.message.from.id }}with Context Window Length set to10.
Step 4: Parse AI Output and Log Prompts
Validate the AI JSON output, notify the user, and store prompts in a spreadsheet.
- Review Approval Received? to confirm it detects JSON by checking
{{$json.output}}containsvideoPromptandsocialMediaText. - Keep Parse AI Result as-is to extract
videoPromptandsocialMediaTextfrom the AI output. - Open Notify Processing and confirm Text is set to
Okay. Your video is being prepared now. I'll let you know as soon as it's online.and Chat ID to{{ $('Telegram Incoming Trigger').item.json.message.chat.id }}. - Credential Required: Connect your telegramApi credentials on Notify Processing.
- Open Append Prompt Log and confirm Operation is
append, Document ID is your spreadsheet ID, and Sheet Name isgid=0. - Credential Required: Connect your googleSheetsOAuth2Api credentials on Append Prompt Log.
prompt and text, Append Prompt Log will fail to append.Step 5: Generate and Store the Video Asset
Create the video via Gemini, upload it to Drive, then download for media distribution.
- Open Produce Video Clip and set Prompt to
{{ $('Parse AI Result').item.json.videoPrompt }}with Resource set tovideo. - Credential Required: Connect your googlePalmApi credentials on Produce Video Clip.
- Open Upload Video to Drive and set Name to
{{$binary.generated_video.fileName || 'video.mp4'}}, and choose your target Folder. - Credential Required: Connect your googleDriveOAuth2Api credentials on Upload Video to Drive.
- Open Download Drive Video and keep Operation as
download, with File ID set to{{ $('Upload Video to Drive').item.json.id }}. - Credential Required: Connect your googleDriveOAuth2Api credentials on Download Drive Video.
Step 6: Upload Media and Publish to Social Platforms
Upload the video once, then publish to Instagram, TikTok, and Facebook in parallel.
- Open Upload Media Asset and keep Resource set to
mediawith Use Binary Data enabled. - Credential Required: Connect your blotatoApi credentials on Upload Media Asset.
- Confirm parallel execution: Upload Media Asset outputs to both Create Instagram Post and Create TikTok Post and Create Facebook Post in parallel.
- In Create Instagram Post, set Post Content Text to
{{ $('Parse AI Result').item.json.socialMediaText }}and Post Content Media URLs to{{ $json.url }}. - In Create TikTok Post, set Platform to
tiktok, Post Content Text to{{ $('Parse AI Result').item.json.socialMediaText }}, Post Content Media URLs to{{ $json.url }}, and enable AI Generated. - In Create Facebook Post, set Platform to
facebookand fill Facebook Page ID and Account ID. - Credential Required: Connect your blotatoApi credentials on all Blotato publishing nodes (Create Instagram Post, Create TikTok Post, Create Facebook Post).
[YOUR_ID] in your Blotato account and page selectors before testing.Step 7: Configure Status Checks and Notifications
Poll publishing status and notify the user when posts are live or if failures occur.
- Keep Delay TikTok Check, Delay Instagram Check, and Delay Facebook Check set to
30seconds to pace status polling. - Configure Check TikTok Status, Retrieve Instagram Post, and Retrieve Facebook Post with Post Submission ID set to
{{ $json.postSubmissionId }}. - In TikTok Published?, Instagram Published?, and Facebook Published?, keep the condition matching
publishedstatus to drive success routing. - Confirm the “in-progress” loops use TikTok In Progress?, Instagram In Progress?, and Facebook In Progress? with corresponding wait nodes Pause TikTok 5s, Pause Instagram 5s, and Pause Facebook 5s.
- Set success notifications using Confirm TikTok Live, Confirm Instagram Live, and Confirm Facebook Live with Chat ID set to
{{ $('Telegram Incoming Trigger').item.json.message.chat.id }}and Text referencing{{ $json.publicUrl }}. - Ensure failure notifications Alert TikTok Failure, Alert Instagram Failure, and Alert Facebook Failure are connected to the “false” branches of the in-progress checks.
- Credential Required: Connect your telegramApi credentials on all Telegram notification nodes (9 total, including confirmations and alerts).
=published. If your API returns published without the equals sign, update the condition to match exactly.Step 8: Test and Activate Your Workflow
Run end-to-end tests and then activate for production use.
- Click Execute Workflow and send a test text message to your Telegram bot to trigger Telegram Incoming Trigger.
- Verify that Prompt Assistant replies with a draft and that Send Draft to User delivers it to Telegram.
- Reply “approved” in Telegram to push the flow through Approval Received?, Parse AI Result, and Notify Processing.
- Confirm that Produce Video Clip generates output, Upload Video to Drive stores it, and Upload Media Asset provides a media URL.
- Ensure posts are created on all platforms and that you receive live confirmations from Confirm TikTok Live, Confirm Instagram Live, and Confirm Facebook Live.
- When everything works as expected, toggle the workflow to Active for production use.
Common Gotchas
- Telegram credentials can expire or need specific permissions. If things break, check your bot token in BotFather and confirm the token in n8n 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.
- Blotato can fail silently if the connected social account loses authorization. If you start getting “in-progress” loops forever, check your Blotato account connections and reconnect TikTok/Instagram/Facebook.
Frequently Asked Questions
About an hour if you already have the API keys and accounts connected.
No. You’ll mostly paste credentials and adjust a few text fields. The only “technical” part is testing once and confirming each platform can publish.
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 (Whisper + chat) and Gemini video generation costs, plus whatever Blotato plan you’re on.
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 a common tweak. In n8n, you can disable the Blotato branches for Instagram and Facebook by turning off the “Create Instagram Post” and “Create Facebook Post” paths. You can also adjust the AI Agent’s system prompt so it writes a shorter TikTok-first caption, then keep the rest of the approval loop exactly the same.
Usually it’s a bad or rotated bot token. Regenerate or re-copy the token from BotFather, update the Telegram credentials in n8n, then send a fresh message to the bot to re-test. If it still fails, make sure you are talking to the correct bot and that your trigger node is listening to the right update types (text and voice).
If you self-host, it’s mostly limited by your server and the external APIs, not n8n.
For this use case, n8n is usually the better fit because the workflow needs branching logic (voice vs text), an approval loop with memory, file handling, and status polling. Those pieces are doable in Zapier or Make, but they get clunky and can get expensive as you add steps and retries. n8n also gives you a self-host option, which is handy when you start running more executions. Zapier still wins for simple two-step automations and quick prototypes, honestly. Talk to an automation expert if you want help choosing.
Once this is running, Telegram becomes the only place you need to think about posting. The workflow handles the repetitive parts, then taps you on the shoulder when everything is live.
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.