Telegram to Upload-Post, approved posts go live
Your social posting process probably isn’t “hard.” It’s just endless. Drafts in one place, approvals in another, final posts stuck in a scheduler, and somehow you still miss a day.
This Telegram post automation hits marketers first, because consistency is part of the job. But small business owners and agency leads feel the same friction when approvals drag and content quality slips.
This workflow keeps everything in one loop: generate a post, review it in Telegram, approve it, then publish through Upload-Post. You’ll see how it works, what you need, and where teams usually trip up.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Telegram to Upload-Post, approved posts go live
flowchart LR
subgraph sg0["Wait for User Topic Reply Flow"]
direction LR
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/>Wait for User Topic Reply"]
n4@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Validate Reply Format", 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/code.svg' width='40' height='40' /></div><br/>Parse User Input"]
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Input Validation Check", 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/telegram.svg' width='40' height='40' /></div><br/>Send Input Error Message"]
n8@{ icon: "mdi:robot", form: "rounded", label: "AI Content Generator", pos: "b", h: 48 }
n9@{ icon: "mdi:robot", form: "rounded", label: "Structure AI Output", 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/code.svg' width='40' height='40' /></div><br/>Validate Generated Content"]
n11@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Content Quality Gate", 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/telegram.svg' width='40' height='40' /></div><br/>Send Generation Error"]
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/code.svg' width='40' height='40' /></div><br/>Format Content Preview"]
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/telegram.svg' width='40' height='40' /></div><br/>Send Preview & Await Approval"]
n15@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check User Approval", 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 Cancellation Notice"]
n17@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Posts for Publishing", pos: "b", h: 48 }
n18@{ icon: "mdi:cog", form: "rounded", label: "Web Research Tool (Optional)", pos: "b", h: 48 }
n19@{ icon: "mdi:brain", form: "rounded", label: "AI Language Model", pos: "b", h: 48 }
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/merge.svg' width='40' height='40' /></div><br/>Merge Approval Data"]
n21["<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 Success Notification"]
n22@{ icon: "mdi:cog", form: "rounded", label: "Publish to Social Platforms", pos: "b", h: 48 }
n5 --> n6
n19 -.-> n8
n15 --> n17
n15 --> n16
n20 --> n15
n9 -.-> n8
n8 --> n10
n11 --> n13
n11 --> n12
n4 --> n5
n13 --> n14
n13 --> n20
n6 --> n8
n6 --> n7
n3 --> n4
n17 --> n22
n10 --> n11
n22 --> n21
n18 -.-> n8
n14 --> n20
end
subgraph sg1["Schedule Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", 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/>Create Schedule Timestamp"]
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/>Request Content Topic via Te.."]
n0 --> n1
n1 --> n2
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,n0 trigger
class n8,n9 ai
class n19 aiModel
class n4,n6,n11,n15 decision
class n5,n10,n13,n1 code
classDef customIcon fill:none,stroke:none
class n3,n5,n7,n10,n12,n13,n14,n16,n20,n21,n1,n2 customIcon
The Problem: Social posts die in the approval gap
Most teams don’t fail at social because they can’t write. They fail because the writing, checking, approving, and publishing happen in different places, at different times, with different people. A draft gets written, then sits in a doc. Someone requests tweaks in a chat. You copy the final text into a tool, reformat it, and hope you didn’t accidentally remove a link or break the character limit. Multiply that by daily posting and multiple channels, and you’ve created a tiny recurring tax on your business.
It adds up fast. And the worst part is you never feel “done,” because there’s always one more approval, one more paste, one more check.
- Approvals happen in scattered threads, so you waste time chasing the latest “final” version.
- Character limits get checked too late, which means last-minute rewrites and weaker hooks.
- Posting to multiple platforms becomes repetitive admin work, not marketing.
- When you’re busy, the process breaks, and consistency disappears for a week.
The Solution: Generate, validate, approve in Telegram, then publish
This workflow turns Telegram into your simple “content command center.” It can start on a schedule, send a prompt request to Telegram, and wait for your reply with the topic or angle you want. From there, it uses an AI model (via OpenRouter, so you can choose GPT-4, Claude, and others) to draft the post. Before you ever see it, the workflow audits the output for format, checks quality against a pass threshold, and enforces a tight character range (240–265) so you’re not posting bloated drafts. Then it sends you a clean preview in Telegram. Reply “approve,” and it publishes through Upload-Post to the platforms you’ve connected. Reply “reject,” and it can retry generation (up to three attempts) or cancel cleanly.
The flow starts with a scheduled trigger and a Telegram message. AI writes the draft and the workflow validates it. Finally, a simple Telegram approval decides whether Upload-Post publishes it or the workflow loops back to improve the draft.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you publish one post per day to five channels (LinkedIn, X, Facebook, Instagram, and another community platform). Manually, you might spend about 10 minutes drafting, then another 10 minutes formatting and posting per platform, plus a few minutes chasing an approval. That’s roughly an hour a day. With this workflow, you send a topic in Telegram, wait for the draft, then spend about 5–10 minutes approving (or rejecting). Upload-Post handles the rest, so you’re usually done in under 15 minutes.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Telegram for approvals and notifications.
- Upload-Post to publish to your social channels.
- OpenRouter API key (get it from your OpenRouter dashboard).
Skill level: Intermediate. You’ll connect a few accounts, paste API keys, and test the approval loop end-to-end.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A schedule (or a message) kicks things off. The workflow can run on a set cadence, generate a timestamp for tracking, and then prompt you in Telegram to send a topic or content request.
Your Telegram reply gets checked before anything else happens. If the message format is off, you’ll get an immediate “input error” response so you’re not wondering why nothing posted.
AI drafts the post and the workflow audits it. Using OpenRouter, the content is generated, then shaped into a structured format. A validation pass checks character length (240–265), basic formatting, and a quality threshold so weak drafts don’t sneak through.
You approve or reject in Telegram, then publishing happens automatically. Approved posts can be split into multiple parts if you’re doing threads, then Upload-Post publishes to the channels you’ve connected and confirms success back in Telegram.
You can easily modify the character limits to match a platform’s best practices based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Scheduled Trigger
Set the workflow cadence so it starts content sessions on a predictable schedule.
- Add and open Scheduled Launch Trigger.
- Set the Rule to trigger every
5days at9AM using the interval settings shown in the node. - Connect Scheduled Launch Trigger to Generate Run Timestamp.
Step 2: Connect Telegram for Topic Intake and Validation
These nodes collect the topic, validate it, and route valid input into the AI flow. There are 6 Telegram-related nodes—connect the same Telegram credentials to all of them.
- Open Telegram Topic Request and set Text to the provided multi-line prompt. Keep the expression for schedule name in place:
{{ $json.scheduleName }}. - Set Chat ID to
{{ $credentials.telegramChatId }}in Telegram Topic Request. - Add Await Telegram Reply and ensure it listens for updates =
message. - Configure Verify Reply Format to check that
{{ $json.message.reply_to_message }}exists and{{ $json.message.text }}is not empty. - Keep the parsing logic in Interpret User Message to output topic, format_type, and validation_status.
- In Route Valid Input, ensure the condition checks
{{ $json.validation_status }}equalspassed, then connect success to AI Post Composer and failure to Notify Input Error. - In Notify Input Error, keep Chat ID as
={{ $json.chat_id }}so errors return to the right user.
Step 3: Set Up AI Generation and Structured Output
This step generates social content and ensures a structured JSON response for downstream processing.
- Open AI Post Composer and set Text to
=Create social media content about: {{ $json.topic }} Format type: {{ $json.format_type }}. - Keep the long System Message in AI Post Composer to enforce character and style rules.
- Connect Primary Language Model to AI Post Composer as the language model; set Model to
openai/gpt-4o. - Attach Shape AI Response to AI Post Composer as the output parser and leave the manual schema as provided.
- If you want web lookup, connect Optional Web Research to AI Post Composer and keep Query as
={{ $fromAI('Query', '', 'string') }}.
Step 4: Configure Quality Checks and Preview Creation
Validate the AI output, then build a user-friendly preview for approval.
- Verify Audit Generated Content keeps the quality checks and outputs validation_status and tweets_array.
- In Quality Approval Gate, confirm the condition checks
{{ $json.validation_status }}equalspassedto route valid output to Build Preview Text. - Keep Build Preview Text as-is to generate preview_text that includes topic, format, and post count.
- Note the parallel flow: Build Preview Text outputs to both Send Preview for Approval and Combine Approval Data in parallel.
Step 5: Configure Approval Routing and Publishing
Route user approval, split posts for release, and publish to social channels with confirmation.
- In Send Preview for Approval, set Chat ID to
{{ $node['Interpret User Message'].json.chat_id }}and Message to={{ $json.preview_text }}with Operation =sendAndWait. - Ensure Combine Approval Data is in mode =
combineand combineBy =combineByPosition. - In Evaluate Approval Choice, check
{{ $json.data.approved }}istrueto send approved content to Split Posts for Release, and rejected content to Send Cancellation Update. - In Split Posts for Release, set Field To Split Out to
tweets_array. - Configure Publish to Social Channels with User =
{{ $credentials.username }}, Title =={{ $json.post }}, Operation =uploadText, Platform =xandlinkedin, and X Reply Settings =everyone. - Set Send Publish Confirmation to message the same user using
{{ $node['Interpret User Message'].json.chat_id }}.
Step 6: Test and Activate Your Workflow
Validate the full execution from scheduled trigger to approval and publishing.
- Manually execute the workflow from Scheduled Launch Trigger and confirm Telegram Topic Request sends the prompt.
- Reply in Telegram using a valid format like
“sustainable living tips - single”and verify Interpret User Message outputs validation_status =passed. - Confirm the AI path runs from AI Post Composer → Audit Generated Content → Quality Approval Gate and that the preview is sent.
- Approve with ✅ and ensure posts publish via Publish to Social Channels and a final message arrives from Send Publish Confirmation.
- Activate the workflow by toggling it to Active once tests succeed.
Common Gotchas
- Telegram credentials can expire or the bot can lose webhook access. If things break, check your bot token and webhook URL configuration in Telegram/@BotFather and your 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 an hour if your API keys and social accounts are ready.
No. You’ll mostly connect accounts and paste credentials. The “logic” is already built into the workflow.
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 OpenRouter usage (often a few cents per post, depending on model and retries).
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 one of the best reasons to use this template. You can switch between single posts and 3–6 post threads by adjusting the AI prompt and keeping the “Split Posts for Release” logic enabled. Tone changes usually live in the AI Post Composer instructions (for example: educational, founder voice, playful, or technical). If you want current events, turn on the optional Tavily web research tool so the model has fresh context.
Usually it’s the bot token or webhook URL being wrong after a change to your n8n domain. Regenerate the Telegram bot token if needed, then update the Telegram credentials in n8n. Also check that your n8n instance can receive inbound webhooks (common issue on locked-down firewalls), because the approval replies depend on it. If failures happen only sometimes, rate limits or a slow instance can cause Telegram triggers to arrive late.
A lot.
For an approval-driven workflow, n8n is usually a better fit because you can add branching, retries, validation checks, and multi-step logic without turning it into an expensive pile of tasks. It also supports self-hosting, which matters once you’re generating and posting every day across multiple brands. Zapier and Make can still work if you only need a basic “send draft, get yes/no, post” flow, but you’ll hit limits faster when you add quality gates and threads. If you’re unsure, map out the must-haves (approval, retries, character enforcement, multi-platform publishing) and compare costs. Talk to an automation expert if you want a quick second opinion.
Once this is running, “posting daily” stops being a daily project. You approve in Telegram, Upload-Post publishes, and you move on to work that actually grows the business.
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.