This workflow corresponds to n8n.io template #4504 — we link there as the canonical source.
This workflow follows the Chainllm → HTTP Request recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Viral Title/Thumbnail Generation",
"tags": [],
"nodes": [
{
"id": "",
"name": "When clicking \u2018Test workflow\u2019",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-680,
20
],
"parameters": {},
"typeVersion": 1
},
{
"id": "",
"name": "Wait",
"type": "n8n-nodes-base.wait",
"position": [
2940,
-240
],
"parameters": {},
"typeVersion": 1.1
},
{
"id": "",
"name": "Wait1",
"type": "n8n-nodes-base.wait",
"position": [
120,
20
],
"parameters": {},
"typeVersion": 1.1
},
{
"id": "",
"name": "Structured Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
-40,
220
],
"parameters": {
"jsonSchemaExample": "{\n\t\"Keyword1\": \"string\",\n\t\"Keyword2\": \"string\",\n \"Keyword3\": \"string\"\n}"
},
"typeVersion": 1.2
},
{
"id": "",
"name": "Create Keywords",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
-240,
20
],
"parameters": {
"text": "=You are a YouTube content strategist. The input of the request is the following content idea : {{ $json.query }}",
"messages": {
"messageValues": [
{
"type": "HumanMessagePromptTemplate",
"message": "=Given a content idea, extract **three keyword phrases** (1\u20135 words each) that are: \n- Highly relevant for a YouTube search \n- Based on what people would realistically search for \n- Focused on *actions*, *techniques*, or *tools* not just literal parts of the content idea \n- Avoid abstract or vague terms that would not return good search results \n\nExample: \nContent Idea: \"Turn a Zoom call into a viral TikTok\" \nOutput: \n1. \"zoom to tiktok edit\" \n2. \"short form video from meetings\" \n\nReturn ONLY the three keyword phrases, no explanation."
}
]
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 1.5
},
{
"id": "",
"name": "YTB Search Scrape",
"type": "n8n-nodes-base.httpRequest",
"position": [
340,
20
],
"parameters": {
"url": "https://api.apify.com/v2/acts/streamers~youtube-scraper/runs?token=YOUR_TOKEN_HERE",
"method": "POST",
"options": {},
"jsonBody": "={\n \"dateFilter\": \"year\",\n \"lengthFilter\": \"between420\",\n \"maxResults\": 10,\n \"searchQueries\": [\n \"{{ $json.output.Keyword1 }}\",\n \"{{ $json.output.Keyword2 }}\",\n \"{{ $json.output.Keyword3 }}\"\n ],\n \"sortingOrder\": \"relevance\"\n} ",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "",
"name": "Get DataSet",
"type": "n8n-nodes-base.httpRequest",
"position": [
1320,
0
],
"parameters": {
"url": "https://api.apify.com/v2/acts/streamers~youtube-scraper/runs/last/dataset/items?token=YOUR_TOKEN_HERE",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "",
"name": "Mistral Cloud Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatMistralCloud",
"position": [
-240,
220
],
"parameters": {
"model": "mistral-large-latest",
"options": {}
},
"credentials": {
"mistralCloudApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "",
"name": "If",
"type": "n8n-nodes-base.if",
"position": [
900,
20
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.data.status }}",
"rightValue": "SUCCEEDED"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "",
"name": "Check IF Finished",
"type": "n8n-nodes-base.httpRequest",
"position": [
680,
20
],
"parameters": {
"url": "https://api.apify.com/v2/acts/streamers~youtube-scraper/runs/last?token=YOUR_TOKEN_HERE",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "",
"name": "Wait2",
"type": "n8n-nodes-base.wait",
"position": [
1060,
200
],
"parameters": {},
"typeVersion": 1.1
},
{
"id": "",
"name": "Mistral Cloud Chat Model1",
"type": "@n8n/n8n-nodes-langchain.lmChatMistralCloud",
"position": [
2520,
0
],
"parameters": {
"model": "mistral-large-latest",
"options": {}
},
"credentials": {
"mistralCloudApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "",
"name": "Calculate CTR",
"type": "n8n-nodes-base.code",
"position": [
1520,
200
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "const views = $json.viewCount;\nconst subscribers = $json.numberOfSubscribers;\nconst likes = $json.likes;\nconst comments = $json.commentsCount;\nconst publishedAt = $json.date;// ISO string, e.g. \"2024-05-01T12:00:00Z\"\n\n// Defensive check for missing values\nif (!views || !subscribers || !publishedAt) {\n return { error: \"Missing required data\" };\n}\n\n// Parse dates\nconst publishedDate = new Date(publishedAt);\nconst now = new Date();\n\n// Validate dates\nif (isNaN(publishedDate.getTime())) {\n return { error: \"Invalid publishedAt date\" };\n}\n\n// Calculate days since upload\nconst msPerDay = 1000 * 60 * 60 * 24;\nconst timeDiff = now.getTime() - publishedDate.getTime();\nconst daysSinceUpload = Math.floor(timeDiff / msPerDay);\n\n// Compute RPI\nconst rpi = (views / subscribers) * ((likes + comments) / views / 10);\n\n// Apply temporal decay factor\nconst decayFactor = Math.exp(-0.015 * daysSinceUpload);\nconst rpiAdjusted = rpi * decayFactor;\n\n// Calculate Pseudo CTR\nconst ctrScore = rpiAdjusted * 100;\n\nreturn {\n ctrPercent: parseFloat(ctrScore.toFixed(3)), // \u2190 Your CTR-style %\n};\n"
},
"typeVersion": 2
},
{
"id": "",
"name": "Merge Data",
"type": "n8n-nodes-base.merge",
"position": [
1700,
20
],
"parameters": {
"mode": "combine",
"options": {},
"combineBy": "combineByPosition"
},
"typeVersion": 3
},
{
"id": "",
"name": "Create Titles",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
3140,
-240
],
"parameters": {
"text": "=You are an expert in YouTube video title optimization.",
"messages": {
"messageValues": [
{
"type": "HumanMessagePromptTemplate",
"message": "={{ $json.text }}"
}
]
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 1.5
},
{
"id": "",
"name": "Mistral Cloud Chat Model2",
"type": "@n8n/n8n-nodes-langchain.lmChatMistralCloud",
"position": [
3060,
20
],
"parameters": {
"model": "mistral-large-latest",
"options": {}
},
"credentials": {
"mistralCloudApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "",
"name": "Structured Output Parser1",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
3340,
20
],
"parameters": {
"jsonSchemaExample": "{\n \"title1\": \"string\",\n \"title2\": \"string\",\n \"title3\": \"string\",\n \"title4\": \"string\",\n \"title5\": \"string\"\n}"
},
"typeVersion": 1.2
},
{
"id": "",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-760,
-980
],
"parameters": {
"color": 7,
"width": 780,
"height": 320,
"content": "## How this is Working ?\n**1 -** Enter your content idea in the Edit Fields node in a \"raw\" format. Ex : Boil Eggs Perfectly\n**2 -** LLM create 3 keywords request based on the idea and Apify scrape the YTB Search\n**3 -** Wait until the dataset is completed in Apify\n**4 -** Retrieve Dataset from Apify, calculate approximation of CTR and filter top performing videos\n**5 -** LLM analyze patterns of best performing titles and create a prompt based on it. Another LLM create 5 titles based on these criteria\n**6 -** LLM analyze patterns of best performing thumbnails and create a prompt based on it. Another LLM create 1 thumbnail based on these criteria\n**7 -** Return titles and thumbnail in a HTML Page\n\n\n**\ud83d\udcfa Youtube Video Tutorial : https://youtu.be/Upuj9Pi94g0**\n**\ud83d\udee0\ufe0f Need Help with Your Workflows ? https://tally.so/r/wayeqB**\n**\ud83d\udc68\u200d\ud83d\udcbb\u00a0More Workflows : https://n8n.io/creators/nasser/**"
},
"typeVersion": 1
},
{
"id": "",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-760,
-640
],
"parameters": {
"color": 7,
"width": 780,
"height": 520,
"content": "## SETUP\n\n**Setup Input Content Idea :** Enter Keyword Related to the niche you want. Trigger can be replaced with anything as long as you retrieve a content idea. For example : Form submission, Database entry, etc ...\n\nIf you want to change the number of keywords, update the data accordingly in the \"Create Keywords\" LLM Chain node \u27a1\ufe0f Structured Output Parser AND in the \"YTB Search Scrape\" HTTP Request Node in Body \u27a1\ufe0f JSON \u27a1\ufe0f searchQueries.\nIf you want to change the number of scraped videos for each keyword, update the data accordingly in the \"Create Videos Dataset\" HTTP Request Node in Body \u27a1\ufe0f JSON \u27a1\ufe0f maxResults.\nIf you want to adjust the CTR Calculation feel free to update it in the Code Node \u27a1\ufe0f Follow the Comments (after \"//\") to find what you're looking for.\nIf you want to adjust the level of virality of the videos kept for analaysis go to Filter Node \u27a1\ufe0f Value.\n\n**Setup Output HTML Page :** You can also replace this part with any type of storage. For example : Airtable Database, Google Drive/Google Sheet, Send to an email, etc ...\n\n**APIs :** For the following third-party integrations, replace [YOUR_API_TOKEN] with your API Token or connect your account via Client ID / Secret to your n8n instance :\n- Apify : https://docs.apify.com/api/v2/getting-started \n- OpenAI : https://platform.openai.com/docs/overview (base URL : https://api.openai.com/v1) OR OpenRouter : https://openrouter.ai/docs/quickstart (base URL : https://openrouter.ai/api/v1)\n- HuggingFace (FLUX.1) : https://huggingface.co/docs"
},
"typeVersion": 1
},
{
"id": "",
"name": "Content Idea",
"type": "n8n-nodes-base.set",
"position": [
-460,
20
],
"parameters": {
"mode": "raw",
"options": {},
"jsonOutput": "{\n \"query\": \"create viral title and thumbnail in n8n\"\n}"
},
"typeVersion": 3.4
},
{
"id": "",
"name": "Create List of Titles",
"type": "n8n-nodes-base.code",
"position": [
2380,
-240
],
"parameters": {
"jsCode": "const titles = items.map(item => item.json.title);\nreturn [{ json: { titles } }];"
},
"typeVersion": 2
},
{
"id": "",
"name": "HTML",
"type": "n8n-nodes-base.html",
"position": [
3800,
40
],
"parameters": {
"html": "<!DOCTYPE html>\n\n<html>\n<head>\n <meta charset=\"UTF-8\" />\n <title>My HTML document</title>\n</head>\n<body>\n <div class=\"container\">\n <h1>Thumbnail</h1>\n <img src=\"data:image/png;base64,{{ $('Convert to Base64').first().json.data }}\" />\n <h3>Titles</h3>\n <p>1. {{ $json.output.title1 }}<br>2. {{ $json.output.title2 }}<br>3. {{ $json.output.title3 }}<br>4. {{ $json.output.title4 }}<br>5. {{ $json.output.title5 }}</p>\n </div>\n</body>\n</html>\n\n<style>\n.container {\n background-color: #ffffff;\n text-align: center;\n padding: 16px;\n border-radius: 8px;\n}\n\nh1 {\n color: #ff6d5a;\n font-size: 24px;\n font-weight: bold;\n padding: 8px;\n}\n\nh2 {\n color: #909399;\n font-size: 18px;\n font-weight: bold;\n padding: 8px;\n}\n</style>\n\n<script>\nconsole.log(\"Hello World!\");\n</script>"
},
"typeVersion": 1.2
},
{
"id": "",
"name": "Loop Over Items",
"type": "n8n-nodes-base.splitInBatches",
"position": [
2260,
520
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "",
"name": "Analyze Image",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
2500,
540
],
"parameters": {
"text": "=You are an expert in YouTube thumbnail performance. Your job is to analyze why a thumbnail might be performing well and describe it precisely so a designer or AI can later recreate its essence.\n\nYou will receive:\n- The subject of the video : {{ $('Content Idea').first().json.query }}\n- The URL of the thumbnail image : {{ $json.thumbnailUrl }}\n\nYour goal:\n1. Analyze the thumbnail's visual elements (faces, text, colors, emotions, layout, contrast, focus, etc.)\n2. Identify what makes it visually compelling or attention-grabbing\n3. Relate your analysis back to the video\u2019s subject\n4. Return a structured and precise description of the thumbnail that could be reused to generate a similar performing image.\n\nRespond only with the description. Do not add anything else.",
"modelId": {
"__rl": true,
"mode": "list",
"value": "meta-llama/llama-3.2-11b-vision-instruct:free",
"cachedResultName": "META-LLAMA/LLAMA-3.2-11B-VISION-INSTRUCT:FREE"
},
"options": {},
"resource": "image",
"simplify": false,
"imageUrls": "={{ $json.thumbnailUrl }}",
"operation": "analyze"
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.8
},
{
"id": "",
"name": "Wait3",
"type": "n8n-nodes-base.wait",
"position": [
2780,
720
],
"parameters": {},
"typeVersion": 1.1
},
{
"id": "",
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
3580,
40
],
"parameters": {},
"typeVersion": 3
},
{
"id": "",
"name": "Mistral Cloud Chat Model3",
"type": "@n8n/n8n-nodes-langchain.lmChatMistralCloud",
"position": [
2680,
460
],
"parameters": {
"model": "mistral-large-latest",
"options": {}
},
"credentials": {
"mistralCloudApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "",
"name": "Create Prompt",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
2620,
280
],
"parameters": {
"text": "You are an expert visual prompt engineer.",
"messages": {
"messageValues": [
{
"type": "HumanMessagePromptTemplate",
"message": "=You are an expert visual prompt engineer.\n\nYou are given several thumbnail analysis texts, each describing what made a YouTube thumbnail visually engaging and effective. \n\nData for you : \n- The Content Idea : {{ $('Content Idea').first().json.query }}\n- The Analysis of performing Thumbnails for this idea : {{ $json.analysis}}\n\n\nYour job is to:\n1. **Summarize the most common and impactful visual elements** across all analyses.\n2. **Generate one precise image prompt** that captures the best-performing elements, ready to be used with an image generation model (like DALL\u00b7E, Midjourney, or Stable Diffusion).\nMandatory : \n- Maximum 400 characters (including spaces and punctuations) !\n- When generating the prompt text, make sure that any double quotes within the string are escaped using a backslash (\\\") so that the final output can be safely included in a JSON object.\n\n\ud83d\udce5 Input: A list of thumbnail descriptions and visual analyses.\n\ud83c\udfaf Goal: One image prompt that includes clear guidance on:\n- Subject placement and expression\n- Colors and contrast\n- Text style or layout (if any)\n- Graphic or visual elements\n- Overall layout or composition\n- Mood or tone (e.g. excitement, curiosity, professionalism)\n\n\u26a0\ufe0f Don't describe what you\u2019re doing. Just output the final image prompt.\n\n\ud83d\udccc Example output format:\nA high-contrast YouTube thumbnail with a confident man on the right side, bold yellow text on the left saying \"AI SECRETS\", a dark tech-themed background, and digital data stream effects in the back \u2014 cinematic lighting, 16:9 composition."
}
]
},
"promptType": "define"
},
"typeVersion": 1.5
},
{
"id": "",
"name": "Create List of Analysis",
"type": "n8n-nodes-base.code",
"position": [
2440,
280
],
"parameters": {
"jsCode": "const analysis = items.map(item => item.json.choices[0].message.content);\n\nreturn [\n {\n json: {\n analysis\n }\n }\n];\n"
},
"typeVersion": 2
},
{
"id": "",
"name": "Generate Image",
"type": "n8n-nodes-base.httpRequest",
"position": [
3120,
280
],
"parameters": {
"url": "https://api-inference.huggingface.co/models/black-forest-labs/FLUX.1-dev",
"method": "POST",
"options": {
"response": {
"response": {
"responseFormat": "file"
}
}
},
"jsonBody": "={\n \"inputs\":\"{{ $json.text }}\",\n \"parameters\": {\n \"height\": 720,\n \"width\": 1280,\n \"num_inference_steps\": 30,\n \"guidance_scale\": 8.0\n }\n}\n",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer [YOUR_API_TOKEN]"
},
{
"name": "Accept",
"value": "image/png"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "",
"name": "Convert to Base64",
"type": "n8n-nodes-base.extractFromFile",
"position": [
3320,
280
],
"parameters": {
"options": {
"encoding": "base64"
},
"operation": "binaryToPropery"
},
"typeVersion": 1
},
{
"id": "",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-760,
-100
],
"parameters": {
"color": 7,
"width": 460,
"height": 360,
"content": "## 1- Input\nEnter your content idea in the Edit Fields node in a \"raw\" format. Ex : Boil Eggs Perfectly"
},
"typeVersion": 1
},
{
"id": "",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-280,
-100
],
"parameters": {
"color": 7,
"width": 820,
"height": 480,
"content": "## 2- Create DataSet\nLLM create 3 keywords request based on the idea and Apify scrape the YTB Search"
},
"typeVersion": 1
},
{
"id": "",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
560,
-100
],
"parameters": {
"color": 7,
"width": 680,
"height": 520,
"content": "## 3 - Wait for DataSet Completion\nWait until the dataset is completed in Apify"
},
"typeVersion": 1
},
{
"id": "",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
1260,
-100
],
"parameters": {
"color": 7,
"width": 860,
"height": 460,
"content": "## 4- Filter Performing Videos\nRetrieve Dataset from Apify, calculate approximation of CTR and filter top performing videos"
},
"typeVersion": 1
},
{
"id": "",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
2140,
-340
],
"parameters": {
"color": 7,
"width": 1340,
"height": 500,
"content": "## 5- Generate Titles\nLLM analyze patterns of best performing titles and create a prompt based on it. Another LLM create 5 titles based on these criteria"
},
"typeVersion": 1
},
{
"id": "",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
2140,
180
],
"parameters": {
"color": 7,
"width": 1340,
"height": 760,
"content": "## 6- Generate Thumbnail\nLLM analyze patterns of best performing thumbnails and create a prompt based on it. Another LLM create 1 thumbnail based on these criteria"
},
"typeVersion": 1
},
{
"id": "",
"name": "Sticky Note9",
"type": "n8n-nodes-base.stickyNote",
"position": [
3500,
-100
],
"parameters": {
"color": 7,
"width": 520,
"height": 360,
"content": "## 7- Output\nReturn titles and thumbnail in a HTML Page"
},
"typeVersion": 1
},
{
"id": "",
"name": "Keep Top Performing Videos",
"type": "n8n-nodes-base.filter",
"position": [
1900,
20
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "",
"operator": {
"type": "number",
"operation": "gt"
},
"leftValue": "={{ $json.ctrPercent }}",
"rightValue": 0.1
}
]
}
},
"typeVersion": 2.2
},
{
"id": "",
"name": "Analyze Pattern & Create Prompt",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
2600,
-240
],
"parameters": {
"text": "=You are an expert in YouTube video title optimization. Here is your input : \n{{ $json.titles.join('\\n') }}",
"messages": {
"messageValues": [
{
"type": "HumanMessagePromptTemplate",
"message": "=You will be given a list of YouTube video titles that ranked highly for a specific keyword or topic. For information the topic of the video is : {{ $('Content Idea').first().json.query }}\nYour task is to: \n1. Analyze the title list for patterns, such as: \n- Repeating structures or formats (e.g., \u201cHow to\u2026\u201d, \u201cTop X\u2026\u201d, \u201cThis Changed Everything\u201d) \n- Use of numbers, brackets, capital letters, emotional hooks, urgency, etc. \n- Word combinations or topic angles (e.g., \u201cAI Automation for Creators\u201d vs. \u201cBuild AI Tools with No Code\u201d) \n2. Summarize what makes these titles effective (mandatory : be as precise as possible in 5-15 points). \n3. Based on your analysis, generate a prompt for another AI language model. This prompt will instruct the second model to generate new YouTube titles for the same keyword/topic, using the same high-performing structure, tone, and techniques. \n\n\u26a0\ufe0f Make sure the new prompt: \n- Clearly instructs the LLM to follow identified title patterns. - Tells it to generate clickable, short, high-performing YouTube titles. \n- Avoids common spammy phrasing or clickbait that doesn\u2019t match the original tone. \n\n\u2705 Format your response like this:\nPATTERN SUMMARY:\n- Point 1\n- Point 2\n- Point 3\n\nPROMPT:\n\"Create 5 YouTube video titles about [TOPIC] using the following format:\n- [Insert pattern or tone summary]\n- Each title should be under 60 characters, engaging, and based on the provided structure.\"\n\n\ud83d\udce5 Example Input (titles):\n- 5 AI Tools That Will Replace Your Job in 2025\n- The Best No-Code AI Tool You\u2019re Not Using Yet\n- I Built an AI Business with $0 (Full Tutorial)\n- How to Automate Everything with AI Agents\n- This Free AI Tool Blew My Mind\n\n\ud83e\udde0 Expected Output:\nPATTERN SUMMARY:\n- Uses emotional triggers like fear or curiosity (\u201cReplace Your Job\u201d, \u201cBlew My Mind\u201d)\n- Often includes numbers or power words (\u201c5 Tools\u201d, \u201cBest\u201d, \u201cFree\u201d)\n- Many titles promise results or value (\u201cFull Tutorial\u201d, \u201cAutomate Everything\u201d)\n\nPROMPT:\n\"Create 5 YouTube video titles about AI automation tools for solo creators using this format:\n- Include emotional or curiosity-based phrases\n- Use numbers or power words when relevant\n- Promise a clear value or benefit in the title\nEach title should be under 60 characters and match the tone of the top-ranking videos.\"\n"
}
]
},
"promptType": "define"
},
"typeVersion": 1.5
},
{
"id": "",
"name": "Wait4",
"type": "n8n-nodes-base.wait",
"position": [
2940,
280
],
"parameters": {},
"typeVersion": 1.1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "",
"connections": {
"If": {
"main": [
[
{
"node": "Get DataSet",
"type": "main",
"index": 0
}
],
[
{
"node": "Wait2",
"type": "main",
"index": 0
}
]
]
},
"Wait": {
"main": [
[
{
"node": "Create Titles",
"type": "main",
"index": 0
}
]
]
},
"Merge": {
"main": [
[
{
"node": "HTML",
"type": "main",
"index": 0
}
]
]
},
"Wait1": {
"main": [
[
{
"node": "YTB Search Scrape",
"type": "main",
"index": 0
}
]
]
},
"Wait2": {
"main": [
[
{
"node": "Check IF Finished",
"type": "main",
"index": 0
}
]
]
},
"Wait3": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Wait4": {
"main": [
[
{
"node": "Generate Image",
"type": "main",
"index": 0
}
]
]
},
"Merge Data": {
"main": [
[
{
"node": "Keep Top Performing Videos",
"type": "main",
"index": 0
}
]
]
},
"Get DataSet": {
"main": [
[
{
"node": "Calculate CTR",
"type": "main",
"index": 0
},
{
"node": "Merge Data",
"type": "main",
"index": 0
}
]
]
},
"Content Idea": {
"main": [
[
{
"node": "Create Keywords",
"type": "main",
"index": 0
}
]
]
},
"Analyze Image": {
"main": [
[
{
"node": "Wait3",
"type": "main",
"index": 0
}
]
]
},
"Calculate CTR": {
"main": [
[
{
"node": "Merge Data",
"type": "main",
"index": 1
}
]
]
},
"Create Prompt": {
"main": [
[
{
"node": "Wait4",
"type": "main",
"index": 0
}
]
]
},
"Create Titles": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"Generate Image": {
"main": [
[
{
"node": "Convert to Base64",
"type": "main",
"index": 0
}
]
]
},
"Create Keywords": {
"main": [
[
{
"node": "Wait1",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items": {
"main": [
[
{
"node": "Create List of Analysis",
"type": "main",
"index": 0
}
],
[
{
"node": "Analyze Image",
"type": "main",
"index": 0
}
]
]
},
"Check IF Finished": {
"main": [
[
{
"node": "If",
"type": "main",
"index": 0
}
]
]
},
"Convert to Base64": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"YTB Search Scrape": {
"main": [
[
{
"node": "Check IF Finished",
"type": "main",
"index": 0
}
]
]
},
"Create List of Titles": {
"main": [
[
{
"node": "Analyze Pattern & Create Prompt",
"type": "main",
"index": 0
}
]
]
},
"Create List of Analysis": {
"main": [
[
{
"node": "Create Prompt",
"type": "main",
"index": 0
}
]
]
},
"Mistral Cloud Chat Model": {
"ai_languageModel": [
[
{
"node": "Create Keywords",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "Create Keywords",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Mistral Cloud Chat Model1": {
"ai_languageModel": [
[
{
"node": "Analyze Pattern & Create Prompt",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Mistral Cloud Chat Model2": {
"ai_languageModel": [
[
{
"node": "Create Titles",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Mistral Cloud Chat Model3": {
"ai_languageModel": [
[
{
"node": "Create Prompt",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Structured Output Parser1": {
"ai_outputParser": [
[
{
"node": "Create Titles",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Keep Top Performing Videos": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
},
{
"node": "Create List of Titles",
"type": "main",
"index": 0
}
]
]
},
"Analyze Pattern & Create Prompt": {
"main": [
[
{
"node": "Wait",
"type": "main",
"index": 0
}
]
]
},
"When clicking \u2018Test workflow\u2019": {
"main": [
[
{
"node": "Content Idea",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
mistralCloudApiopenAiApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Content Creators Youtube Automation Marketing Team
Source: https://n8n.io/workflows/4504/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This n8n workflow automates the entire process of creating and publishing AI-generated videos, triggered by a simple message from a Telegram bot (YTAdmin). It transforms a text prompt into a structure
The best content automation template in the market is now even better—with “deep research” on time-sensitive topics\! Unlike most n8n content automation templates that are mainly for “demo purposes,”
My workflow 53. Uses formTrigger, httpRequest, lmChatOpenAi, form. Event-driven trigger; 74 nodes.
Episode 23: UGC with nanobanana. Uses lmChatOpenAi, lmChatOllama, lmChatDeepSeek, lmChatOpenRouter. Event-driven trigger; 74 nodes.
Automatically capture, categorize, and log expenses from receipts, PDFs, voice notes, or text — powered by AI and integrated with Telegram and Google Sheets.