All Guides
Tooling & Productivity

Turn Any YouTube Video Into a Publish-Ready Blog Post with n8n

Build an n8n workflow that takes a YouTube URL plus transcript and returns a fully structured, SEO-optimized blog post in Markdown — with a real AI chain, oEmbed metadata lookup, and a prompt tuned for four different editorial styles. Workflow imported, configured, and executed live on n8n cloud.

18 min read
April 24, 2026
NerdLevelTech
2 related articles
Turn Any YouTube Video Into a Publish-Ready Blog Post with n8n

{/* Last updated: 2026-04-24 | Built, imported, and executed live on nerdleveltech.app.n8n.cloud | gpt-5-mini via n8n free credits */}

Every node in this guide was wired live on n8n cloud. The workflow JSON you'll download is the exact one we imported, saved, and ran. No placeholder nodes, no TODO stubs — paste your OpenAI credential and it works.

What You'll Build

  • Accepts a YouTube URL + transcript + style via a shareable web form (no code, no deployment)
  • Looks up the real video title and channel name via YouTube's public oEmbed endpoint
  • Builds a structured context object combining user input and oEmbed metadata
  • Passes everything to a LangChain LLM Chain powered by gpt-5-mini
  • Returns a publish-ready Markdown blog post — with H1, a 160-char TL;DR, 3–5 H2 sections, a code-friendly structure, and a takeaways list

Here is the complete workflow after import — five nodes plus one AI sub-node:

Complete n8n YouTube-to-blog workflow showing On form submission, Fetch Video Metadata, Build Context, Blog Post Chain, and OpenAI Chat Model nodes wired together

Skip the Manual Build — Import the Workflow

Don't want to wire nodes by hand? Download the complete workflow JSON and paste it into any empty n8n canvas. You'll only need to open the OpenAI Chat Model sub-node and select your credential.

To import: Create a new workflow → click anywhere on the blank canvas → press Cmd+V (Mac) or Ctrl+V (Windows). n8n detects the pasted workflow and loads all five nodes with their connections.


Prerequisites

RequirementDetails
n8n accountFree 14-day trial on n8n.io/cloud — no credit card
OpenAI credits100 free credits built into n8n — no OpenAI key needed
A YouTube video with captionsAny video where you can open the "Show transcript" panel
Time~15 minutes

n8n's AI Node Types Used Here

NodePurpose
Form TriggerPublic web form that starts the workflow
HTTP RequestCalls YouTube's oEmbed endpoint for metadata
SetBuilds a clean context object from multiple upstream items
Basic LLM Chain (chainLlm)Runs a single LLM call with a structured prompt
OpenAI Chat ModelLanguage model sub-node — attached to the chain

Step 1 — Import the Workflow

1a. Create a New Workflow

From the n8n home dashboard click + Create workflow. A blank canvas opens with two placeholders: Add first step… and Build with AI.

n8n workflows home dashboard showing the overview metrics and the list of existing workflows

1b. Paste the Workflow JSON

Download n8n-youtube-to-blog.json and copy its contents to your clipboard. Click once on the blank canvas to focus it, then paste with Cmd+V / Ctrl+V.

n8n recognizes the paste as a workflow import and immediately renders all five nodes with their connections. The workflow renames itself to "YouTube to AI Blog Post".

Why paste instead of "Import from file"? n8n's file picker is a native OS dialog — it's slower than pasting, and it strips webhook IDs that the Form Trigger depends on. Paste-import preserves the full node state, including webhook registrations.


Step 2 — Configure the Form Trigger

Double-click the On form submission node. The node panel has three areas you care about:

  1. Form URLs — the public test URL + production URL
  2. Form Title / Description — what users see when they open the form
  3. Form Elements — the fields users fill in
Form trigger node panel showing the test URL, form title YouTube to AI Blog Post, description, and the three form fields: YouTube URL, Transcript, Blog Style

2a. Verify the Field Types

The imported workflow ships with three form fields. Confirm each one:

FieldElement TypeRequired
YouTube URLText Input
TranscriptTextarea
Blog StyleDropdown (4 options)

Watch out: If you imported an older JSON that used fieldType: "url", n8n will show a red indicator next to the Element Type dropdown because url is no longer a valid form element type. Click the dropdown and pick Text Input instead.

2b. Grab the Test URL

The Test URL field shows a link like https://<your-workspace>.app.n8n.cloud/form-test/<uuid>. Copy it — you'll open it in Step 6 to run the workflow end-to-end. The Production URL only activates after you publish the workflow.


Step 3 — oEmbed Metadata Lookup

