DEV Community

Fast Data
Fast Data

Posted on

Summarise any YouTube channel into Google Sheets with n8n (free workflow)

I follow more YouTube channels than I have time to watch. Some of them I only need to know about: what did a competitor announce, which tools did a creator recommend, what topic is a channel pushing this month. So I built a small n8n workflow that does the watching for me: every Monday it takes the newest videos of a channel, summarises them with an LLM and adds one row per video to a Google Sheet.

This post walks through the workflow. You can import it as-is; the JSON is linked at the end.

Disclosure: the transcripts come from the YouTube Transcript Scraper on Apify, which I built. I'll be clear about what it costs and where its limits are.

What you end up with

A sheet with one row per new video:

date channel title url minutes words summary
2026-10-20 @Fireship The runtime wars are over... and Node won youtube.com/watch?v=l3L_lETiSzc 6 1155 TL;DR + 3-5 key points + a quote

After a few weeks you have a searchable archive of everything the channel said, which is far easier to skim than a list of video titles.

The workflow

Seven nodes, all built in:

  1. Schedule Trigger: every Monday, 7:00.
  2. HTTP Request: runs the transcript Actor and waits for the result.
  3. Filter: keeps videos that actually have a transcript.
  4. Remove Duplicates: mode "remove items processed in previous executions", keyed on videoId. This is the piece that makes the workflow idempotent: a video is summarised once, even if it is still among the newest videos next week.
  5. Basic LLM Chain with an OpenAI Chat Model (swap in Anthropic, Gemini or Ollama if you prefer).
  6. Edit Fields: picks the columns.
  7. Google Sheets: append row.

Getting the transcripts

The HTTP Request node calls Apify's synchronous run endpoint:

POST https://api.apify.com/v2/acts/fast_data_asap~youtube-transcript-scraper/run-sync-get-dataset-items
Authorization: Bearer <your Apify token>
Enter fullscreen mode Exit fullscreen mode

with this body:

{
  "startUrls": ["https://www.youtube.com/@Fireship/videos"],
  "maxVideosPerSource": 3,
  "languages": ["en"],
  "includeSegments": false
}
Enter fullscreen mode Exit fullscreen mode

The endpoint starts the Actor, waits until it is done and returns the dataset as a JSON array. n8n turns every element into an item, so the rest of the workflow simply works on "one item per video".

A channel URL is enough: the Actor resolves the channel's video list, takes the newest maxVideosPerSource videos and returns for each one title, url, durationSeconds, wordCount, a status and the full text. I switch off timestamped segments here because the summary only needs plain text.

For the token, I use an n8n Header Auth credential (Authorization / Bearer <token>) instead of putting the token in the URL. Credentials are encrypted in n8n; the URL ends up in execution logs.

Why the HTTP Request node and not the Apify node? There is an Apify integration for n8n and it works. I went with HTTP Request because it runs on every n8n instance without installing anything, and you can see exactly what is being sent.

The prompt

Summarize this YouTube video for a busy reader.

Title: {{ $json.title }}

Write:
1. A one-sentence TL;DR.
2. Three to five key points as a bulleted list.
3. One notable quote from the transcript, if there is one.

Plain text, no headings. Transcript:
{{ $json.text.slice(0, 60000) }}
Enter fullscreen mode Exit fullscreen mode

The slice(0, 60000) is a safety net: about an hour of speech. Without it, a three-hour podcast episode would quietly cost ten times more than the rest of the week combined.

What it costs

  • Transcripts: $0.002 per video that has a transcript. Videos without subtitles come back with a status like transcripts_disabled and are not charged.
  • As shipped (3 newest videos per week): about $0.006 per week on the Apify side.
  • Backfilling a whole channel once, say 100 videos: $0.20.
  • LLM: a 10-minute video is roughly 2,000 input tokens, so with a small model you are looking at fractions of a cent per video.

Apify's free plan includes $5 of usage per month, which is 2,500 transcripts, so you can run this for a long time without paying anything.

Things I learned building it

  • Deduplicate after filtering, not before. If a video has no transcript yet (auto-captions sometimes appear a few hours after upload), you want next week's run to try again. Filtering first means only videos that were really summarised are remembered.
  • Keep runs small. The synchronous endpoint waits up to 300 seconds. For a weekly job that is plenty; for a one-time backfill of hundreds of videos, run the Actor directly in Apify and import the dataset.
  • Log the source. For channel inputs the workflow writes the channel URL you put in (source) into the channel column, so rows from several channels stay easy to filter.

Variations

  • Several channels: add more URLs to startUrls.
  • Topic monitoring: replace startUrls with "searchQueries": ["n8n tutorial"].
  • Notion instead of Sheets: replace the last node with Notion → create database page.
  • RAG: set "chunkSizeChars": 1500; every result then includes chunks with start and end times, ready for a vector store node. Citations can link straight to the timestamp in the video.
  • Repurposing: change the prompt to "write a LinkedIn post in my voice" and you have a content pipeline.

Get the workflow

Import the JSON (Workflows → Import from File), add the three credentials (Apify, OpenAI, Google), change the channel URL and click Execute workflow. If you build something on top of it, I'd love to hear about it in the comments.

Transcripts belong to their creators. Use the summaries for research and personal knowledge management, and respect copyright and YouTube's terms.

Top comments (0)