AutomationFlowsAI & RAG › Generate Youtube SEO Content & Thumbnail From Video Scripts with Gpt-4o & Runway

Generate Youtube SEO Content & Thumbnail From Video Scripts with Gpt-4o & Runway

ByJanak Patel @dolphyai on n8n.io

This template is ideal for YouTube video creators who spend a lot of time manually generating SEO assets like descriptions, tags, titles, keywords, and thumbnails. If you're looking to automate your YouTube SEO workflow, this is the perfect solution for you.

Event trigger★★★★☆ complexityAI-powered19 nodesGoogle Sheets TriggerOpenAIGoogle SheetsHTTP Request
AI & RAG Trigger: Event Nodes: 19 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #6812 — we link there as the canonical source.

This workflow follows the Google Sheets → Googlesheetstrigger 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 →

Download .json
{
  "id": "D0sZR93pIfNqpzPN",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Youtube SEO Automation 1",
  "tags": [],
  "nodes": [
    {
      "id": "f268ec0d-7715-41bd-9e1a-7cc9285c5ec9",
      "name": "Google Sheets Trigger",
      "type": "n8n-nodes-base.googleSheetsTrigger",
      "position": [
        -2976,
        256
      ],
      "parameters": {
        "event": "rowAdded",
        "options": {},
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1BMtXN3Wl_pqyHJQW9KfRaErjPmg5wrm9kfIYcnuUVAM/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1BMtXN3Wl_pqyHJQW9KfRaErjPmg5wrm9kfIYcnuUVAM",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1BMtXN3Wl_pqyHJQW9KfRaErjPmg5wrm9kfIYcnuUVAM/edit?usp=drivesdk",
          "cachedResultName": "Youtube Automation"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "c27724ad-9f25-4e49-b9fb-2ca2bfa3e778",
      "name": "No Operation, do nothing",
      "type": "n8n-nodes-base.noOp",
      "position": [
        -2528,
        416
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "f92a73f2-3901-4576-b1e8-9836672a5977",
      "name": "If English script is available or not",
      "type": "n8n-nodes-base.if",
      "position": [
        -2768,
        256
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "9b712734-6cd3-43d3-911c-bca7ffa53263",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json['Roman Hindi Script'] }}",
              "rightValue": ""
            },
            {
              "id": "18425a22-c745-45af-a354-d4bf43a73103",
              "operator": {
                "type": "string",
                "operation": "empty",
                "singleValue": true
              },
              "leftValue": "={{ $json['English script'] }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "064a7b70-e5a9-4e9a-b7ac-50ad3e1a7840",
      "name": "Generating English Script",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        -2560,
        192
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o",
          "cachedResultName": "GPT-4O"
        },
        "options": {},
        "messages": {
          "values": [
            {
              "content": "={{ $json['Roman Hindi Script'] }}\n\nConvert this hindi roman script in to english script."
            }
          ]
        }
      },
      "typeVersion": 1.8
    },
    {
      "id": "12157d7c-4dae-4a06-be7b-23f39584d3c5",
      "name": "Creating field  for english script",
      "type": "n8n-nodes-base.set",
      "position": [
        -2208,
        192
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "9b4b3282-e472-4729-b52f-2ec7178063f3",
              "name": "message.content",
              "type": "string",
              "value": "={{ $json.message.content }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "bfc19dfc-5a3d-4235-a630-d12126afc3a7",
      "name": "Adding English script to GSheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -2000,
        192
      ],
      "parameters": {
        "columns": {
          "value": {
            "Number": "={{ $('Google Sheets Trigger').item.json.Number }}",
            "English script": "={{ $('Generating English Script').item.json.message.content }}",
            "Roman Hindi Script": "={{ $('Google Sheets Trigger').item.json['Roman Hindi Script'] }}"
          },
          "schema": [
            {
              "id": "Number",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Roman Hindi Script",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Roman Hindi Script",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "English script",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "English script",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Youtube Title",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Youtube Title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Youtube Tags",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Youtube Tags",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Youtube Keywords",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Youtube Keywords",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Youtube Description",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Youtube Description",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Youtube Thumbnail Brief",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Youtube Thumbnail Brief",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Youtube Thumbnail Tagline",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Youtube Thumbnail Tagline",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Youtube Generated Thumbnail",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Youtube Generated Thumbnail",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Number"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1BMtXN3Wl_pqyHJQW9KfRaErjPmg5wrm9kfIYcnuUVAM/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1BMtXN3Wl_pqyHJQW9KfRaErjPmg5wrm9kfIYcnuUVAM",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1BMtXN3Wl_pqyHJQW9KfRaErjPmg5wrm9kfIYcnuUVAM/edit?usp=drivesdk",
          "cachedResultName": "Youtube Automation"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "3342ff7b-5622-4aaf-8f8a-781285e027d9",
      "name": "Generating Youtube Tags, Keywords and more.",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        -1792,
        192
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "chatgpt-4o-latest",
          "cachedResultName": "CHATGPT-4O-LATEST"
        },
        "options": {},
        "messages": {
          "values": [
            {
              "content": "={{ $json['English script'] }}\n\nUse the provided English script and generate:\nGenerate the following:\n\n1\ufe0f\u20e3 10 Best Engaging YouTube Titles (\u2264 70 characters each)\n\n2\ufe0f\u20e3 Best Engaging YouTube Tags (comma-separated, up to 20)\n\n3\ufe0f\u20e3 Best Engaging YouTube Keywords (comma-separated, up to 20)\n\n4\ufe0f\u20e3 SEO-Friendly YouTube Video Description (optimized for 2025 algorithm, includes keywords, tags, hook, timestamps, engagement call-to-action, hashtags, and Google Search Keywords section)\n\n5\ufe0f\u20e3 Thumbnail AI Prompt (realistic, describes main idea, bold clickable text, color scheme, visual elements, emotion, layout, realistic photography style, 1280\u00d7720, 16:9, suitable for MidJourney/DALL\u00b7E/Runware)\n\n6\ufe0f\u20e3 Thumbnail Tagline (single catchy 3\u20135 word tagline)"
            }
          ]
        }
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.8
    },
    {
      "id": "a601a771-5858-43cf-aa6e-3c36e2a6033f",
      "name": "JS Code for separating different topics",
      "type": "n8n-nodes-base.code",
      "position": [
        -1328,
        192
      ],
      "parameters": {
        "jsCode": "const raw = $input.first().json.message.content;\n\n// Helper function to extract section between markers\nfunction extractSection(regex, input) {\n  const match = input.match(regex);\n  return match ? match[1].trim() : \"\";\n}\n\n// 1\ufe0f\u20e3 Titles\nlet titlesRaw = extractSection(/1\ufe0f\u20e3.*?\\n([\\s\\S]*?)2\ufe0f\u20e3/, raw);\nlet titles = titlesRaw\n  .split(/\\n|-/)\n  .map(t => t.replace(/^\\d+\\.?\\s*/, \"\").trim())\n  .filter(t => t.length > 0);\n\n// 2\ufe0f\u20e3 Tags\nlet tags = extractSection(/2\ufe0f\u20e3.*?\\n([\\s\\S]*?)3\ufe0f\u20e3/, raw).replace(/\\n/g, \"\").trim();\n\n// 3\ufe0f\u20e3 Keywords\nlet keywords = extractSection(/3\ufe0f\u20e3.*?\\n([\\s\\S]*?)4\ufe0f\u20e3/, raw).replace(/\\n/g, \"\").trim();\n\n// 4\ufe0f\u20e3 SEO Description\nlet description = extractSection(/4\ufe0f\u20e3.*?\\n([\\s\\S]*?)5\ufe0f\u20e3/, raw).trim();\n\n// 5\ufe0f\u20e3 Thumbnail AI Prompt\nlet thumbnailPrompt = extractSection(/5\ufe0f\u20e3.*?\\n([\\s\\S]*?)6\ufe0f\u20e3/, raw).trim();\n\n// 6\ufe0f\u20e3 Thumbnail Tagline\nlet tagline = extractSection(/6\ufe0f\u20e3.*?\\n([\\s\\S]*)$/, raw).replace(/[\"\\n]/g, \"\").trim();\n\nreturn [\n  {\n    json: {\n      \"YouTube Titles\": titles,\n      \"YouTube Tags\": tags,\n      \"YouTube Keywords\": keywords,\n      \"SEO Description\": description,\n      \"Thumbnail AI Prompt\": thumbnailPrompt,\n      \"Thumbnail Tagline\": tagline\n    }\n  }\n];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "e6ae98e2-2599-4006-ac63-40f43198812e",
      "name": "Updating row in GSheet with Tags, Description so on",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -1168,
        192
      ],
      "parameters": {
        "columns": {
          "value": {
            "Number": "={{ $('Google Sheets Trigger').item.json.Number }}",
            "Youtube Tags": "={{ $json['YouTube Tags'] }}",
            "Youtube Title": "={{ $json['YouTube Titles'] }}",
            "Youtube Keywords": "={{ $json['YouTube Keywords'] }}",
            "Youtube Description": "={{ $json['SEO Description'] }}",
            "Youtube Thumbnail Brief": "={{ $json['Thumbnail AI Prompt'] }}",
            "Youtube Thumbnail Tagline": "={{ $json['Thumbnail Tagline'] }}"
          },
          "schema": [
            {
              "id": "Number",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Roman Hindi Script",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Roman Hindi Script",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "English script",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "English script",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Youtube Title",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Youtube Title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Youtube Tags",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Youtube Tags",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Youtube Keywords",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Youtube Keywords",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Youtube Description",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Youtube Description",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Youtube Thumbnail Brief",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Youtube Thumbnail Brief",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Youtube Thumbnail Tagline",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Youtube Thumbnail Tagline",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Youtube Generated Thumbnail",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Youtube Generated Thumbnail",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Number"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1BMtXN3Wl_pqyHJQW9KfRaErjPmg5wrm9kfIYcnuUVAM/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1BMtXN3Wl_pqyHJQW9KfRaErjPmg5wrm9kfIYcnuUVAM",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1BMtXN3Wl_pqyHJQW9KfRaErjPmg5wrm9kfIYcnuUVAM/edit?usp=drivesdk",
          "cachedResultName": "Youtube Automation"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "f0a5ba4b-4dba-4acc-bc80-1e66f6181e32",
      "name": "Python code for creating Dynamic Prompt",
      "type": "n8n-nodes-base.code",
      "position": [
        -704,
        320
      ],
      "parameters": {
        "language": "python",
        "pythonCode": "import uuid\n\nthumbnail_brief = items[0][\"json\"].get(\"Youtube Thumbnail Brief\", \"\")\ntagline = items[0][\"json\"].get(\"Youtube Thumbnail Tagline\", \"\")\n\n# Final prompt for Runware AI\nprompt = (\n    \"Generate a professional YouTube thumbnail.\\n\\n\"\n    f\"Thumbnail Context:\\n{thumbnail_brief}\\n\\n\"\n    f\"Main Tagline: '{tagline}'\\n\\n\"\n    \"Thumbnail requirements:\\n\"\n    \"- Bold, central tagline text\\n\"\n    \"- Cinematic lighting, vibrant colors\\n\"\n    \"- Highly clickable YouTube style\\n\"\n    \"- 1280x720 resolution\"\n)\n\npayload = {\n    \"taskType\": \"imageInference\",\n    \"taskUUID\": str(uuid.uuid4()),\n    \"positivePrompt\": prompt,\n    \"width\": 1280,\n    \"height\": 720,\n    \"model\": \"bytedance:3@1\",\n    \"numberResults\": 1,\n    \"outputFileName\": \"thumbnail.png\"\n}\n\nreturn {\"data\": [payload]}\n"
      },
      "typeVersion": 2
    },
    {
      "id": "4478f8d0-f766-42e9-9d8b-f9183539ab23",
      "name": "HTTP Request calling  Runware API for generating Thumbnail image",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -416,
        -16
      ],
      "parameters": {
        "url": "https://api.runware.ai/v1/image",
        "method": "POST",
        "options": {},
        "jsonBody": "={{ $json.data }}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "3e233517-bbca-420e-a081-6ce8ca14a77a",
      "name": "Updating Gsheet with Thumbnail Image",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -240,
        -16
      ],
      "parameters": {
        "columns": {
          "value": {
            "Number": "={{ $('Google Sheets Trigger').item.json.Number }}",
            "Youtube Generated Thumbnail": "={{ $json.data[0].imageURL }}"
          },
          "schema": [
            {
              "id": "Number",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Roman Hindi Script",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Roman Hindi Script",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "English script",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "English script",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Youtube Title",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Youtube Title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Youtube Tags",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Youtube Tags",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Youtube Keywords",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Youtube Keywords",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Youtube Description",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Youtube Description",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Youtube Thumbnail Brief",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Youtube Thumbnail Brief",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Youtube Thumbnail Tagline",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Youtube Thumbnail Tagline",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Youtube Generated Thumbnail",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Youtube Generated Thumbnail",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Number"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1BMtXN3Wl_pqyHJQW9KfRaErjPmg5wrm9kfIYcnuUVAM/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1BMtXN3Wl_pqyHJQW9KfRaErjPmg5wrm9kfIYcnuUVAM",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1BMtXN3Wl_pqyHJQW9KfRaErjPmg5wrm9kfIYcnuUVAM/edit?usp=drivesdk",
          "cachedResultName": "Youtube Automation"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "fc5309f3-e498-4dd4-9e17-e89438661df0",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3072,
        448
      ],
      "parameters": {
        "height": 224,
        "content": "## Step-by-Step Tutorial YouTube Video  \n\n## [Follow Video- Click here](https://youtu.be/R426d84slWY?si=Ecozf55ypxg6PnQz)"
      },
      "typeVersion": 1
    },
    {
      "id": "4ebd0064-f716-4fc0-9c87-d5d4a3590b0f",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1840,
        -544
      ],
      "parameters": {
        "width": 352,
        "height": 672,
        "content": "## Prompt for Generating YouTue Tags, Description so on..\n\n{{ $json['English script'] }}\n\nUse the provided English script and generate:\nGenerate the following:\n\n1\ufe0f\u20e3 10 Best Engaging YouTube Titles (\u2264 70 characters each)\n\n2\ufe0f\u20e3 Best Engaging YouTube Tags (comma-separated, up to 20)\n\n3\ufe0f\u20e3 Best Engaging YouTube Keywords (comma-separated, up to 20)\n\n4\ufe0f\u20e3 SEO-Friendly YouTube Video Description (optimized for 2025 algorithm, includes keywords, tags, hook, timestamps, engagement call-to-action, hashtags, and Google Search Keywords section)\n\n5\ufe0f\u20e3 Thumbnail AI Prompt (realistic, describes main idea, bold clickable text, color scheme, visual elements, emotion, layout, realistic photography style, 1280\u00d7720, 16:9, suitable for MidJourney/DALL\u00b7E/Runware)\n\n6\ufe0f\u20e3 Thumbnail Tagline (single catchy 3\u20135 word tagline)"
      },
      "typeVersion": 1
    },
    {
      "id": "287cad96-b7b8-4f90-a2f9-eab7672a1b9d",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1408,
        -544
      ],
      "parameters": {
        "width": 448,
        "height": 672,
        "content": "## Javascript code for separating the data\n\nconst raw = $input.first().json.message.content;\n\n// Helper function to extract section between markers\nfunction extractSection(regex, input) {\n  const match = input.match(regex);\n  return match ? match[1].trim() : \"\";\n}\n\n// 1\ufe0f\u20e3 Titles\nlet titlesRaw = extractSection(/1\ufe0f\u20e3.*?\\n([\\s\\S]*?)2\ufe0f\u20e3/, raw);\nlet titles = titlesRaw\n  .split(/\\n|-/)\n  .map(t => t.replace(/^\\d+\\.?\\s*/, \"\").trim())\n  .filter(t => t.length > 0);\n\n// 2\ufe0f\u20e3 Tags\nlet tags = extractSection(/2\ufe0f\u20e3.*?\\n([\\s\\S]*?)3\ufe0f\u20e3/, raw).replace(/\\n/g, \"\").trim();\n\n// 3\ufe0f\u20e3 Keywords\nlet keywords = extractSection(/3\ufe0f\u20e3.*?\\n([\\s\\S]*?)4\ufe0f\u20e3/, raw).replace(/\\n/g, \"\").trim();\n\n// 4\ufe0f\u20e3 SEO Description\nlet description = extractSection(/4\ufe0f\u20e3.*?\\n([\\s\\S]*?)5\ufe0f\u20e3/, raw).trim();\n\n// 5\ufe0f\u20e3 Thumbnail AI Prompt\nlet thumbnailPrompt = extractSection(/5\ufe0f\u20e3.*?\\n([\\s\\S]*?)6\ufe0f\u20e3/, raw).trim();\n\n// 6\ufe0f\u20e3 Thumbnail Tagline\nlet tagline = extractSection(/6\ufe0f\u20e3.*?\\n([\\s\\S]*)$/, raw).replace(/[\"\\n]/g, \"\").trim();\n\nreturn [\n  {\n    json: {\n      \"YouTube Titles\": titles,\n      \"YouTube Tags\": tags,\n      \"YouTube Keywords\": keywords,\n      \"SEO Description\": description,\n      \"Thumbnail AI Prompt\": thumbnailPrompt,\n      \"Thumbnail Tagline\": tagline\n    }\n  }\n];\n"
      },
      "typeVersion": 1
    },
    {
      "id": "8ac19d3d-486e-4772-8871-64e0246b4ca5",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -832,
        528
      ],
      "parameters": {
        "width": 464,
        "height": 672,
        "content": "## Python code for generating dynamic prompt\n\nimport uuid\n\nthumbnail_brief = items[0][\"json\"].get(\"Youtube Thumbnail Brief\", \"\")\ntagline = items[0][\"json\"].get(\"Youtube Thumbnail Tagline\", \"\")\n\nprompt = (\n    \"Generate a professional YouTube thumbnail.\\n\\n\"\n    f\"Thumbnail Context:\\n{thumbnail_brief}\\n\\n\"\n    f\"Main Tagline: '{tagline}'\\n\\n\"\n    \"Thumbnail requirements:\\n\"\n    \"- Bold, central tagline text\\n\"\n    \"- Cinematic lighting, vibrant colors\\n\"\n    \"- Highly clickable YouTube style\\n\"\n    \"- 1280x720 resolution\"\n)\n\npayload = {\n    \"taskType\": \"imageInference\",\n    \"taskUUID\": str(uuid.uuid4()),\n    \"positivePrompt\": prompt,\n    \"width\": 1280,\n    \"height\": 720,\n    \"model\": \"bytedance:3@1\",\n    \"numberResults\": 1,\n    \"outputFileName\": \"thumbnail.png\"\n}\n\nreturn {\"data\": [payload]}"
      },
      "typeVersion": 1
    },
    {
      "id": "a67690da-e029-4458-a2c4-ff72ff6b94ca",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2560,
        80
      ],
      "parameters": {
        "height": 96,
        "content": "## Add your OpenAI Keys\n"
      },
      "typeVersion": 1
    },
    {
      "id": "caec88cf-9d1a-4f52-bc18-bc2b5281d976",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3008,
        112
      ],
      "parameters": {
        "width": 176,
        "height": 112,
        "content": "## Connect with your Google Sheet\n"
      },
      "typeVersion": 1
    },
    {
      "id": "5ac6a066-7d50-46b2-84ec-8529b9878cb5",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -400,
        -192
      ],
      "parameters": {
        "height": 144,
        "content": "## Add your RUNWARE API or any other 3rd party"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "eed95939-cf9f-4852-8ecb-997cf777c3c0",
  "connections": {
    "Google Sheets Trigger": {
      "main": [
        [
          {
            "node": "If English script is available or not",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generating English Script": {
      "main": [
        [
          {
            "node": "Creating field  for english script",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Adding English script to GSheet": {
      "main": [
        [
          {
            "node": "Generating Youtube Tags, Keywords and more.",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Creating field  for english script": {
      "main": [
        [
          {
            "node": "Adding English script to GSheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If English script is available or not": {
      "main": [
        [
          {
            "node": "Generating English Script",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "No Operation, do nothing",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "JS Code for separating different topics": {
      "main": [
        [
          {
            "node": "Updating row in GSheet with Tags, Description so on",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Python code for creating Dynamic Prompt": {
      "main": [
        [
          {
            "node": "HTTP Request calling  Runware API for generating Thumbnail image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generating Youtube Tags, Keywords and more.": {
      "main": [
        [
          {
            "node": "JS Code for separating different topics",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Updating row in GSheet with Tags, Description so on": {
      "main": [
        [
          {
            "node": "Python code for creating Dynamic Prompt",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request calling  Runware API for generating Thumbnail image": {
      "main": [
        [
          {
            "node": "Updating Gsheet with Thumbnail Image",
            "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.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This template is ideal for YouTube video creators who spend a lot of time manually generating SEO assets like descriptions, tags, titles, keywords, and thumbnails. If you're looking to automate your YouTube SEO workflow, this is the perfect solution for you.

Source: https://n8n.io/workflows/6812/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

Note: Now includes an Apify alternative for Rapid API (Some users can't create new accounts on Rapid API, so I have added an alternative for you. But immediately you are able to get access to Rapid AP

Form Trigger, Google Sheets Trigger, OpenAI +2
AI & RAG

This system automates LinkedIn lead generation and enrichment in six clear stages: Lead Collection (via Apollo.io) Automatically pulls leads based on keywords, roles, or industries using Apollo’s API.

Form Trigger, OpenAI, Google Sheets Trigger +2
AI & RAG

This n8n workflow automates the process of retrieving products from Printify, generating optimized product titles and descriptions, and updating them back to the platform. It leverages OpenAI for cont

HTTP Request, Tool Calculator, Tool Wikipedia +3
AI & RAG

This workflow is designed for content creators, marketers, and automation enthusiasts who want to produce professional AI-generated videos and publish them automatically on social media — without edit

OpenAI, HTTP Request, Google Drive +3
AI & RAG

Consultants, agencies, freelancers, and professional service firms who need to create customized proposals and contracts quickly and efficiently.

Google Sheets Trigger, OpenAI, Google Docs +5