This workflow corresponds to n8n.io template #11617 — we link there as the canonical source.
This workflow follows the Agent → Google Drive 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": "CuCtsuECkQ1SRUFe",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "YouTube Shorts VEO Automation",
"tags": [],
"nodes": [
{
"id": "057eacc9-2afb-450a-88ea-3b47faaef11b",
"name": "Generate a video1",
"type": "@n8n/n8n-nodes-langchain.googleGemini",
"position": [
1744,
1568
],
"parameters": {
"prompt": "={{ $('AI Agent').item.json.output.items[0].prompt1 }}",
"modelId": {
"__rl": true,
"mode": "list",
"value": "models/veo-3.1-fast-generate-preview",
"cachedResultName": "models/veo-3.1-fast-generate-preview"
},
"options": {
"aspectRatio": "9:16"
},
"resource": "video"
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "57d4438a-1ea6-4c6f-9eeb-4defabd857ad",
"name": "Telegram Trigger",
"type": "n8n-nodes-base.telegramTrigger",
"position": [
272,
1904
],
"parameters": {
"updates": [
"message"
],
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "8140ce5e-4aa1-4105-a0a9-79407f09c89c",
"name": "Generate a video2",
"type": "@n8n/n8n-nodes-langchain.googleGemini",
"position": [
1744,
1952
],
"parameters": {
"prompt": "={{ $('AI Agent').item.json.output.items[0].prompt2 }}",
"modelId": {
"__rl": true,
"mode": "list",
"value": "models/veo-3.1-fast-generate-preview",
"cachedResultName": "models/veo-3.1-fast-generate-preview"
},
"options": {
"aspectRatio": "9:16"
},
"resource": "video"
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "edf176d7-e6cd-4a76-a237-c9add4a006c8",
"name": "Upload video1",
"type": "n8n-nodes-base.googleDrive",
"position": [
1968,
1568
],
"parameters": {
"name": "={{$now.format('yyyyLLdd')}}{{ $json.fileName }}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "1VkLZo09_BmiR1z_OHsh27hwFVH6-voiZ",
"cachedResultUrl": "https://drive.google.com/drive/folders/1VkLZo09_BmiR1z_OHsh27hwFVH6-voiZ",
"cachedResultName": "VEO VIDEOS"
}
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "b2e5a98b-0959-4610-ba4b-3000dbc883b8",
"name": "Label URL 1",
"type": "n8n-nodes-base.set",
"position": [
2192,
1568
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "id-1",
"name": "prompt(1)",
"type": "string",
"value": "={{ $json.webContentLink }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "af3f7a6d-550b-4cb8-82c6-2322e5b90402",
"name": "Label URL 2",
"type": "n8n-nodes-base.set",
"position": [
2192,
1952
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "id-1",
"name": "Prompt(2)",
"type": "string",
"value": "={{ $json.webContentLink }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "e4ec1103-4841-48a3-b1d7-73745c06cc16",
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
2416,
2272
],
"parameters": {
"mode": "combine",
"options": {},
"combineBy": "combineByPosition",
"numberInputs": 4
},
"typeVersion": 3.2
},
{
"id": "758d3bc7-bfd5-4e05-b914-76b22309383a",
"name": "Generate a video3",
"type": "@n8n/n8n-nodes-langchain.googleGemini",
"position": [
1744,
2336
],
"parameters": {
"prompt": "={{ $('AI Agent').item.json.output.items[0].prompt3 }}",
"modelId": {
"__rl": true,
"mode": "list",
"value": "models/veo-3.1-fast-generate-preview",
"cachedResultName": "models/veo-3.1-fast-generate-preview"
},
"options": {
"aspectRatio": "9:16"
},
"resource": "video"
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "16b3777b-c547-4e58-8baf-d47efe80cdfa",
"name": "Label URL 3",
"type": "n8n-nodes-base.set",
"position": [
2192,
2336
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "id-1",
"name": "Prompt(3)",
"type": "string",
"value": "={{ $json.webContentLink }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "1b927ddc-1b55-403c-af23-8d3ba89a8eb8",
"name": "Upload video4",
"type": "n8n-nodes-base.googleDrive",
"position": [
1968,
2720
],
"parameters": {
"name": "={{$now.format('yyyyLLdd')}}{{ $json.fileName }}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "1VkLZo09_BmiR1z_OHsh27hwFVH6-voiZ",
"cachedResultUrl": "https://drive.google.com/drive/folders/1VkLZo09_BmiR1z_OHsh27hwFVH6-voiZ",
"cachedResultName": "VEO VIDEOS"
}
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "63bd0aa4-d328-4844-ba04-af224473a84c",
"name": "Label URL 4",
"type": "n8n-nodes-base.set",
"position": [
2192,
2720
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "id-1",
"name": "Prompt(4)",
"type": "string",
"value": "={{ $json.webContentLink }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "565b9274-b7bb-49b8-bdf0-dc28285916ca",
"name": "Generate a video4",
"type": "@n8n/n8n-nodes-langchain.googleGemini",
"position": [
1744,
2720
],
"parameters": {
"prompt": "={{ $('AI Agent').item.json.output.items[0].prompt4 }}",
"modelId": {
"__rl": true,
"mode": "list",
"value": "models/veo-3.1-fast-generate-preview",
"cachedResultName": "models/veo-3.1-fast-generate-preview"
},
"options": {
"aspectRatio": "9:16"
},
"resource": "video"
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "ebc8d05f-42f1-4473-afb1-fd5fb75b0ea3",
"name": "Upload video",
"type": "n8n-nodes-base.googleDrive",
"position": [
1968,
1952
],
"parameters": {
"name": "={{$now.format('yyyyLLdd')}}{{ $json.fileName }}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "1VkLZo09_BmiR1z_OHsh27hwFVH6-voiZ",
"cachedResultUrl": "https://drive.google.com/drive/folders/1VkLZo09_BmiR1z_OHsh27hwFVH6-voiZ",
"cachedResultName": "VEO VIDEOS"
}
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "44565cb1-e431-4ca8-bd24-405250698f3d",
"name": "Upload video3",
"type": "n8n-nodes-base.googleDrive",
"position": [
1968,
2336
],
"parameters": {
"name": "={{$now.format('yyyyLLdd')}}{{ $json.fileName }}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "1VkLZo09_BmiR1z_OHsh27hwFVH6-voiZ",
"cachedResultUrl": "https://drive.google.com/drive/folders/1VkLZo09_BmiR1z_OHsh27hwFVH6-voiZ",
"cachedResultName": "VEO VIDEOS"
}
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "cb3a6dfe-1e4b-4cfc-b5fe-a32bb4013414",
"name": "Wait5",
"type": "n8n-nodes-base.wait",
"position": [
1520,
2336
],
"parameters": {
"unit": "minutes",
"amount": 1.5
},
"typeVersion": 1.1
},
{
"id": "8f90bccb-4e23-4680-a5d3-8ff2ff8790f8",
"name": "Send a text message",
"type": "n8n-nodes-base.telegram",
"position": [
1968,
1376
],
"parameters": {
"text": "Video 1/4 generated",
"chatId": "={{ $('Telegram Trigger').item.json.message.chat.id }}",
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "ad9e632f-8288-4f5d-8000-dac576aafda2",
"name": "Send a text message2",
"type": "n8n-nodes-base.telegram",
"position": [
1968,
1760
],
"parameters": {
"text": "Video 2/4 generated",
"chatId": "={{ $('Telegram Trigger').item.json.message.chat.id }}",
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "a66953cd-0233-4d68-af0d-da9feaef2753",
"name": "Send a text message3",
"type": "n8n-nodes-base.telegram",
"position": [
1968,
2144
],
"parameters": {
"text": "Video 3/4 generated",
"chatId": "={{ $('Telegram Trigger').item.json.message.chat.id }}",
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "8028f1f9-29f9-41c1-a2d3-d1a6af73fb9b",
"name": "Send a text message4",
"type": "n8n-nodes-base.telegram",
"position": [
1968,
2528
],
"parameters": {
"text": "Video 4/4 generated",
"chatId": "={{ $('Telegram Trigger').item.json.message.chat.id }}",
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "e1b7843f-c221-4076-b31d-57e5ebc085a7",
"name": "Send a text message8",
"type": "n8n-nodes-base.telegram",
"position": [
784,
1760
],
"parameters": {
"text": "=Hey {{ $json.message.from.first_name }}! Your Request Is being processed. WARNING: DO not send an aditional message until full video is recived as it will interupt the process.",
"chatId": "={{ $('Telegram Trigger').item.json.message.chat.id }}",
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "0a834dba-4cb9-41ec-baf3-c09b0abf9527",
"name": "AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
720,
2048
],
"parameters": {
"text": "=TASK: You are an AI agent who prompts VEO 3, an AI video generation model that can generate 8 second clips. Your task is to create 4 independent prompts that will be ran independently from each other with the model having 0 context from previous executions. \n\nThe goal is to generate 4 different videos that link together sharing the same elements so to do this, you have to restate and use element descriptions in each prompt independently, THIS IS VERY IMPORTANT. If you describe a character as \"Tall and skinny\" you must use \"Tall and skinny\" to describe the character in each video in which the character appears. This is true for all elements of the video. Do not give characters names unless specified. \n\nOnly include music is prompted, otherwise you will generate dialogue and scenes, settings and characters based off of the request, have a script to follow and then creating ech prompt. GO in depth and use very descriptive words to describe tone, sound effects, ambience, settings and characters. \n\nEnsure each prompt can create a video that flows correctly from 1 8 second clip to the next.\n\nWHEN SCRIPTING Dialogue, ensure you only include 16-20 words (based off length) in each video.\n\nFor example what to do in prompts:\n\nPrompt 1: A blond haired blue eyed, 6 foot individual with a basic tapered haircut dressed in a blue polo shirt saying \"structure properties\" wearing brown khaki pants says \"Hello this is a training video on how to deal with mold in apartments\" The character is alone standing in a plain office building with no windows, standing in front of a 50\" flatscreen TV. \n\nPrompt 2:\nA blond haired blue eyed, 6 foot individual with a basic tapered haircut dressed in a blue polo shirt saying \"structure properties\" wearing brown khaki pants says \"In this video we will be going over proper mold handling procedures, operation costs and what not to do\" The character is alone standing in a plain office building with no windows, standing in front of a 50\" flatscreen TV. \n\nWHAT NOT TO DO:\nPrompt 1: A blond haired blue eyed, 6 foot individual with a basic tapered haircut dressed in a blue polo shirt saying \"structure properties\" wearing brown khaki pants says \"Hello this is a training video on how to deal with mold in apartments\" The character is alone standing in a plain office building with no windows, standing in front of a 50\" flatscreen TV. \n\nPrompt 2: The structure properties traine says \"In this video we will be going over proper mold handling procedures, operation costs and what not to do\" Addressing the office.\n\nAs you can see, you need to keep descriptions the exact same in each prompt to ensure continuity.\nThis is what you need to include in the script:\nIdentify characters, lablesing them with \"character 1\", \"Character 2\" ect and the listing out their desccritptions in depth as possible using 5-10 describing words to narrow down appearance. Same with settings, labling settings with values and providing in depth describing words. Also draft a tone for the videos/video and list them as tone 1 2 ect. Once this is established draft what will be included for each video including the words that will be said in each video not exceeding 16-20 words max. Additionally, create a video description (5-10 words) that captures the essence of the video content in an engaging way, and generate 4 relevant hashtags (formatted as #hashtag) that would help the video reach the right audience. Additionally, create a clickbait-style title (5-10 words) optimized for YouTube Shorts that grabs attention and encourages clicks. Include this in the JSON with the key \"title\".\n\nYou must respond in valid JSON format provided below:\n\n{\n\t\"items\": [\n\t\t{\n\t\t\t\"script\": \"Example script text\",\n\t\t\t\"prompt1\": \"First prompt\",\n\t\t\t\"prompt2\": \"Second prompt\",\n\t\t\t\"prompt3\": \"Third prompt\",\n\t\t\t\"prompt4\": \"Fourth prompt\",\n\t\t\t\"hashtags\": \"#example #video #content #ai\",\n\t\t\t\"description\": \"Short engaging video description\",\n\t\t\t\"title\": \"Clickbait YouTube Shorts Title\"\n\t\t}\n\t]\n}\n\nBase video prompt after request below, following it as close as possible, only expanding on desriibing elements, ENSURING TO KEEP ELEMENT DESCRIPTIONS INDEPENDENTLY IN ALL PROMPTS:\n\n{{ $json.message.text }}\n\nAdditionally, create a video description (5-10 words) that captures the essence of the video content in an engaging way, and generate 4 relevant hashtags (formatted as #hashtag) that would help the video reach the right audience. You must respond in valid JSON format with hashtags as one combined string and description as a separate field.\n\nYOUR OUTPUT IS GOING TO BE PARSED AND WONT BE ACCEPTED IF YOU DONT REPLY IN THIS FORMAT:\n\n{\n\t\"items\": [\n\t\t{\n\t\t\t\"script\": \"Example script text\",\n\t\t\t\"prompt1\": \"First prompt\",\n\t\t\t\"prompt2\": \"Second prompt\",\n\t\t\t\"prompt3\": \"Third prompt\",\n\t\t\t\"prompt4\": \"Fourth prompt\",\n\t\t\t\"hashtags\": \"#example #video #content #ai\",\n\t\t\t\"description\": \"Short engaging video description\",\n\t\t\t\"title\": \"Clickbait YouTube Shorts Title\"\n\t\t}\n\t]\n}\n\n\nALWAYS ENSURE TO GIVE GENDER TO CHARACTERS SO THAT GENERATION REMAINS CONSISTENT",
"options": {},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 3
},
{
"id": "d59988a2-43d8-43cf-bc82-e45dc9cb7363",
"name": "Structured Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
864,
2272
],
"parameters": {
"jsonSchemaExample": "{\n\t\"items\": [\n\t\t{\n\t\t\t\"script\": \"Example script text\",\n\t\t\t\"prompt1\": \"First prompt\",\n\t\t\t\"prompt2\": \"Second prompt\",\n\t\t\t\"prompt3\": \"Third prompt\",\n\t\t\t\"prompt4\": \"Fourth prompt\",\n\t\t\t\"hashtags\": \"#example #video #content #ai\",\n\t\t\t\"description\": \"Short engaging video description\",\n\t\t\t\"title\": \"Clickbait YouTube Shorts Title\"\n\t\t}\n\t]\n}"
},
"typeVersion": 1.3
},
{
"id": "1b214506-c88b-4c1b-b66d-a0caabe1e0b7",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
736,
2272
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-5.1",
"cachedResultName": "gpt-5.1"
},
"options": {
"timeout": 3600000
},
"builtInTools": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "a5ab25f7-487d-4e85-8719-a4374f002fa5",
"name": "If1",
"type": "n8n-nodes-base.if",
"position": [
1296,
2048
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "or",
"conditions": [
{
"id": "52c07df7-85c6-431d-9621-f01c8fa7dec3",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.data.text }}",
"rightValue": "Confirm"
},
{
"id": "03982650-b3e0-4b4e-95b9-d8f6efeb6ff3",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.data.text }}",
"rightValue": "CONFIRM"
},
{
"id": "32cc36ad-771d-489a-a3f9-d20c86b7243f",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.data.text }}",
"rightValue": "confrim"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "59ae3aab-272c-4d70-a5df-4a73f2473de6",
"name": "Send message and wait for response",
"type": "n8n-nodes-base.telegram",
"position": [
1072,
2048
],
"parameters": {
"chatId": "={{ $('Telegram Trigger').item.json.message.chat.id }}",
"message": "=HERE IS VIDEO SCRIPT:\n {{ $json.output.items[0].script }}\n\nRespond \"CONFIRM\" to proceed to video generation.",
"options": {},
"operation": "sendAndWait",
"responseType": "freeText"
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "851d78df-1ea7-4da4-944f-49b3beb2fd34",
"name": "HTTP Request",
"type": "n8n-nodes-base.httpRequest",
"position": [
2640,
2304
],
"parameters": {
"url": "https://queue.fal.run/fal-ai/ffmpeg-api/merge-videos",
"method": "POST",
"options": {},
"jsonBody": "={\n \"video_urls\": [\n \"{{ $json[\"prompt(1)\"] }}\",\n \"{{ $json[\"Prompt(2)\"] }}\",\n \"{{ $json['Prompt(3)'] }}\",\n \"{{ $json['Prompt(4)'] }}\"\n ],\n \"resolution\": \"portrait_16_9\",\n \"target_fps\": 30\n}\n",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Key 70e05c85-dd80-40bd-bdad-acf3e8827834:73f389958218f247a914de9ae84afd9a"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.3
},
{
"id": "0bd8d217-156a-493b-88ee-c05069984b3e",
"name": "HTTP Request1",
"type": "n8n-nodes-base.httpRequest",
"position": [
2864,
2304
],
"parameters": {
"url": "={{ $json.status_url }}",
"options": {},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Key 70e05c85-dd80-40bd-bdad-acf3e8827834:73f389958218f247a914de9ae84afd9a"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.3
},
{
"id": "eed55f48-292e-4982-8c4e-60c64464dfb2",
"name": "If",
"type": "n8n-nodes-base.if",
"position": [
3088,
2224
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "9ce4b8dc-9680-4de3-bbf3-2109f3be846a",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.status }}",
"rightValue": "COMPLETED"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "ac346b7a-5958-49ec-9949-111ea3da6f4c",
"name": "HTTP Request2",
"type": "n8n-nodes-base.httpRequest",
"position": [
3312,
2176
],
"parameters": {
"url": "={{ $json.response_url }}",
"options": {},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Key 70e05c85-dd80-40bd-bdad-acf3e8827834:73f389958218f247a914de9ae84afd9a"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.3
},
{
"id": "19776e41-7402-45c4-a733-0ebed0d4c2a4",
"name": "Wait",
"type": "n8n-nodes-base.wait",
"position": [
3312,
2400
],
"parameters": {
"amount": 30
},
"typeVersion": 1.1
},
{
"id": "4a40d04f-cd58-41de-a749-24ede6b6433f",
"name": "If2",
"type": "n8n-nodes-base.if",
"position": [
496,
1904
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "5f3f893b-53de-4a9a-8373-30f4c90b2bce",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.message.text }}",
"rightValue": "/start"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "1205295a-eeab-4936-a93c-dc84d696647f",
"name": "Send a video",
"type": "n8n-nodes-base.telegram",
"position": [
4208,
2176
],
"parameters": {
"file": "={{ $json[\"Finished_Video\"] }}",
"chatId": "={{ $('Telegram Trigger').item.json.message.chat.id }}",
"operation": "sendVideo",
"additionalFields": {
"caption": "={{ $('AI Agent').item.json.output.items[0].description }}\n{{ $('AI Agent').item.json.output.items[0].hashtags }}"
}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "59afca5f-c936-4b7f-924e-cb9d34506208",
"name": "Send message and wait for response1",
"type": "n8n-nodes-base.telegram",
"position": [
4432,
2176
],
"parameters": {
"chatId": "={{ $('Telegram Trigger').item.json.message.chat.id }}",
"message": "=The video sends distorted but will post fine, telegram makes video fit a certain ratio, \n\nWould you like to post the video to your socials? Respond \"POST\" if so.\n",
"options": {},
"operation": "sendAndWait",
"responseType": "freeText"
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "894db2c5-7cf8-40bf-bfdc-231931c81b11",
"name": "If3",
"type": "n8n-nodes-base.if",
"position": [
4656,
2176
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "or",
"conditions": [
{
"id": "52c07df7-85c6-431d-9621-f01c8fa7dec3",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.data.text }}",
"rightValue": "POST"
},
{
"id": "03982650-b3e0-4b4e-95b9-d8f6efeb6ff3",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.data.text }}",
"rightValue": "post"
},
{
"id": "32cc36ad-771d-489a-a3f9-d20c86b7243f",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.data.text }}",
"rightValue": "Post"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "a0d60bc0-3ac9-4514-b278-1b24acd706c5",
"name": "Upload a video",
"type": "n8n-nodes-base.youTube",
"disabled": true,
"position": [
5104,
2176
],
"parameters": {
"title": "={{ $('AI Agent').item.json.output.items[0].title } #shorts",
"options": {
"description": "={{ $('AI Agent').item.json.output.items[0].description }} #shorts {{ $('AI Agent').item.json.output.items[0].hashtags }}"
},
"resource": "video",
"operation": "upload",
"regionCode": "US"
},
"typeVersion": 1
},
{
"id": "b13fcee6-4ff0-4cef-a600-a76447ea4fe1",
"name": "Upload video2",
"type": "n8n-nodes-base.googleDrive",
"position": [
3760,
2176
],
"parameters": {
"name": "={{$now.format('yyyyLLdd')}}{{ $json.fileName }}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "1VkLZo09_BmiR1z_OHsh27hwFVH6-voiZ",
"cachedResultUrl": "https://drive.google.com/drive/folders/1VkLZo09_BmiR1z_OHsh27hwFVH6-voiZ",
"cachedResultName": "VEO VIDEOS"
}
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "de0389a4-98d2-49e2-9436-55362e76fac4",
"name": "Download a video",
"type": "@n8n/n8n-nodes-langchain.googleGemini",
"position": [
3536,
2176
],
"parameters": {
"url": "={{ $json.video.url }}",
"options": {},
"resource": "video",
"operation": "download"
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "b45be85a-7fb3-463a-8ae0-5a0aabcbcfab",
"name": "Label URL ",
"type": "n8n-nodes-base.set",
"position": [
3984,
2176
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "id-1",
"name": "Finished_Video",
"type": "string",
"value": "={{ $json.webContentLink }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "7e5597f4-8a05-4306-9def-8bb1ca374e4b",
"name": "Download a video1",
"type": "@n8n/n8n-nodes-langchain.googleGemini",
"position": [
4880,
2176
],
"parameters": {
"url": "={{ $('Label URL ').item.json.Finished_Video }}",
"options": {},
"resource": "video",
"operation": "download"
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "9c50f63d-6802-4433-9af5-666891662e2a",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
2192,
1344
],
"parameters": {
"color": 7,
"content": "## Drive\nThe folder you have the individual videos save to needs to be public. This is so fal can get the URLs and combine them."
},
"typeVersion": 1
},
{
"id": "eb761e29-0888-45a6-b23a-a31906e0ac8c",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
2560,
2112
],
"parameters": {
"color": 7,
"content": "## Fal \nFal.AI configuration:\n\nFal is an AI platform and we will be using their ffmpeg video combiner. \n\nPut in for api \"Key (your api)"
},
"typeVersion": 1
},
{
"id": "3d7eccd8-fc0d-41b5-9794-83d86883e605",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
112,
1648
],
"parameters": {
"color": 7,
"width": 1264,
"height": 768,
"content": "## Trigger ##"
},
"typeVersion": 1
},
{
"id": "21649a31-9567-4d60-86c8-bfa8a61b4410",
"name": "Sticky Note10",
"type": "n8n-nodes-base.stickyNote",
"position": [
1392,
1216
],
"parameters": {
"color": 7,
"width": 2080,
"height": 1632,
"content": "## Video Generation ##"
},
"typeVersion": 1
},
{
"id": "2a3ee353-d1dc-4870-985a-b3dc2678ab8f",
"name": "Sticky Note11",
"type": "n8n-nodes-base.stickyNote",
"position": [
3488,
1968
],
"parameters": {
"color": 7,
"width": 1808,
"height": 400,
"content": "## Distribution"
},
"typeVersion": 1
},
{
"id": "e63ae448-e4a6-4ec6-9201-52d0242625de",
"name": "Sticky Note12",
"type": "n8n-nodes-base.stickyNote",
"position": [
-464,
1632
],
"parameters": {
"width": 528,
"height": 1120,
"content": "## How It Works\n\n- A Telegram bot acts as the entry point for the workflow \n- You submit a short content idea through Telegram \n- An AI agent expands the idea into a clear structure and generates a sequence of prompts \n- These prompts are sent through a waterfall flow to multiple video generation nodes \n- Each node creates a short video segment (\u224830 seconds total when combined) \n- Generated video segments are saved to Google Drive \n - This provides publicly accessible URLs \n - Fal requires these URLs to combine the clips \n- Once all segments are ready, Fal merges them into one final video \n- The completed video is sent back to Telegram \n- You review and approve the video before posting \n- Publishing only happens after manual approval \n\n---\n\n## Human in the Loop\n\n- Videos are never published automatically \n- Final approval is always required before posting \n- This ensures quality control and prevents unintended uploads \n\n---\n\n## Setup\n\n- Create a Telegram bot using **BotFather** \n - Connect the bot to the n8n workflow trigger \n- Enable the **Google Drive API** \n - Used to store generated video clips \n - The folder must allow public access \n- Enable and configure the **Gemini API** \n - Used for idea expansion and prompt generation \n- Create a **Fal** account at fal.ai \n - Generate an API key \n - Enter it in n8n using the format: \n - `Key YOUR_API_KEY` \n- (Optional) Add **YouTube credentials** \n - Required only for direct posting to YouTube Shorts \n- Publishing remains disabled until human approval is given \n\n---\n\n"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "0913ecab-a227-406c-97f1-478e8b60cf50",
"connections": {
"If": {
"main": [
[
{
"node": "HTTP Request2",
"type": "main",
"index": 0
}
],
[
{
"node": "Wait",
"type": "main",
"index": 0
}
]
]
},
"If1": {
"main": [
[
{
"node": "Generate a video1",
"type": "main",
"index": 0
},
{
"node": "Generate a video2",
"type": "main",
"index": 0
},
{
"node": "Wait5",
"type": "main",
"index": 0
},
{
"node": "Generate a video4",
"type": "main",
"index": 0
}
]
]
},
"If2": {
"main": [
[],
[
{
"node": "Send a text message8",
"type": "main",
"index": 0
},
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"If3": {
"main": [
[
{
"node": "Download a video1",
"type": "main",
"index": 0
}
]
]
},
"Wait": {
"main": [
[
{
"node": "HTTP Request1",
"type": "main",
"index": 0
}
]
]
},
"Merge": {
"main": [
[
{
"node": "HTTP Request",
"type": "main",
"index": 0
}
]
]
},
"Wait5": {
"main": [
[
{
"node": "Generate a video3",
"type": "main",
"index": 0
}
]
]
},
"AI Agent": {
"main": [
[
{
"node": "Send message and wait for response",
"type": "main",
"index": 0
}
]
]
},
"Label URL ": {
"main": [
[
{
"node": "Send a video",
"type": "main",
"index": 0
}
]
]
},
"Label URL 1": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"Label URL 2": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"Label URL 3": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 2
}
]
]
},
"Label URL 4": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 3
}
]
]
},
"HTTP Request": {
"main": [
[
{
"node": "HTTP Request1",
"type": "main",
"index": 0
}
]
]
},
"Send a video": {
"main": [
[
{
"node": "Send message and wait for response1",
"type": "main",
"index": 0
}
]
]
},
"Upload video": {
"main": [
[
{
"node": "Label URL 2",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request1": {
"main": [
[
{
"node": "If",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request2": {
"main": [
[
{
"node": "Download a video",
"type": "main",
"index": 0
}
]
]
},
"Upload video1": {
"main": [
[
{
"node": "Label URL 1",
"type": "main",
"index": 0
}
]
]
},
"Upload video2": {
"main": [
[
{
"node": "Label URL ",
"type": "main",
"index": 0
}
]
]
},
"Upload video3": {
"main": [
[
{
"node": "Label URL 3",
"type": "main",
"index": 0
}
]
]
},
"Upload video4": {
"main": [
[
{
"node": "Label URL 4",
"type": "main",
"index": 0
}
]
]
},
"Download a video": {
"main": [
[
{
"node": "Upload video2",
"type": "main",
"index": 0
}
]
]
},
"Telegram Trigger": {
"main": [
[
{
"node": "If2",
"type": "main",
"index": 0
}
]
]
},
"Download a video1": {
"main": [
[
{
"node": "Upload a video",
"type": "main",
"index": 0
}
]
]
},
"Generate a video1": {
"main": [
[
{
"node": "Upload video1",
"type": "main",
"index": 0
},
{
"node": "Send a text message",
"type": "main",
"index": 0
}
]
]
},
"Generate a video2": {
"main": [
[
{
"node": "Upload video",
"type": "main",
"index": 0
},
{
"node": "Send a text message2",
"type": "main",
"index": 0
}
]
]
},
"Generate a video3": {
"main": [
[
{
"node": "Upload video3",
"type": "main",
"index": 0
},
{
"node": "Send a text message3",
"type": "main",
"index": 0
}
]
]
},
"Generate a video4": {
"main": [
[
{
"node": "Upload video4",
"type": "main",
"index": 0
},
{
"node": "Send a text message4",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "AI Agent",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Send message and wait for response": {
"main": [
[
{
"node": "If1",
"type": "main",
"index": 0
}
]
]
},
"Send message and wait for response1": {
"main": [
[
{
"node": "If3",
"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.
googleDriveOAuth2ApigooglePalmApiopenAiApitelegramApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow is designed for content creators, marketing teams, and automation builders who want to produce short-form video content at scale without manual editing.
Source: https://n8n.io/workflows/11617/ — 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.
Generate AI viral videos with NanoBanana & VEO3, shared on socials via Blotato 2. Uses @blotato/n8n-nodes-blotato, googleSheets, lmChatOpenAi, toolThink. Event-driven trigger; 94 nodes.
RAG CHATBOT Main. Uses telegram, telegramTrigger, lmChatOpenAi, n8n-nodes-mcp. Event-driven trigger; 87 nodes.
Digital marketers, content creators, social media managers, and businesses who want to use AI marketing automation for YouTube Shorts without spending hours on production. This AI workflow helps anyon
This template is designed for marketers, content creators, and e-commerce brands who want to automate the creation of professional ad videos at scale. It’s ideal for teams looking to generate consiste
This automation is designed to help you generate AI-powered music tracks, cover art, and fully rendered music videos — all triggered from a simple Telegram chat and managed via Google Sheets.