Why call oEmbed instead of scraping the YouTube page? Three reasons:

  1. No authentication. YouTube's oEmbed endpoint is public and requires no API key.
  2. Stable schema. The response has had the same shape (title, author_name, thumbnail_url) since 2012.
  3. Cheap. One small GET request per blog post — no rate limits for reasonable usage.

Double-click the Fetch Video Metadata node. Verify the URL expression:

https://www.youtube.com/oembed?url={{ encodeURIComponent($json['YouTube URL']) }}&format=json

The encodeURIComponent() call is load-bearing — without it, URLs with query strings (like ?v=aircAruvnKk&list=PL...) break the oEmbed call.

Why the "neverError" Option?

Under Options → Response → Never Error, the toggle is set to true. This means if the oEmbed call fails (private video, deleted video, region block), the workflow continues with an empty metadata object rather than erroring out. The Set node downstream handles the empty case with title || 'Untitled video'.


Step 4 — Build the Context Object

The Form Trigger returns one item with fields named "YouTube URL", "Transcript", "Blog Style". The oEmbed call returns title, author_name, etc. The Build Context node flattens these into a clean object the LLM Chain can reference without escaping quotes everywhere.

Double-click Build Context. You'll see five assignments:

Output FieldExpressionWhy
title{{ $json.title || 'Untitled video' }}Fallback if oEmbed returned empty
channel{{ $json.author_name || 'Unknown channel' }}Same — attribution in the opening line
url{{ $('On form submission').item.json['YouTube URL'] }}Cross-reference form input
transcript{{ $('On form submission').item.json['Transcript'] }}The raw text
style{{ $('On form submission').item.json['Blog Style'] }}"Technical tutorial" / etc.

The $('Node Name').item.json[...] syntax lets you reach back to any upstream node's output, even if it's not the immediate parent. This is how the Build Context node pulls from both the Form Trigger and the Fetch Video Metadata node.


Step 5 — The Blog Post Chain Prompt

This is where the magic happens. Double-click Blog Post Chain. The Text field contains the full prompt — about 350 words of structured instructions. Here is the spine of it (paraphrased for brevity):

You are a senior tech editor. Convert the raw YouTube video transcript
below into a publish-ready blog post in the style: {{ $json.style }}.

VIDEO METADATA
  - Title: {{ $json.title }}
  - Channel: {{ $json.channel }}
  - URL: {{ $json.url }}

TRANSCRIPT
  """
  {{ $json.transcript }}
  """

OUTPUT REQUIREMENTS (strict)
  1. Return pure Markdown only.
  2. First line: # <SEO-friendly H1 under 60 chars>
  3. Second block: > <One-sentence TL;DR under 160 chars>
  4. Third block: 2-sentence intro that hooks the reader.
  5. Body: 3-5 ## H2 sections with meaningful subheadings.
  6. Include an inline linked credit to the video.
  7. End with a 3-item Takeaways list.

Why These Specific Rules?

  • "Pure Markdown only — no preamble" defeats gpt-5-mini's tendency to prepend "Sure! Here is the blog post:". You want the output usable without post-processing.
  • "TL;DR under 160 chars" is sized for Google's meta description field and for AI Overview citation snippets.
  • "3–5 H2 sections" bounds the post length. Without this, gpt-5-mini often returns a 400-word summary instead of a structured article.
  • "No emojis unless Casual explainer" matches tone to style. Emojis in a Technical tutorial signal low effort.

Connecting the Model

The Blog Post Chain has a required Model connector at the bottom (marked with a red asterisk). The imported workflow already connects this to the OpenAI Chat Model sub-node — you just need to verify the credential.

Double-click the OpenAI Chat Model sub-node. It should look like this:

OpenAI Chat Model sub-node configuration showing n8n free OpenAI API credits credential, gpt-5-mini model selected, Use Responses API enabled, and sampling temperature 0.4
FieldValueWhy
Credentialn8n free OpenAI API creditsAuto-created when you claimed the 100 free credits
Modelgpt-5-miniBest speed/quality ratio for content generation
Use Responses APItrueEnables the newer OpenAI endpoint — faster + cheaper
Sampling Temperature0.4Low enough for structural consistency, high enough for lively prose

Step 6 — Run the Full Pipeline

6a. Open the Test Form

Open the Test URL you copied in Step 2 (or click Test this trigger from the Form Trigger node panel). The public form loads:

The public n8n form showing three required fields: YouTube URL, Transcript textarea, and Blog Style dropdown with a prominent Submit button

6b. Grab a Real Transcript

