YouTube to Google Sheets, competitor videos logged
You start competitor research with good intentions. Then it turns into a messy mix of tabs, half-copied video URLs, and a spreadsheet that nobody trusts.
YouTube Sheets logging hits content strategists first. But marketing leads building dashboards and solo consultants doing audits feel the same drag. You want a clean list of videos per channel, not another “we’ll clean it up later” file.
This workflow pulls videos from any YouTube channel and writes them neatly into Google Sheets, with a simple status system so you always know what ran, what failed, and what needs attention.
How This Automation Works
See how this solves the problem:
n8n Workflow Template: YouTube to Google Sheets, competitor videos logged
flowchart LR
subgraph sg0["When clicking ‘Test workflow’ Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Test workflow’", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If - Check Success Response", pos: "b", h: 48 }
n2@{ icon: "mdi:database", form: "rounded", label: "Google Sheets - Update Data", pos: "b", h: 48 }
n3@{ icon: "mdi:database", form: "rounded", label: "Google Sheets - Update Data ..", 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/>HTTP Request - Get Channel ID"]
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "Fields - Set Channel Username", 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/httprequest.dark.svg' width='40' height='40' /></div><br/>HTTP Request - Get Channel V.."]
n7@{ icon: "mdi:database", form: "rounded", label: "Google Sheets - Get Channel ..", pos: "b", h: 48 }
n8@{ icon: "mdi:database", form: "rounded", label: "Google Sheets - Update Data ..", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out - Videos", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Switch - Detect Channel ID o..", pos: "b", h: 48 }
n11@{ icon: "mdi:swap-vertical", form: "rounded", label: "Fields - Set Channel ID 1", pos: "b", h: 48 }
n12@{ icon: "mdi:swap-vertical", form: "rounded", label: "Fields - Set Channel ID 2", pos: "b", h: 48 }
n13@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
n14@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop", pos: "b", h: 48 }
n14 --> n10
n14 --> n13
n13 --> n14
n9 --> n2
n11 --> n6
n12 --> n6
n1 --> n9
n1 --> n8
n1 --> n3
n5 --> n4
n4 --> n12
n7 --> n14
n6 --> n1
n0 --> n7
n10 --> n11
n10 --> n5
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 n1,n10 decision
class n2,n3,n7,n8 database
class n4,n6 api
classDef customIcon fill:none,stroke:none
class n4,n6 customIcon
The Challenge: Competitor video research becomes a spreadsheet nightmare
Tracking competitor channels sounds simple until you do it weekly. You open a channel, scroll, copy a link, paste it somewhere, then realize you forgot the publish date or grabbed the wrong title. Multiply that by a handful of channels and suddenly you’ve burned an afternoon doing admin work instead of learning what’s working. Worse, inconsistent formatting wrecks sorting and filtering, which means your “research spreadsheet” turns into a pile of notes that can’t power a dashboard, a report, or a strategy call.
It adds up fast. Here’s where it usually breaks down.
- You waste about 10 minutes per channel just collecting the basics, and that’s before you clean anything.
- Video titles and URLs end up inconsistent, so duplicates creep in and your counts become unreliable.
- Someone forgets to record thumbnails or publish dates, which makes quick scanning and recency analysis annoying.
- There’s no clear “done/error” indicator, so you re-check channels you already processed.
The Fix: Automatically pull channel videos into a clean Google Sheet
This n8n workflow turns your YouTube competitor list into structured data you can actually use. You keep a simple “Channel URLs” tab in Google Sheets with channel links (full URLs, custom URLs, or raw channel IDs) and a status column. When you run the workflow, it reads only the rows marked “Ready,” figures out what kind of input each row is, and converts URLs into the correct channel ID when needed. Then it calls the YouTube API, fetches the latest public videos (10 by default), and writes each video as its own clean row in a “Videos” tab with title, link, description, thumbnail URL, publish date, and more. If something fails, the channel row is marked “Error” so you don’t lose track.
The workflow starts from a manual run inside n8n, so you stay in control. In the middle, it normalizes channel inputs, pauses briefly between batches, and validates the API response so bad calls don’t poison your sheet. Finally, it upserts video records into Google Sheets and marks each channel as Finished or Error.
What Changes: Before vs. After
| What This Eliminates | Impact You’ll See |
|---|---|
|
|
Real-World Impact
Say you track 12 competitor channels and you log the latest 10 videos for each. Doing it manually, you might spend about 10 minutes per channel collecting titles, links, dates, and thumbnails, which is roughly 2 hours. With this workflow, you paste the channel list once, set them to “Ready,” and run it; the hands-on time is closer to 10 minutes, then you wait for the API calls and sheet updates to finish. That’s a solid chunk of time back every week, and your data is cleaner.
Requirements
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets to store channels and video rows.
- YouTube Data API to fetch channel videos via HTTP Request.
- Google Cloud credentials (create in Google Cloud Console for Sheets + YouTube API access)
Skill level: Intermediate. You will connect Google credentials and confirm the sheet tabs/columns match the template.
Need help implementing this? Talk to an automation expert (free 15-minute consultation).
The Workflow Flow
Manual run from n8n. You click Execute (or Test), which is handy when you want to refresh research on your own schedule.
Channel list is pulled from Google Sheets. The workflow reads the “Channel URLs” tab and only processes rows marked “Ready,” so you can queue work without touching the automation.
Inputs are normalized before any YouTube calls. A routing step checks if you provided a raw channel ID or a URL. If it’s a custom or full URL, it extracts the handle and calls the YouTube API to resolve the correct channel ID.
Videos are fetched, validated, then written cleanly. The YouTube API response is checked for success, split into individual video items, and upserted into the “Videos” tab. The original channel row is updated to Finished, or flagged as Error for quick follow-up.
You can easily modify the default “10 videos per channel” limit to pull more (or less) based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Manual Trigger
This workflow starts manually and then pulls the channel list for processing.
- Add the Manual Run Starter node as the trigger.
- Connect Manual Run Starter to Fetch Channel List.
Step 2: Connect Google Sheets
These nodes read channel inputs and write results back to your spreadsheet.
- Open Fetch Channel List and set Document to
[YOUR_ID]and Sheet toChannel Urls. - Set the filter in Fetch Channel List to Status =
ready. - Open Upsert Video Records and set Document to
[YOUR_ID]and Sheet toVideos. - Confirm Upsert Video Records uses Operation =
appendOrUpdatewith Matching Columns =video_url. - Open Mark Channel Success and Mark Channel Error and set Document to
[YOUR_ID]and Sheet toChannel Urls. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Fetch Channel List, Upsert Video Records, Mark Channel Success, and Mark Channel Error.
Step 3: Set Up Channel Parsing & Routing
This stage standardizes channel inputs and routes them based on ID or handle format.
- Connect Fetch Channel List to Batch Iterator, then to Route Channel Input.
- In Route Channel Input, keep the five regex rules for
{{$json.channel_url}}to route channel URLs, IDs, and handles. - Configure Assign Channel ID A with channel_id =
{{ $json.channel_url.match(/UC[\w-]{22}/)?.[0] || '' }}. - Configure Extract Channel Handle with channel_username =
{{ $json.channel_url.replace(/^https?:\/\/(www\.)?youtube\.com\/@/, '').replace(/^@/, '') || '' }}. - Ensure Route Channel Input outputs to Assign Channel ID A or Extract Channel Handle depending on the match.
@channel and full URLs; keep them as-is unless your input format changes.Step 4: Configure YouTube API Requests
These nodes retrieve channel IDs (when needed) and fetch recent videos.
- In API Request Channel ID, set URL to
https://www.googleapis.com/youtube/v3/channelsand keep forHandle ={{ $json.channel_username }}. - Set Assign Channel ID B with channel_id =
{{ $json.body.items[0].id }}. - In API Fetch Channel Videos, set URL to
https://www.googleapis.com/youtube/v3/search, channelId ={{ $json.channel_id }}, and maxResults ={{ $('Fetch Channel List').item.json.limit || 10 }}. - Credential Required: Connect your youTubeOAuth2Api credentials in API Request Channel ID and API Fetch Channel Videos.
Step 5: Process API Results and Update Sheets
The workflow validates responses, writes video rows, and marks each channel as finished or errored.
- In Validate API Response, keep the condition
{{ $json.body.pageInfo.totalResults }}greater than0. - Connect API Fetch Channel Videos to Validate API Response.
- Validate API Response outputs to both Split Video Items and Mark Channel Success in parallel.
- Set Split Video Items Field To Split Out to
body.items, then connect it to Upsert Video Records. - Confirm Mark Channel Success sets status to
finishand last_fetched_time to{{ $now.toISO().toString().slice(0, 19).replace('T', ' ') }}. - On the error output of Validate API Response, connect Mark Channel Error and keep status =
errorwith row_number ={{ $('Batch Iterator').item.json.row_number }}.
row_number, ensure your Channel Urls sheet includes that column and the Fetch Channel List node is returning it.Step 6: Add the Rate-Limiting Loop
This loop throttles requests between batch iterations.
- Connect Batch Iterator to Pause Briefly.
- Set Pause Briefly Amount to
0.01. - Connect Pause Briefly back to Batch Iterator to continue processing batches.
Step 7: Test and Activate Your Workflow
Run a manual test to confirm videos are fetched and written correctly before enabling the workflow.
- Click Execute Workflow and watch data flow from Manual Run Starter through Fetch Channel List.
- Verify Upsert Video Records appends/updates rows in the
Videossheet withvideo_url,title, andpublished_at. - Confirm channels are marked in
Channel Urlsasfinishorerrorby Mark Channel Success and Mark Channel Error. - When satisfied, switch the workflow Active toggle on for production use.
Watch Out For
- Google Sheets credentials can expire or need specific permissions. If things break, check the Google connection in n8n’s Credentials section and confirm the account can edit the target spreadsheet.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- HTTP Request calls to the YouTube Data API can fail due to quota limits or missing API enablement. If channels keep going to “Error,” check your Google Cloud Console project for YouTube API quota and that the API is actually enabled.
Common Questions
About 30 minutes once your Google credentials are ready.
Yes, but you’ll need someone comfortable with Google Cloud setup. After that, day-to-day use is just updating the sheet status to “Ready” and running 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 YouTube Data API usage (quota-based, typically free for light research).
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 increase the “videos per channel” limit by using the value from Column C in the Channel URLs tab, so each channel can pull a different number. If you want to run it automatically, swap the Manual Trigger for a Google Sheets trigger that watches for new “Ready” rows. You can also extend the HTTP Request that fetches channel videos to request extra fields, then adjust the “cleaning” (Edit Fields/Set) step before writing to the Videos tab.
Usually it’s missing or misconfigured YouTube Data API access in Google Cloud Console. Make sure the YouTube Data API is enabled for the same project you used for credentials, and that your API key or OAuth permissions match what the HTTP Request nodes expect. Quota limits can also trigger failures if you process a lot of channels at once, so check the quota page and try a smaller batch. Finally, confirm the workflow can resolve custom channel URLs; if a handle changed, updating the input row often fixes it.
It’s built to process channels in batches, and most small teams comfortably run dozens of channels per refresh. The default pull is 10 videos per channel; if you scale that up, quota and sheet write speed become the practical limits.
Often, yes. This workflow depends on conditional routing (URL vs channel ID), batching, response validation, and “mark success/error” updates, which is where n8n stays flexible without turning into an expensive chain of tasks. Zapier or Make can still work if your needs are simple, but they get awkward once you’re looping through many channels and writing many rows. n8n also lets you self-host, which matters if you want unlimited runs. If you’re deciding between tools, map the volume you expect first, then the edge cases. Talk to an automation expert if you want a second opinion.
Once this is in place, competitor research stops feeling like clerical work. Your sheet stays clean, your status stays honest, and you can spend your time on patterns that actually matter.
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.