Telegram to LinkedIn, share one link across socials
You find a great link, share it in your team chat, and then… nothing. Or worse, you post it once, forget the other channels, and later can’t even find the permalink you need for reporting.
This Telegram social posting automation hits marketing managers first, honestly. But agency owners chasing consistency and consultants trying to look “always on” feel it too. The outcome is simple: one URL in Telegram turns into publish-ready posts for LinkedIn, Facebook, and Instagram, plus a clean Google Sheets log with all the links.
You’ll see how the workflow grabs the page content, writes platform-specific copy, generates an image, publishes the posts, then sends you a Telegram confirmation so you can review fast.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Telegram to LinkedIn, share one link across socials
flowchart LR
subgraph sg0["Telegram Intake 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/telegram.svg' width='40' height='40' /></div><br/>Telegram Intake Trigger"]
n1@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Validate URL Presence", pos: "b", h: 48 }
n2@{ icon: "mdi:code-braces", form: "rounded", label: "Parse Link From Message", pos: "b", h: 48 }
n3@{ icon: "mdi:database", form: "rounded", label: "Upsert Sheet Row", pos: "b", h: 48 }
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Retrieve Page Content"]
n5@{ icon: "mdi:code-braces", form: "rounded", label: "Derive Article 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/>Send Telegram Warning"]
n7@{ icon: "mdi:robot", form: "rounded", label: "Compose Facebook Update", pos: "b", h: 48 }
n8@{ icon: "mdi:robot", form: "rounded", label: "Draft Instagram Caption", pos: "b", h: 48 }
n9@{ icon: "mdi:robot", form: "rounded", label: "Build LinkedIn Snippet", pos: "b", h: 48 }
n10@{ icon: "mdi:brain", form: "rounded", label: "Gemini Language Model", pos: "b", h: 48 }
n11@{ icon: "mdi:robot", form: "rounded", label: "Generate Image Prompt", pos: "b", h: 48 }
n12@{ icon: "mdi:robot", form: "rounded", label: "Create Image Asset", pos: "b", h: 48 }
n13@{ icon: "mdi:swap-vertical", form: "rounded", label: "Assign File Metadata", pos: "b", h: 48 }
n14@{ icon: "mdi:swap-vertical", form: "rounded", label: "Configure Storage Params", 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/httprequest.dark.svg' width='40' height='40' /></div><br/>Upload to Storage"]
n16@{ icon: "mdi:swap-vertical", form: "rounded", label: "Create Public Link", pos: "b", h: 48 }
n17["<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/>Combine FB Inputs"]
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/merge.svg' width='40' height='40' /></div><br/>Combine IG Inputs"]
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/merge.svg' width='40' height='40' /></div><br/>Combine Media Inputs"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Publish Facebook Photo"]
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/code.svg' width='40' height='40' /></div><br/>Format Facebook Link"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Create IG Media"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Publish IG Media"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Fetch IG Permalink"]
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/code.svg' width='40' height='40' /></div><br/>Format IG Link"]
n26["<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/>Download Image File"]
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/linkedin.svg' width='40' height='40' /></div><br/>Publish LinkedIn Post"]
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/code.svg' width='40' height='40' /></div><br/>Format LinkedIn Link"]
n29["<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 Publish Results"]
n30["<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/>Assemble Final Record"]
n31@{ icon: "mdi:database", form: "rounded", label: "Update Sheet Status", 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/>Send Telegram Confirmation"]
n21 --> n29
n25 --> n29
n28 --> n29
n30 --> n31
n17 --> n20
n18 --> n22
n19 --> n26
n29 --> n30
n27 --> n28
n26 --> n27
n13 --> n14
n2 --> n3
n24 --> n25
n7 --> n17
n10 -.-> n11
n9 --> n11
n9 --> n19
n8 --> n18
n14 --> n15
n11 --> n12
n20 --> n21
n4 --> n5
n22 --> n23
n12 --> n13
n23 --> n24
n31 --> n32
n16 --> n19
n16 --> n18
n16 --> n17
n5 --> n7
n5 --> n8
n5 --> n9
n0 --> n1
n1 --> n2
n1 --> n6
n3 --> n4
n15 --> n16
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 n0 trigger
class n7,n8,n9,n11,n12 ai
class n10 aiModel
class n1 decision
class n3,n31 database
class n4,n15,n20,n22,n23,n24,n26 api
class n2,n5,n21,n25,n28,n30 code
classDef customIcon fill:none,stroke:none
class n0,n4,n6,n15,n17,n18,n19,n20,n21,n22,n23,n24,n25,n26,n27,n28,n29,n30,n32 customIcon
The Problem: Sharing One Link Becomes Three Separate Jobs
Posting “the same thing” to LinkedIn, Facebook, and Instagram is never actually the same thing. LinkedIn wants a tighter hook and a professional angle, Instagram wants a caption that reads like a human, and Facebook Pages often need a photo post to get any reach. So you do the dance: copy the URL, write three versions, find or create an image, upload it three times, then hunt down permalinks for tracking. It’s not hard work. It’s draining work. And the drain is what kills consistency.
It adds up fast. Here’s where it breaks down in real life.
- Manually rewriting one article into three platform styles can take about an hour, especially when you’re second-guessing tone and length.
- Image creation becomes a bottleneck because you still need something that looks intentional, not a random screenshot.
- You lose track of permalinks, which means weekly reporting turns into a scavenger hunt.
- Small mistakes sneak in, like posting the wrong link or forgetting a channel entirely.
The Solution: Send a URL in Telegram, Publish Everywhere
This workflow turns Telegram into your “content intake” inbox. You message the bot with a URL and the workflow checks that a real link exists before doing anything else. Then it downloads the web page, extracts the readable title and text, and uses AI to write three versions of the post: one for Facebook, one for Instagram, and one for LinkedIn. It also generates an AI image, uploads that image to Supabase Storage, and creates a public link so every platform can reuse the same asset. Finally, it publishes to Facebook Pages, Instagram Business, and LinkedIn, updates Google Sheets with the post URLs and image link, and sends you a Telegram confirmation (with the image and permalinks) for quick review.
The flow starts with a Telegram message and ends with three live posts you can click immediately. In between, the workflow handles the parts that usually slow you down: page parsing, copy variations, image generation, uploading, and link logging.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you share 5 links per week across 3 channels. Manually, budget maybe 15 minutes to draft each channel post plus 10 minutes to handle an image and grab permalinks, which can land around 4 hours a week. With this workflow, you drop the URL into Telegram (under a minute) and wait for processing and posting, usually about 10 minutes total in the background. That’s roughly 3 hours back most weeks, while still getting platform-specific copy.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Telegram Bot for submitting URLs from chat
- OpenAI or Google Gemini to write platform-specific copy
- Facebook/Instagram Graph API to publish to your Page and IG Business
- LinkedIn OAuth2 to publish posts to LinkedIn
- Supabase to store and serve the generated image
- Google Sheets OAuth2 to log permalinks and status
- AI API key (get it from your OpenAI or Google AI Studio account)
Skill level: Intermediate. You won’t code, but you will connect credentials and paste a few IDs like your Sheet ID and IG user ID.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
Telegram message triggers the run. You send the bot a message and the workflow checks if there’s a URL. If there isn’t, it sends a quick warning back so you’re not guessing why nothing happened.
The page content is fetched and cleaned up. n8n downloads the URL with an HTTP request, then a parsing step pulls out the title and readable text so the AI has something solid to work from (not messy navigation and footer links).
AI writes three tailored posts and creates an image. Separate prompts generate Facebook copy, an Instagram caption, and a LinkedIn snippet. Then the workflow creates an image prompt, generates an image, and uploads it to Supabase so it can be reused safely across platforms.
Publishing happens, then everything is logged. The workflow posts to Facebook and Instagram via the Graph API, publishes to LinkedIn, formats the resulting permalinks, updates Google Sheets, and sends you a Telegram confirmation with the image and links.
You can easily modify the AI prompts to match your brand voice 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 Telegram entry point so the workflow can receive article URLs from chat messages.
- Add the Telegram Intake Trigger node and keep Updates set to
message. - Credential Required: Connect your
telegramApicredentials in Telegram Intake Trigger. - Send a test message to your Telegram bot to verify the webhook is receiving data.
Step 2: Validate and Parse Incoming URLs
Confirm that a URL exists in the message and extract it before continuing.
- In Validate URL Presence, confirm the condition uses
=={{ ($json.message.text || '').match(/https?:\/\/\S+/) !== null }}. - Connect the true output of Validate URL Presence to Parse Link From Message.
- Connect the false output of Validate URL Presence to Send Telegram Warning.
- In Send Telegram Warning, keep Text set to
You can't do this here. You need to upload a URL with an article.and Chat ID to{{ $json.message.chat.id }}. - Credential Required: Connect your
telegramApicredentials in Send Telegram Warning.
Step 3: Connect Google Sheets for Source Tracking
Store the incoming URL immediately so you can track submissions and later update status.
- In Upsert Sheet Row, set Operation to
appendOrUpdate. - Set Document to your sheet ID and Sheet to
Sheet1. - Map Source URL to
{{ $json.url }}in the Columns mapping. - Credential Required: Connect your
googleSheetsOAuth2Apicredentials in Upsert Sheet Row.
Later in the workflow, Update Sheet Status updates the same sheet with post URLs and generated content.
Step 4: Retrieve and Prepare Article Content
Fetch the article HTML and convert it into clean text for AI generation.
- In Retrieve Page Content, set URL to
{{ $node['Parse Link From Message'].json.url }}. - Keep Derive Article Text function code as-is to strip HTML and cap content length.
- Verify Derive Article Text outputs title, content, and wordCount for AI prompts.
Step 5: Configure AI Content Generation
Generate platform-specific captions and an image prompt in parallel.
- Derive Article Text outputs to Compose Facebook Update, Draft Instagram Caption, and Build LinkedIn Snippet in parallel.
- Credential Required: Connect your
openAiApicredentials in Compose Facebook Update, Draft Instagram Caption, and Build LinkedIn Snippet. - In each OpenAI node, keep the prompt content that references
{{ $('Derive Article Text').item.json.content }}. - Build LinkedIn Snippet outputs to both Generate Image Prompt and Combine Media Inputs in parallel.
- In Generate Image Prompt, keep Text set to the long Polish prompt using
{{ $json.text }}. - Gemini Language Model is connected as the language model for Generate Image Prompt — Credential Required: Connect your
googlePalmApicredentials in Gemini Language Model.
Step 6: Generate, Store, and Share the Image Asset
Create the social image, upload it to storage, and generate a public URL for sharing.
- In Create Image Asset, set Model to
gpt-image-1and Prompt to{{ $json.text }}. - Credential Required: Connect your
openAiApicredentials in Create Image Asset. - In Assign File Metadata, set filename to
{{ $now.toMillis() }}.png. - In Configure Storage Params, set bucket to
social-media-ai-generatedand supabase_base_url tohttps://[YOUR_SUPABASE_URL]. - In Upload to Storage, keep URL as
{{ ($json.supabase_base_url || '').trim().replace(/\/+$/,'') + '/storage/v1/object/' + ($json.bucket || 'social-media-ai-generated') + '/' + $json.filename }}. - Credential Required: Connect your
supabaseApicredentials in Upload to Storage. - In Create Public Link, keep public_url set to
{{ $node["Configure Storage Params"].json.supabase_base_url.toString().trim().replace(/\/+$/,'') + "/storage/v1/object/public/" + encodeURIComponent($node["Configure Storage Params"].json.bucket) + "/" + encodeURIComponent($node["Configure Storage Params"].json.filename) }}.
Step 7: Publish to Facebook, Instagram, and LinkedIn
Combine text and media inputs, then publish posts to each social network.
- Create Public Link outputs to Combine Media Inputs, Combine IG Inputs, and Combine FB Inputs in parallel.
- In Publish Facebook Photo, set URL to
https://graph.facebook.com/v19.0/[INSERT_YOUR_SITE_ID]/photosand map caption to{{ $input.first().json.message.content }}and url to{{ $item(0).$node["Create Public Link"].json["public_url"] }}. - Credential Required: Connect your
facebookGraphApicredentials in Publish Facebook Photo, Create IG Media, Publish IG Media, and Fetch IG Permalink. - In Create IG Media, keep URL set to
https://graph.facebook.com/v23.0/[INSERT_YOUR_SITE_ID]/mediaand map image_url and caption using the public URL and caption expressions. - In Publish IG Media, keep creation_id as
{{ $json.id }}and access_token as{{ $credentials.facebookGraph.accessToken }}. - In Fetch IG Permalink, keep URL set to
{{ `https://graph.facebook.com/${$json.fbApiVersion || 'v19.0'}/${$json.id}?fields=permalink` }}. - In Publish LinkedIn Post, set Text to
{{ $('Build LinkedIn Snippet').item.json.message.content }}, Person to[YOUR_ID], and Share Media Category toIMAGE. - Credential Required: Connect your
linkedInOAuth2Apicredentials in Publish LinkedIn Post.
[INSERT_YOUR_SITE_ID] and [YOUR_ID] placeholders before testing, or publishing will fail.Step 8: Format Links and Merge Results
Normalize each platform’s response and build a final record for logging and notifications.
- After publishing, keep Format Facebook Link, Format IG Link, and Format LinkedIn Link code blocks unchanged to standardize URLs.
- Ensure Format Facebook Link, Format IG Link, and Format LinkedIn Link all connect to Merge Publish Results.
- Keep Merge Publish Results set to Number of Inputs =
3. - In Assemble Final Record, keep the merge script to combine all JSON outputs into a single object.
Step 9: Update Google Sheets and Notify Telegram
Write the final post URLs and captions into your sheet, then send a confirmation message with the generated image.
- In Update Sheet Status, set Operation to
updateand map columns using the expressions in the node: - Set Image URL to
{{ $item(0).$node["Create Public Link"].json["public_url"] }}and Source URL to{{ $node["Telegram Intake Trigger"].json.message.text }}. - Map Facebook URL, Instagram URL, and LinkedIn URL to
{{ $json.facebook_post_url }},{{ $json.instagram_post_url }}, and{{ $json.linkedin_post_url }}. - Map content fields to
{{ $node["Compose Facebook Update"].json.message.content }},{{ $node["Draft Instagram Caption"].json.message.content }}, and{{ $node["Build LinkedIn Snippet"].json.message.content }}. - Credential Required: Connect your
googleSheetsOAuth2Apicredentials in Update Sheet Status. - In Send Telegram Confirmation, keep Operation as
sendPhoto, File as{{ $item(0).$node["Create Public Link"].json["public_url"] }}, and Chat ID as{{ $node["Telegram Intake Trigger"].json.message.chat.id }}. - Credential Required: Connect your
telegramApicredentials in Send Telegram Confirmation.
Step 10: Test & Activate Your Workflow
Run an end-to-end test to confirm publishing, storage, and logging before turning it on.
- Click Execute Workflow and send a Telegram message containing a valid article URL.
- Confirm Send Telegram Warning does not run for valid URLs and that the workflow proceeds to publishing nodes.
- Check that Update Sheet Status writes the image URL and social post URLs into the correct row.
- Verify the Telegram confirmation includes the image and three platform links.
- When successful, toggle the workflow to Active for production use.
Common Gotchas
- Facebook/Instagram Graph credentials can expire or need specific permissions. If things break, check your access token scope and the Page/IG Business permissions in Meta 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 you already have your platform accounts and API access.
No. You’ll mostly connect accounts and paste IDs like your Google Sheet ID and Instagram Business user ID.
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 AI API costs, which are usually a few cents per run depending on your prompts and image generation.
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 trigger and the “publish” timing. Swap the Telegram trigger for a Schedule Trigger (or keep Telegram intake, then add a manual “approved” column check in Google Sheets before publishing). Common customizations include adding an approval step, changing the tone per platform in the AI nodes, and switching the Supabase bucket name used in the Set nodes.
Usually it’s the bot token in your n8n Telegram credentials being wrong or rotated. Double-check the bot is still active in BotFather, then re-save the credentials in n8n. Also confirm the workflow is using the right Telegram trigger (the one connected to your bot) and that n8n can receive updates if you’re self-hosting behind a firewall.
A lot.
For this use case, n8n is usually the better fit because you’re doing multiple AI steps, file handling, and multi-platform publishing in one run. Zapier and Make can do it, but you may end up with more separate scenarios, more paid tasks, and less control over branching when a URL is missing or a publish step fails. n8n also gives you the self-hosting option, which is handy once volume grows. The tradeoff is setup time: permissions for Meta and LinkedIn can be finicky no matter what tool you use. Talk to an automation expert if you want help choosing.
One URL. Three channels. A spreadsheet log you can trust. Set it up once, and let the workflow handle the repetitive posting work while you focus on what to share next.
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.