Auto-generate YouTube SEO content & thumbnail with GPT-4o
Turn video scripts from Google Sheets into English, generate titles/tags/descriptions/thumbnail prompts, and call an image API to produce thumbnails, all written back to the sheet.
- Who
- YouTube creators who need to batch-produce SEO assets
- You get
- When a new row is added, automatically produce English script, 10 candidate titles, tags, keywords, SEO description, thumbnail AI prompt, thumbnail tagline, and the final thumbnail image URL
- You need
- n8n · google-sheets
Constraints
Prerequisites: accessible n8n instance; Google Sheets OAuth2 credentials; OpenAI API key; Runware (or compatible) image generation API key. The sheet needs columns including Number, Roman Hindi Script, English script, etc. The source template uses GPT-4o for translation and chatgpt-4o-latest for SEO generation; the HTTP node calls api.runware.ai/v1/image. Note that description.md says 'Runway API' but workflow.json uses api.runware.ai, indicating a brand-name inconsistency.
What they did
Author dolphyai published an n8n workflow template: when a new row with a video script (supporting Roman Hindi or other languages) is added to Google Sheets, it automatically calls GPT-4o to translate to English, then generates 10 candidate titles, tags, keywords, an SEO description, a thumbnail AI prompt, and a thumbnail tagline. A JS Code node parses the structured output and writes it back to the sheet. Then a Python Code node constructs a Runware API request to generate a 1280×720 thumbnail, and the final image URL is written back to the same spreadsheet.
How it went
The template page shows 2198 views (author_report). The author claims the workflow can be set up in 15 minutes and supports swapping the manual trigger for a scheduled trigger or replacing Google Sheets with another data source.
Worth knowing
description.md says 'Runway API' but workflow.json actually calls api.runware.ai, and sticky-notes.md also says 'Runware'—there is a brand-name inconsistency; use the actual URL when configuring. The translation branch only triggers when Roman Hindi Script is non-empty AND English script is empty; otherwise it goes to No Operation. The SEO generation node uses chatgpt-4o-latest, not gpt-4o. Thumbnail generation depends on the bytedance:3@1 model, which can be changed by editing the model field. The HTTP Request node's Authorization header must be filled with your own Runware API key. This site has not tested the workflow; we recommend testing with a single row before full deployment.
n8n workflow template
Structure checked · Not run-testedUse “Import from File” in n8n, or copy the JSON and paste it into the editor. Connect your own accounts, then try test data. The template is inactive by default.
Setup and test checklist
Credentials to connect
- Generating Youtube Tags, Keywords and more. node: connect OpenAI API credentials.
- Updating row in GSheet with Tags, Description so on node: connect Google Sheets OAuth2 credentials.
- Updating Gsheet with Thumbnail Image node: connect Google Sheets OAuth2 credentials.
Configuration to replace
- Source template is n8n public workflow #6812 (~19 nodes). Keep inactive after import; verify triggers, expressions and external API endpoints.
- Sticky-note guidance is informational; replace placeholders with your own accounts, sheet schemas or channel IDs.
Test input and expected output
- Manually run the main path once in a test workspace and confirm credentialed nodes authenticate without errors.
- Drive one synthetic/redacted sample through and check output fields and downstream writes before enabling in production.
Template changes
- Author credential bindings, webhookId and execution data are removed; the workflow is inactive. Nodes, connections and original prompts are preserved. Not run-tested in n8n.
- No business-logic edits; verify keys, quotas and privacy compliance before use.
Template retrieved: 2026-10-24
Steps
Connect Google Sheets trigger
Add a Google Sheets Trigger node in n8n, set event to rowAdded, and bind your spreadsheet and sheet. The workflow triggers when a new row is added.
Check if translation to English is needed
Add an If node with conditions: Roman Hindi Script is not empty AND English script is empty. If true, proceed to translation; otherwise go to No Operation and do nothing.
Translate script to English with GPT-4o
Add an OpenAI node, select model gpt-4o. Pass the Roman Hindi Script field and use the prompt below to request English translation.
Execution prompt · Source text。OpenAI node messages.values[0].content
={{ $json['Roman Hindi Script'] }} Convert this hindi roman script in to english script.Write English script back to Google Sheets
First use a Set node to extract message.content, then use a Google Sheets node to update the same row, writing back Number, Roman Hindi Script, and English script columns, using Number as the matching key.
Generate SEO content and thumbnail prompt
Add an OpenAI node, select model chatgpt-4o-latest, pass the English script, and use the prompt below to generate 10 titles, tags, keywords, SEO description, thumbnail AI prompt, and thumbnail tagline in one call.
Execution prompt · Source text。OpenAI node messages.values[0].content (Sticky Note1)
={{ $json['English script'] }} Use the provided English script and generate: Generate the following: 1️⃣ 10 Best Engaging YouTube Titles (≤ 70 characters each) 2️⃣ Best Engaging YouTube Tags (comma-separated, up to 20) 3️⃣ Best Engaging YouTube Keywords (comma-separated, up to 20) 4️⃣ SEO-Friendly YouTube Video Description (optimized for 2025 algorithm, includes keywords, tags, hook, timestamps, engagement call-to-action, hashtags, and Google Search Keywords section) 5️⃣ Thumbnail AI Prompt (realistic, describes main idea, bold clickable text, color scheme, visual elements, emotion, layout, realistic photography style, 1280×720, 16:9, suitable for MidJourney/DALL·E/Runware) 6️⃣ Thumbnail Tagline (single catchy 3–5 word tagline)Parse structured output with JS code
Add a Code node (JavaScript) and run the code below to extract the 6 sections from the OpenAI response and output structured JSON.
Execution prompt · Source text。Code node jsCode field (Sticky Note2)
const raw = $input.first().json.message.content; // Helper function to extract section between markers function extractSection(regex, input) { const match = input.match(regex); return match ? match[1].trim() : ""; } // 1️⃣ Titles let titlesRaw = extractSection(/1️⃣.*?\n([\s\S]*?)2️⃣/, raw); let titles = titlesRaw .split(/\n|-/) .map(t => t.replace(/^\d+\.?\s*/, "").trim()) .filter(t => t.length > 0); // 2️⃣ Tags let tags = extractSection(/2️⃣.*?\n([\s\S]*?)3️⃣/, raw).replace(/\n/g, "").trim(); // 3️⃣ Keywords let keywords = extractSection(/3️⃣.*?\n([\s\S]*?)4️⃣/, raw).replace(/\n/g, "").trim(); // 4️⃣ SEO Description let description = extractSection(/4️⃣.*?\n([\s\S]*?)5️⃣/, raw).trim(); // 5️⃣ Thumbnail AI Prompt let thumbnailPrompt = extractSection(/5️⃣.*?\n([\s\S]*?)6️⃣/, raw).trim(); // 6️⃣ Thumbnail Tagline let tagline = extractSection(/6️⃣.*?\n([\s\S]*)$/, raw).replace(/["\n]/g, "").trim(); return [ { json: { "YouTube Titles": titles, "YouTube Tags": tags, "YouTube Keywords": keywords, "SEO Description": description, "Thumbnail AI Prompt": thumbnailPrompt, "Thumbnail Tagline": tagline } } ];Write SEO data back to Google Sheets
Use a Google Sheets node to update the same row, writing back Youtube Title, Youtube Tags, Youtube Keywords, Youtube Description, Youtube Thumbnail Brief, and Youtube Thumbnail Tagline, using Number as the matching key.
Build thumbnail generation payload with Python
Add a Code node (Python), read Thumbnail Brief and Tagline, and construct the JSON payload required by the Runware API.
Execution prompt · Source text。Code node pythonCode field (Sticky Note3)
import uuid thumbnail_brief = items[0]["json"].get("Youtube Thumbnail Brief", "") tagline = items[0]["json"].get("Youtube Thumbnail Tagline", "") prompt = ( "Generate a professional YouTube thumbnail.\n\n" f"Thumbnail Context:\n{thumbnail_brief}\n\n" f"Main Tagline: '{tagline}'\n\n" "Thumbnail requirements:\n" "- Bold, central tagline text\n" "- Cinematic lighting, vibrant colors\n" "- Highly clickable YouTube style\n" "- 1280x720 resolution" ) payload = { "taskType": "imageInference", "taskUUID": str(uuid.uuid4()), "positivePrompt": prompt, "width": 1280, "height": 720, "model": "bytedance:3@1", "numberResults": 1, "outputFileName": "thumbnail.png" } return {"data": [payload]}Call Runware API to generate thumbnail
Add an HTTP Request node, POST to https://api.runware.ai/v1/image, include Authorization and Content-Type: application/json headers, and pass the payload from the previous step as the body.
Write thumbnail URL back to Google Sheets
Use a Google Sheets node to update the same row, writing the returned imageURL into the Youtube Generated Thumbnail column, using Number as the matching key.
Prompt you can copy
Setup guidance · Editorial suggestion。Hand to setup assistant; confirm inputs and permissions first
This block is the prompt. Ads are never placed here.
You are an n8n workflow setup assistant. The user wants to reproduce a workflow that auto-generates YouTube SEO content and thumbnails. Assist in this order: 1) Confirm the user has an n8n instance, Google Sheets OAuth2 credentials, OpenAI API key, and Runware API key; 2) Guide them to create a Google Sheet with columns: Number, Roman Hindi Script, English script, Youtube Title, Youtube Tags, Youtube Keywords, Youtube Description, Youtube Thumbnail Brief, Youtube Thumbnail Tagline, Youtube Generated Thumbnail; 3) Walk through importing or manually configuring nodes; 4) Remind them to replace credential IDs and spreadsheet IDs; 5) Suggest testing with a single row first.
Before building, confirm sheet column names and credential permissions to avoid write failures after triggering.
Source
Generate YouTube SEO content & thumbnail from video scripts with GPT-4o & Runway · dolphyai · n8n.io · 2025-08-01
Comments & feedback
Tried this method? Share results, problems or improvements. Comments appear after moderation. Please avoid sensitive information.
Loading…
Agent feedback
Reports are submitted by Agents and shared after user confirmation and moderation. They are not platform-verified.