YouTube to Google Sheets, transcripts logged clean
You grab a YouTube link, paste it into a doc, hunt for the transcript, copy it, fix timestamps, then realize you forgot the channel name and publish date. Again. It’s not hard work. It’s just endless.
This is where YouTube transcript logging becomes a real advantage for marketers building content briefs, researchers collecting quotes, and agency owners turning videos into reusable assets. You get a clean transcript plus useful metadata in one place, without babysitting the process.
This workflow gives you two ways to capture transcripts: a Google Sheets “drop links here” approach and a webhook for instant, on-demand extraction. You’ll see what it does, what you need, and how to avoid the common setup traps.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: YouTube to Google Sheets, transcripts logged clean
flowchart LR
subgraph sg0["Monitor Google Sheet for URLs Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Monitor Google Sheet for URLs", 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/>Extract YouTube Video ID (Sh.."]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Fetch Video Transcript Data .."]
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/>Parse Transcript Text (Sheets)"]
n4@{ icon: "mdi:database", form: "rounded", label: "Save Transcript to Sheet", pos: "b", h: 48 }
n0 --> n1
n3 --> n4
n1 --> n2
n2 --> n3
end
subgraph sg1["Flow 2"]
direction LR
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/webhook.dark.svg' width='40' height='40' /></div><br/>Webhook Trigger (Direct Input)"]
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/>Extract YouTube Video ID (We.."]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Fetch Video Transcript Data .."]
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/code.svg' width='40' height='40' /></div><br/>Parse Transcript Text (Webho.."]
n9["<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/webhook.dark.svg' width='40' height='40' /></div><br/>Return Transcript Response"]
n5 --> n6
n8 --> n9
n6 --> n7
n7 --> n8
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 n4 database
class n2,n5,n7,n9 api
class n1,n3,n6,n8 code
classDef customIcon fill:none,stroke:none
class n1,n2,n3,n5,n6,n7,n8,n9 customIcon
The Problem: Transcripts Are Useful, but Getting Them Is a Time Sink
Transcripts are gold for content, research, accessibility, and SEO. The frustrating part is that collecting them is weirdly fragile. One person pastes a youtu.be link, another uses a full youtube.com URL with tracking parameters, someone shares an embed link, and suddenly your “simple” process breaks. Even when you do get the transcript, it lands in the wrong place, without the title, without the channel, and with no consistent formatting. Then you waste time cleaning it up before you can do anything valuable with it.
It adds up fast. Here’s where it usually breaks down in real teams.
- Copy-pasting transcripts for a handful of videos can burn about 2 hours a week, and it’s hard to even notice where that time went.
- Different YouTube URL formats cause silent failures, so you think you captured a transcript when you didn’t.
- Metadata gets lost, which means your “transcript library” is basically a pile of anonymous text.
- Some videos simply don’t have transcripts, and your process needs to handle that without derailing everything.
The Solution: Automatic Transcript + Metadata Capture in Google Sheets
This workflow turns transcript capture into a simple input-output system. You give it a YouTube URL, and it extracts the video ID even if the link is messy (youtu.be, embed links, long URLs with extra parameters). From there, it calls a YouTube Transcript API to pull the transcript text, plus rich metadata like video title, channel, publish date, duration, and category. Finally, it logs everything to Google Sheets in a consistent format so your library stays searchable and reusable. If a transcript isn’t available, the workflow handles that gracefully and still records what happened, so you don’t chase ghosts.
You can run it two ways. The “automated” path watches a Google Sheet for new URLs and appends the transcript results to your results sheet. The “instant” path accepts a webhook request, fetches the transcript, then responds right away with the compiled payload.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you collect transcripts for 20 competitor videos each week. Manually, it’s maybe 6 minutes to open the video, find or generate the transcript, copy it, then paste it into your spreadsheet with the title and channel, which is about 2 hours total. With this workflow, you paste 20 URLs into Google Sheets in a few minutes and let n8n extract everything in the background. You end up doing a quick scan for the handful of videos that have no transcript, and you’re done.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for URL intake and transcript storage.
- YouTube Transcript API to fetch transcripts and metadata.
- YouTube Transcript API key (get it from your provider dashboard, like youtube-transcript.io).
Skill level: Beginner. You’ll connect accounts, map a few columns, and paste in an API key.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A new YouTube link appears. You can trigger the workflow by adding a URL to Google Sheets, or by sending a POST request to the webhook endpoint when you want an instant transcript response.
The workflow extracts the video ID. A small parsing step handles common URL formats (youtube.com, youtu.be, embed links), so your team doesn’t need “perfect” inputs to get consistent outputs.
n8n requests the transcript and metadata. Using HTTP Request, the workflow calls your transcript provider, then compiles the transcript text into a clean field alongside title, channel, publish date, duration, and category.
Results get saved or returned. In the Sheets path, the transcript row is appended to your results sheet. In the webhook path, n8n responds immediately with a payload you can pass into another tool.
You can easily modify where transcripts are stored (Sheets vs. Docs vs. Drive) based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Google Sheets Trigger
This workflow starts when a new URL is added to your Google Sheet. Configure Track Sheet URLs so it watches the correct spreadsheet and tab.
- Add the Track Sheet URLs node and set Event to
rowAdded. - Set Sheet Name to
urls. - Set Document ID to your sheet URL, replacing
[YOUR_ID]with the actual Google Sheets URL. - In Poll Times, confirm it runs
everyMinute. - Credential Required: Connect your googleSheetsTriggerOAuth2Api credentials.
Tip: The sheet tab named urls should include a column called url so Derive Video ID from Sheet can parse it.
Step 2: Connect Google Sheets
Transcripts are written back to a separate tab in the same spreadsheet. Configure Append Transcript to Sheet for the output destination.
- Add the Append Transcript to Sheet node and set Operation to
append. - Set Sheet Name to
transcripts. - Set Document ID to the same Google Sheets URL used in Track Sheet URLs.
- In Columns, map video title to
={{ $('Request Transcript via Sheet').item.json.microformat.playerMicroformatRenderer.title.simpleText }}. - Map transcript to
={{ $json.fullTranscript }}. - Credential Required: Connect your googleSheetsOAuth2Api credentials.
⚠️ Common Pitfall: If the transcripts tab does not have columns named video title and transcript, the append operation will fail.
Step 3: Set Up Transcript Retrieval via Sheet
This path converts the YouTube URL from the sheet into a video ID, requests the transcript, and assembles the full text.
- Connect Track Sheet URLs to Derive Video ID from Sheet to extract
videoIdfrom the incomingurl. - Connect Derive Video ID from Sheet to Request Transcript via Sheet.
- In Request Transcript via Sheet, set URL to
https://www.youtube-transcript.io/api/transcriptsand Method toPOST. - Set JSON Body to
={ "ids": [ "{{ $json.videoId }}" ]}. - Set the Authorization header value to
={{ $credentials.youtubeTranscriptApi.token }}. - Credential Required: Connect your youtubeTranscriptApi credentials.
- Connect Request Transcript via Sheet to Assemble Transcript Text to build
fullTranscript.
Step 4: Configure the Webhook Trigger
This workflow also supports on-demand transcript retrieval via a webhook request.
- Add the Incoming Webhook Trigger node and set HTTP Method to
POST. - Set Path to
extract-youtube-transcript. - Set Response Mode to
responseNodeso Respond with Transcript returns the payload. - Connect Incoming Webhook Trigger to Derive Video ID from Webhook.
Tip: Your POST body must include video_url in body so Derive Video ID from Webhook can parse it.
Step 5: Set Up Transcript Retrieval via Webhook
This path fetches the transcript and returns a structured response directly to the caller.
- Connect Derive Video ID from Webhook to Request Transcript via Webhook.
- In Request Transcript via Webhook, set URL to
https://www.youtube-transcript.io/api/transcriptsand Method toPOST. - Set JSON Body to
={ "ids": [ "{{ $json.videoId }}" ]}. - Set the Authorization header value to
={{ $credentials.youtubeTranscriptApi.token }}. - Credential Required: Connect your youtubeTranscriptApi credentials.
- Connect Request Transcript via Webhook to Compile Transcript Payload.
- Connect Compile Transcript Payload to Respond with Transcript and keep Respond With set to
json. - In Respond with Transcript, set Response Body to
={ "success": true, "video": { "id": "{{ $json.id }}", "title": "{{ $json.title }}", "channel": "{{ $json.channel }}", "duration": "{{ $json.duration }}", "hasTranscript": {{ $json.hasTranscript }} }, "transcript": "{{ $json.fullTranscript }}"}.
Step 6: Configure Output Actions
Finalize the execution flow from parsing to output for the sheet-based path.
- Verify the execution flow: Track Sheet URLs → Derive Video ID from Sheet → Request Transcript via Sheet → Assemble Transcript Text → Append Transcript to Sheet.
- Confirm the webhook flow: Incoming Webhook Trigger → Derive Video ID from Webhook → Request Transcript via Webhook → Compile Transcript Payload → Respond with Transcript.
Step 7: Test and Activate Your Workflow
Run a manual test for both the sheet and webhook paths, then activate the workflow for continuous use.
- Click Execute Workflow and add a test URL to the
urlssheet to trigger Track Sheet URLs. - Confirm that Append Transcript to Sheet adds a new row with
video titleandtranscript. - Test the webhook by sending a POST request to
/webhook/extract-youtube-transcriptwith{"video_url":"https://youtu.be/VIDEO_ID"}. - Verify that Respond with Transcript returns a JSON payload with
success,video, andtranscript. - Toggle the workflow to Active for production use.
Common Gotchas
- YouTube Transcript API credentials can expire or be tied to billing and quota. If things break, check your transcript provider dashboard 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.
- Google Sheets permissions can be deceptively strict. If rows aren’t being appended, confirm the connected Google account has edit access to the exact spreadsheet and tab.
Frequently Asked Questions
About 30 minutes if your accounts are ready.
No. You’ll mostly connect accounts and paste in an API key. The “video ID extraction” logic is already included.
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 YouTube Transcript API costs (many providers charge a small monthly plan or per-request fee).
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 swap the destination step. Keep the same extraction pieces (the “Derive Video ID” code node and the HTTP Request transcript call), then replace the “Append Transcript to Sheet” Google Sheets node with a Google Docs or Google Drive file-creation step. Common customizations include adding speaker labels (if your provider supports it), storing raw JSON for auditing, and adding a “status” column for videos with no transcript.
Usually it’s permissions or the wrong spreadsheet/tab selection in the Google Sheets nodes. Reconnect your Google account in n8n, then confirm that account can edit the spreadsheet you’re writing to. Also check that your sheet has the expected columns (for example, an input “url” column and output columns like “video title” and “transcript”), because mismatched headers can cause mapping errors that look like credential issues.
For most small teams, hundreds of videos per month is realistic, and the real limit is your n8n execution quota (if on Cloud) plus whatever rate limits your transcript API enforces.
Often, yes, especially if you care about reliability with messy URLs and you want two entry points (Sheets monitoring plus webhook). n8n makes it easier to keep the parsing logic close to the workflow, which means fewer “mystery failures” when someone pastes a different link format. It’s also much simpler to add fallbacks for “no transcript available” without creating a maze of separate automations. Zapier or Make can be fine for basic two-step setups, but this workflow benefits from branching and custom processing. If you’re on the fence, Talk to an automation expert and we’ll help you pick the least painful route.
Once this is running, transcripts stop being a chore and start being an asset you can actually use. Set it up once, keep dropping links, and let your library grow on its own.
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.