Open any YouTube video that has captions enabled. Under the video description, click the "..." menu → Show transcript. A right-side panel opens with time-stamped lines. Click the three-dot menu inside that panel → Toggle timestamps to get plain prose, then select-all and copy.

6c. Submit the Form

Paste the YouTube URL into the first field, paste the transcript into the textarea, pick a style from the dropdown, and click Submit.

The form shows "Form Submitted — Your response has been recorded." Behind the scenes, n8n runs the five-node chain in sequence. With gpt-5-mini, end-to-end execution takes 15–40 seconds depending on transcript length.

6d. Inspect the Output

Back in the n8n editor, click the Executions tab on the top toolbar. You'll see the run you just triggered. Click it to open the execution view, then click the Blog Post Chain node to see the text output — the full Markdown blog post.

Real AI execution result: full Markdown blog post titled 'What Is a Neural Network?' with H1, TL;DR, intro, four H2 sections, a layer architecture table, numbered list, and takeaways — all generated in 31.2 seconds with ~1,028 tokens

In our live test run, a transcript from a 3Blue1Brown neural-network primer produced a 900-word technical tutorial with four H2 sections, an architecture table, and a takeaways list — all in 31.2 seconds, ~1,028 tokens through gpt-5-mini.


Extensions & Production Notes

Auto-Fetch the Transcript (Remove the Manual Paste)

Replace the Form Trigger's Transcript field with an automated fetch. After the Form Trigger, insert two nodes:

  1. HTTP Request — GET https://youtubetotranscript.com/transcript?v={{ videoId }} (or any transcript API you trust)
  2. Code — parse the response to plain text

Then wire the Code node's output into Build Context in place of the form field. Expect occasional empty returns for private/age-gated/regional content — keep the Form Trigger's Transcript field as a fallback input.

Push Straight to WordPress

Add a WordPress node after the Blog Post Chain. Connect your WordPress credentials (needs an application password, not your main login). Map:

  • Title{{ $json.text.match(/^# (.+)/)[1] }}
  • Content{{ $json.text }}
  • Statusdraft
  • Categories / Tags → your defaults

Schedule for RSS-Driven Content

Swap the Form Trigger for an RSS Feed Read Trigger pointed at your favorite YouTube channel's feed (https://www.youtube.com/feeds/videos.xml?channel_id=<ID>). Each new video auto-runs through the pipeline and drops a draft into your CMS. Combine with a webhook back to Slack for a "new draft ready" notification.

Guardrails Before You Publish

Never publish LLM output without a human pass:

CheckHow
Factual hallucinationsRead the article against the transcript. Flag any claim not in the source.
AttributionVerify the channel name and video title match reality. oEmbed sometimes returns stale cached titles.
Link rotConfirm the YouTube URL resolves — private videos 404.
Brand voiceIf the blog style chosen doesn't match your brand, re-run with a different style.

Token Cost Per Post

ModelInput cost / 1MOutput cost / 1MCost per ~900-word post
gpt-5-mini$0.25$2.00~$0.003
gpt-5$1.25$10.00~$0.015
gpt-4.1-mini$0.40$1.60~$0.004

⚠ Prices change frequently. The values above are for illustration only and may be out of date. Always verify current pricing directly with the provider before making cost decisions: Anthropic · OpenAI · Google Gemini · Google Vertex AI · AWS Bedrock · Azure OpenAI · Mistral · Cohere · Together AI · DeepSeek · Groq · Fireworks AI · Perplexity · xAI · Cursor · GitHub Copilot · Windsurf.

Numbers are approximate and vary by transcript length. n8n logs exact tokenUsage in each execution — check the node output to see what a real run cost.


What's Next

You now have a repeatable pipeline for turning any spoken content into publish-ready articles. The same pattern works for:

  • Podcast episodes (paste the transcript from Descript / Otter)
  • Conference talks (YouTube has them all)
  • Internal Zoom recordings (export the caption .vtt, paste the transcript)

Read the companion guide → Multi-Source AI News Digest to schedule the same LLM chain against daily tech feeds, or jump to AI Twitter Thread Writer to turn the blog post output into a viral X thread.

Share this guide

Frequently Asked Questions

YouTube's caption URLs are session-signed and rate-limited, and third-party transcript APIs change month to month. Having the user paste the transcript from YouTube's built-in 'Show transcript' panel makes the workflow bulletproof — it always works regardless of region, video age, or YouTube's latest anti-scraping changes. The guide shows an optional extension using a transcript API as a drop-in replacement.

Related Articles

FREE WEEKLY NEWSLETTER

Stay on the Nerd Track

One email per week — courses, deep dives, tools, and AI experiments.

No spam. Unsubscribe anytime.