Telegram to Google Sheets, YouTube posts ready to go
You grab a great YouTube link, you know it could become a new post, a new script, even a new upload. Then reality hits. Transcript hunting, messy copy-paste, rewriting, SEO fields, and a “where did we track this?” spreadsheet that’s never up to date.
This is where Telegram Sheets automation helps. Content marketers trying to repurpose at volume feel it first, but agency teams and solo creators get stuck in the same grind. The outcome is simple: you send a link once, and you get structured, ready-to-approve assets back in your sheet.
This workflow turns a Telegram message into a logged request, a cleaned transcript, a rewritten script, and SEO metadata. You’ll see what it does, what you need, and how it fits into a real publishing pipeline.
How This Automation Works
See how this solves the problem:
n8n Workflow Template: Telegram to Google Sheets, YouTube posts ready to go
flowchart LR
subgraph sg0["Telegram 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 Trigger"]
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/>Parse Telegram Message"]
n2@{ icon: "mdi:database", form: "rounded", label: "Append to Google Sheets", 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/>Get Video ID"]
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/>RapidAPI Summarizer"]
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/>Clean Text"]
n6@{ icon: "mdi:robot", form: "rounded", label: "Generate Script", pos: "b", h: 48 }
n7@{ icon: "mdi:robot", form: "rounded", label: "Generate SEO", pos: "b", h: 48 }
n8["<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 to Telegram"]
n9@{ icon: "mdi:swap-vertical", form: "rounded", label: "Workflow Configuration", pos: "b", h: 48 }
n10@{ icon: "mdi:database", form: "rounded", label: "update Google Sheets", pos: "b", h: 48 }
n5 --> n6
n7 --> n10
n3 --> n4
n6 --> n7
n0 --> n1
n4 --> n5
n10 --> n8
n1 --> n9
n9 --> n2
n2 --> n3
end
subgraph sg1["Flow 2"]
direction LR
n11@{ icon: "mdi:cog", form: "rounded", label: "Upload Video to BLOTATO", pos: "b", h: 48 }
n12@{ icon: "mdi:cog", form: "rounded", label: "Youtube", pos: "b", h: 48 }
n13@{ icon: "mdi:swap-vertical", form: "rounded", label: "Get Google Drive ID", pos: "b", h: 48 }
n14@{ icon: "mdi:swap-vertical", form: "rounded", label: "Workflow Configuration II", pos: "b", h: 48 }
n15@{ icon: "mdi:database", form: "rounded", label: "Check Google Sheets", pos: "b", h: 48 }
n16@{ icon: "mdi:cog", form: "rounded", label: "Download file", pos: "b", h: 48 }
n17@{ icon: "mdi:database", form: "rounded", label: "Update Google Sheets II", pos: "b", h: 48 }
n12 --> n17
n16 --> n11
n15 --> n13
n13 --> n16
n11 --> n12
n14 --> n15
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 n6,n7 ai
class n2,n10,n15,n17 database
class n4 api
class n1,n3,n5 code
classDef customIcon fill:none,stroke:none
class n0,n1,n3,n4,n5,n8 customIcon
The Challenge: Turning YouTube Links Into Publish-Ready Assets
Repurposing a YouTube video sounds easy until you try doing it consistently. First you need a transcript, and half the time it’s incomplete, full of timestamps, or broken into weird lines. Then you rewrite it, but you’re juggling tone, structure, and avoiding sounding like a copy. Add SEO fields and tracking on top, and suddenly “one quick repurpose” becomes a project that drags into tomorrow. The worst part is the mental load: keeping track of what’s requested, what’s drafted, what’s approved, and what’s actually published.
It adds up fast. Here’s where it breaks down in real teams.
- You end up copy-pasting transcripts into docs, then into a sheet, then into yet another tool to rewrite them.
- Requests arrive in DMs, voice notes, and Slack messages, so tracking becomes a second job.
- SEO metadata is created last, which means it’s rushed and inconsistent across uploads.
- Publishing waits on approval, but there’s no clean “ready” handoff, so videos sit in limbo.
The Fix: Telegram In, Google Sheets Out (With Script + SEO Done)
This workflow starts where your team already communicates: Telegram. You send a YouTube URL (plus any instructions like “make this shorter” or “aim it at beginners”), and the automation logs the request into Google Sheets so nothing gets lost. It then extracts the video ID, pulls the transcript through RapidAPI, and cleans it into readable text you can actually work with. Next, OpenAI rewrites that transcript into a fresh script, and generates SEO metadata (title, description, tags) in a strict JSON format so it’s consistent. Finally, the sheet is updated with everything and the workflow waits until the status is marked ready, then uploads the finished media to Blotato and publishes it to YouTube.
The workflow starts with a Telegram message and ends with a published video and a “publish” status in your sheet. In the middle, it handles transcript extraction, cleanup, script rewriting, and SEO field generation so approvals are the only human step.
What Changes: Before vs. After
| What This Eliminates | Impact You’ll See |
|---|---|
|
|
Real-World Impact
Say you repurpose 5 YouTube videos a week. Manually, it’s usually about 20 minutes to find/export a transcript, about 30 minutes to clean and reshape it, and another 20 minutes to write SEO fields and update tracking, so you’re at roughly 1 hour per video (around 5 hours weekly). With this workflow, the “work” is sending the link in Telegram and later approving the row in Google Sheets, maybe 5 minutes total per video. That’s a few hours back every week, without cutting corners.
Requirements
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Telegram to submit YouTube links and instructions
- Google Sheets to track requests, approvals, publishing status
- OpenAI API key (get it from your OpenAI dashboard)
- RapidAPI key (get it from RapidAPI after subscribing)
- Blotato credentials (get them from your Blotato account settings)
Skill level: Intermediate. You’ll connect a few accounts, paste API keys, and map Google Sheets columns once.
Need help implementing this? Talk to an automation expert (free 15-minute consultation).
The Workflow Flow
A Telegram message kicks it off. You send a YouTube URL and optional instructions to your Telegram bot. The workflow extracts the useful bits (the link, the notes) so it can be processed reliably.
Your request becomes a trackable row. n8n appends a new entry in Google Sheets, then derives the YouTube video ID from the URL. That little step matters because it prevents messy “wrong link” errors later.
The transcript is fetched, then cleaned. An HTTP Request calls RapidAPI to retrieve the transcript, and a code step normalizes it into readable text. No timestamps, fewer line breaks, and less junk.
OpenAI generates the new script and SEO fields. The workflow first creates a rewritten script, then generates SEO metadata (title, description, and tags) in strict JSON so it drops cleanly into your sheet.
Approval gates the final publish. It checks Google Sheets for rows marked ready, downloads the media from Google Drive, uploads to Blotato, and publishes to YouTube. Then it marks the sheet as publish so you always know what shipped.
You can easily modify the approval status value to match your process 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 incoming Telegram messages can supply the YouTube URL and user description.
- Add and open Telegram Incoming Trigger.
- Select the updates array to include message.
- Credential Required: Connect your telegramApi credentials.
- Keep the default webhook settings and save.
Tip: Send a test message with two lines: line 1 is the YouTube URL, line 2 is the user description used downstream by Extract Telegram Content.
Step 2: Connect Google Sheets and Store Incoming Requests
Configure the primary sheet settings and append each Telegram request into your tracking sheet.
- Open Primary Config Setup and set the fixed values: output_lang to
english, sheet_id to<__PLACEHOLDER_VALUE__Google Sheets Document ID__>, sheet_tab to<__PLACEHOLDER_VALUE__Sheet Tab Name__>, and rapidapi_key to<__PLACEHOLDER_VALUE__RapidAPI Key__>. - Open Append Sheet Entry and set Operation to
appendOrUpdate. - Map the columns exactly: Url to
{{ $('Extract Telegram Content').item.json.yt_url }}, Date to{{ $now.toISO() }}, and Description to{{ $('Extract Telegram Content').item.json.user_desc }}. - Set Sheet Name to
{{ $('Primary Config Setup').item.json.sheet_tab }}and Document ID to{{ $('Primary Config Setup').item.json.sheet_id }}. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Append Sheet Entry.
⚠️ Common Pitfall: If sheet_id or sheet_tab remain as placeholders in Primary Config Setup, Append Sheet Entry will fail to write data.
Step 3: Retrieve and Normalize the Transcript
Extract the YouTube video ID, call the transcript API, and normalize the transcript text for the AI script writer.
- In Derive Video Identifier, keep the JavaScript that parses the video ID from the
Urlfield. - Configure Transcript API Request with URL set to
https://youtube-video-summarizer-gpt-ai.p.rapidapi.com/api/v1/get-transcript-v2. - Set query parameters in Transcript API Request: video_id to
{{ $json.videoId }}and platform toyoutube. - Set headers in Transcript API Request: X-RapidAPI-Key to
{{ $('Primary Config Setup').item.json.rapidapi_key }}and X-RapidAPI-Host toyoutube-video-summarizer-gpt-ai.p.rapidapi.com. - Keep the transcript cleanup logic in Normalize Transcript Text to produce
clean_transcriptfor the AI step.
Tip: If transcripts fail to resolve, confirm the YouTube URL format is supported by Derive Video Identifier (either youtu.be or youtube.com/watch?v=).
Step 4: Set Up AI Script and SEO Generation
Generate the new script and SEO metadata using OpenAI, then update the sheet and notify Telegram.
- Open Compose Video Script and keep the model set to
gpt-4.1-mini. - Ensure Compose Video Script uses the system instruction with
{{ $('Primary Config Setup').item.json.output_lang }}and user content that includes{{ $json.clean_transcript }}and{{ $('Extract Telegram Content').item.json.user_desc }}. - Credential Required: Connect your openAiApi credentials in Compose Video Script.
- In Create SEO Metadata, keep the JSON schema output settings and set the content to
{{ $json.output[0].content[0].text }}. - Credential Required: Connect your openAiApi credentials in Create SEO Metadata.
- Open Update Sheet with SEO and set Operation to
update, mapping fields like Tags to{{ $json.output[0].content[0].text.tags }}, Title New to{{ $json.output[0].content[0].text.title }}, Transcript New to{{ $('Compose Video Script').item.json.output[0].content[0].text }}, and Description New to{{ $json.output[0].content[0].text.description }}. - Set Sheet Name to
{{ $('Primary Config Setup').item.json.sheet_tab }}and Document ID to{{ $('Primary Config Setup').item.json.sheet_id }}. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Update Sheet with SEO.
- Configure Telegram Status Notice with Text set to
Transcript : doneand Chat ID set to{{ $('Telegram Incoming Trigger').item.json.message.chat.id }}. - Credential Required: Connect your telegramApi credentials in Telegram Status Notice.
⚠️ Common Pitfall: If Create SEO Metadata returns invalid JSON, Update Sheet with SEO will not parse tags, title, or description correctly.
Step 5: Configure the Publishing Pipeline
Scan for ready rows, resolve the Drive file, upload media, and publish to YouTube via Blotato.
- Open Secondary Config Setup and set sheet_id to
<__PLACEHOLDER_VALUE__Google Sheets Document ID__>and sheet_tab to<__PLACEHOLDER_VALUE__Sheet Tab Name__>. - Configure Scan Sheet for Ready to filter rows where status equals
ready, and set Sheet Name to{{ $json.sheet_tab }}and Document ID to{{ $json.sheet_id }}. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Scan Sheet for Ready.
- In Resolve Drive File ID, keep final_google_drive_url mapped to
{{ $json['url Heygen'].match(/https:\/\/drive\.google\.com\/file\/d\/([A-Za-z0-9_-]+)/i)[1] }}. - Configure Download Drive File with Operation set to
downloadand File ID set to{{ $json.final_google_drive_url }}. - Credential Required: Connect your googleDriveOAuth2Api credentials in Download Drive File.
- In Upload Media to Blotato, set Resource to
mediaand Media URL to=https://drive.google.com/uc?export=download&id={{ $json.final_google_drive_url }}. - Credential Required: Connect your blotatoApi credentials in Upload Media to Blotato.
- Configure Publish to YouTube with Platform set to
youtube, Post Content Text to{{ $('Scan Sheet for Ready').item.json['Description New'] }}, Post Content Media URLs to{{ $json.url }}, and Post Create Youtube Option Title to{{ $('Scan Sheet for Ready').item.json['Title New'] }}. - Set Post Create Youtube Option Privacy Status to
privateand Post Create Youtube Option Should Notify Subscribers tofalse. - Credential Required: Connect your blotatoApi credentials in Publish to YouTube.
- Open Mark Sheet Published and set Operation to
update, mapping Url to{{ $('Scan Sheet for Ready').item.json.Url }}and status topublish. - Set Sheet Name to
{{ $('Secondary Config Setup').item.json.sheet_tab }}and Document ID to{{ $('Secondary Config Setup').item.json.sheet_id }}. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Mark Sheet Published.
⚠️ Common Pitfall: If Scan Sheet for Ready doesn’t find rows with status = ready, the publishing chain (including Resolve Drive File ID and Publish to YouTube) won’t run.
Step 6: Test and Activate Your Workflow
Run end-to-end tests to confirm each stage works before turning on production execution.
- Manually execute the workflow and send a Telegram message to Telegram Incoming Trigger with the YouTube URL on the first line and a short description on the second line.
- Verify a new row is created by Append Sheet Entry, and that Update Sheet with SEO fills in Title New, Description New, Tags, and Transcript New.
- Confirm Telegram Status Notice sends
Transcript : doneto the originating chat. - Set a row’s status to
readyin the sheet and rerun the publish chain to verify Publish to YouTube creates a private upload. - Check that Mark Sheet Published updates the row to
publishafter the upload. - When results are correct, switch the workflow to Active for production use.
Watch Out For
- Google Sheets OAuth credentials can expire or need specific permissions. If things break, check the n8n credential status and your Google Cloud OAuth consent setup first.
- If you’re using Wait logic via “status = ready” and the sheet polling runs too quickly, processing times vary. Bump up the delay or polling interval if the workflow misses rows or downstream nodes run with empty fields.
- OpenAI outputs depend heavily on prompts, and the defaults are honestly bland. Add your brand voice, audience level, and formatting rules early or you will keep rewriting the rewrite.
Common Questions
About 30 minutes if your accounts and APIs are ready.
Yes, but someone should be comfortable connecting OAuth and API keys. After that, the day-to-day use is just Telegram messages and Google Sheets approvals.
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 API usage and your RapidAPI subscription for transcript access.
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.
You can change the output language by editing the output_lang field in the configuration step, then adjust the OpenAI prompts that generate the script and SEO JSON. Many teams also tweak Google Sheets columns (to match their existing tracker) and change the approval rule from “ready” to whatever status name they already use. If you want to repurpose from a different platform, you can swap the transcript fetch step as long as you still provide clean text to the script generator.
Usually it’s expired OAuth access or the wrong Google account connected. Re-authenticate the Google Sheets credential in n8n, confirm the correct spreadsheet is shared with that account, and double-check the Google Cloud project has the Sheets API enabled. If it fails only sometimes, look for quota limits or sheet edits that changed column names the workflow expects.
If you self-host n8n, there’s no fixed execution cap (it mostly depends on your server and how often you poll the sheet). On n8n Cloud, your monthly executions depend on your plan. Practically, this workflow is usually limited by transcript/API response time and how many items you run at once, not by n8n itself.
Often, yes. This workflow mixes multi-step logic (extract ID, fetch transcript, normalize text, generate two AI outputs, write back to Sheets, then wait for approval) and that tends to get expensive or awkward in simpler tools. n8n also gives you a clean self-host option, which is handy when you’re processing lots of content requests. Zapier or Make can still win for lightweight two-app zaps, especially if you never need approval gating. If you’re on the fence, Talk to an automation expert and describe your volume and publishing process.
Once this is in place, your sheet becomes the calm center of the workflow, not another chore. The automation handles the repetitive parts so you can focus on what actually makes the content good.
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.