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 →
{
"updatedAt": "2025-12-21T02:49:09.03Z",
"createdAt": "2025-12-21T02:49:09.03Z",
"id": "lageeFAHM9BIJphJ",
"name": "Generate AI viral videos with NanoBanana & VEO3, shared on socials via Blotato 2",
"description": null,
"active": false,
"isArchived": false,
"nodes": [
{
"parameters": {
"content": "# \ud83d\udcd1 STEP 5 \u2014 Auto-Post to All Platforms\n\n",
"height": 832,
"width": 1344,
"color": 4
},
"id": "101bdee1-4de4-4b5e-9170-4d490d4e8128",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
2320,
880
],
"typeVersion": 1
},
{
"parameters": {
"resource": "post",
"operation": "create"
},
"id": "db2db976-7988-4939-a931-b6b2b98570aa",
"name": "Upload Video to BLOTATO",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
2384,
1504
],
"typeVersion": 2
},
{
"parameters": {
"resource": "post",
"operation": "create"
},
"id": "6866a654-e6a7-4543-b98a-8288f9d04b47",
"name": "Youtube",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
3008,
1296
],
"typeVersion": 2
},
{
"parameters": {
"resource": "post",
"operation": "create"
},
"id": "a1b51932-2e2c-4e32-a37a-7ce94620cdd9",
"name": "Tiktok",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
2640,
1120
],
"typeVersion": 2
},
{
"parameters": {
"mode": "chooseBranch",
"numberInputs": 9
},
"id": "2c6cb6a6-e4b2-470d-8afb-b2c03b72e97b",
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
3296,
1200
],
"typeVersion": 3.2
},
{
"parameters": {
"operation": "appendOrUpdate",
"documentId": {
"__rl": true,
"mode": "id",
"value": "="
},
"sheetName": {
"__rl": true,
"mode": "id",
"value": "="
},
"columns": {
"value": {
"STATUS": "Published",
"IMAGE NAME": "={{ $('Telegram Trigger: Receive Video Idea').item.json.message.photo[2].file_unique_id }}"
},
"schema": [
{
"id": "IMAGE NAME",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "IMAGE NAME",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "IMAGE URL",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "IMAGE URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "IMAGE DESCRIPTION",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "IMAGE DESCRIPTION",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "CAPTION",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "CAPTION",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL VIDEO FINAL",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "URL VIDEO FINAL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "TITRE VIDEO",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "TITRE VIDEO",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "CAPTION VIDEO",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "CAPTION VIDEO",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "STATUS",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "STATUS",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"IMAGE NAME"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"id": "bee496d6-fc2d-4f1c-812f-9d6be08154a7",
"name": "Update Status to \"DONE\"",
"type": "n8n-nodes-base.googleSheets",
"position": [
3472,
1312
],
"typeVersion": 4.5,
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"resource": "post",
"operation": "create"
},
"id": "5f7344d8-a277-457b-a33f-c48e2ced1e49",
"name": "Linkedin",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
2832,
1120
],
"typeVersion": 2
},
{
"parameters": {
"resource": "post",
"operation": "create"
},
"id": "31bc2347-2457-4fad-8436-09282df89609",
"name": "Facebook",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
3008,
1120
],
"typeVersion": 2
},
{
"parameters": {
"resource": "post",
"operation": "create"
},
"id": "06e29e46-c3ce-4c9e-825d-39df924a607d",
"name": "Instagram",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
2640,
1296
],
"typeVersion": 2
},
{
"parameters": {
"resource": "post",
"operation": "create"
},
"id": "3f7560c8-3e4a-4d62-bf62-e8d543df8026",
"name": "Threads",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
2640,
1504
],
"typeVersion": 2
},
{
"parameters": {
"resource": "post",
"operation": "create"
},
"id": "3e4b6251-7c56-40ca-8fb6-4b77c910a2e6",
"name": "Bluesky",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
2832,
1504
],
"typeVersion": 2
},
{
"parameters": {
"resource": "post",
"operation": "create"
},
"id": "61f5f513-b7ec-40ca-a4a1-1b897f092a04",
"name": "Pinterest",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
3008,
1504
],
"typeVersion": 2
},
{
"parameters": {
"resource": "post",
"operation": "create"
},
"id": "4fb185bf-f237-4b71-8557-178f15f0caec",
"name": "Twitter (X)",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
2832,
1296
],
"typeVersion": 2
},
{
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"id": "cb9939c6-1c5c-448b-ab3a-a66d90767cf2",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
1840,
1216
],
"typeVersion": 1.2,
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {},
"id": "2c244851-7835-4f4a-8fe9-10a26acf6365",
"name": "Think",
"type": "@n8n/n8n-nodes-langchain.toolThink",
"position": [
1984,
1216
],
"typeVersion": 1
},
{
"parameters": {
"jsonSchemaExample": "{\n \"title\": \"string\",\n \"final_prompt\": \"string\"\n}\n"
},
"id": "0695e935-93ac-48da-a893-1615ce22a6e7",
"name": "Structured Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
2128,
1216
],
"typeVersion": 1.3
},
{
"parameters": {
"chatId": "={{ $('Telegram Trigger: Receive Video Idea').item.json.message.chat.id }}",
"text": "=Url VIDEO : {{ $('Download Video from VEO3').item.json.data.response.resultUrls[0] }}",
"additionalFields": {}
},
"id": "ff995af1-503e-4356-8e67-6392b4629496",
"name": "Send Video URL via Telegram",
"type": "n8n-nodes-base.telegram",
"position": [
2368,
1008
],
"typeVersion": 1.2,
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"operation": "sendVideo",
"chatId": "={{ $json.result.chat.id }}",
"file": "={{ $('Save Caption Video to Google Sheets').item.json['URL VIDEO FINAL'] }}",
"additionalFields": {}
},
"id": "257eedc1-30c1-4e40-913b-24ceb018df28",
"name": "Send Final Video Preview",
"type": "n8n-nodes-base.telegram",
"position": [
2384,
1248
],
"typeVersion": 1.2,
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"updates": "={{ [\"message\"] }}",
"additionalFields": {}
},
"id": "11f4ee14-912b-4a77-8696-7d36f7fc8a21",
"name": "Telegram Trigger: Receive Video Idea",
"type": "n8n-nodes-base.telegramTrigger",
"position": [
1152,
432
],
"typeVersion": 1.2,
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "cc2e0500-57b1-4615-82cb-1c950e5f2ec4",
"name": "json_master",
"type": "string",
"value": "={\n \"description\": \"Brief narrative description of the scene, focusing on key visual storytelling and product transformation.\",\n \"style\": \"cinematic | photorealistic | stylized | gritty | elegant\",\n \"camera\": {\n \"type\": \"fixed | dolly | Steadicam | crane combo\",\n \"movement\": \"describe any camera moves like slow push-in, pan, orbit\",\n \"lens\": \"optional lens type or focal length for cinematic effect\"\n },\n \"lighting\": {\n \"type\": \"natural | dramatic | high-contrast\",\n \"sources\": \"key lighting sources (sunset, halogen, ambient glow...)\",\n \"FX\": \"optional VFX elements like fog, reflections, flares\"\n },\n \"environment\": {\n \"location\": \"describe location or room (kitchen, desert, basketball court...)\",\n \"set_pieces\": [\n \"list of key background or prop elements\",\n \"e.g. hardwood floors, chain-link fence, velvet surface\"\n ],\n \"mood\": \"describe the ambient atmosphere (moody, clean, epic...)\"\n },\n \"elements\": [\n \"main physical items involved (product box, accessories, vehicles...)\",\n \"include brand visibility (logos, packaging, texture...)\"\n ],\n \"subject\": {\n \"character\": {\n \"description\": \"optional \u2013 physical description, outfit\",\n \"pose\": \"optional \u2013 position or gesture\",\n \"lip_sync_line\": \"optional \u2013 spoken line if there\u2019s a voiceover\"\n },\n \"product\": {\n \"brand\": \"Brand name\",\n \"model\": \"Product model or name\",\n \"action\": \"description of product transformation or assembly\"\n }\n },\n \"motion\": {\n \"type\": \"e.g. transformation, explosion, vortex\",\n \"details\": \"step-by-step visual flow of how elements move or evolve\"\n },\n \"VFX\": {\n \"transformation\": \"optional \u2013 describe style (neon trails, motion blur...)\",\n \"impact\": \"optional \u2013 e.g. shockwave, glow, distortion\",\n \"particles\": \"optional \u2013 embers, sparks, thread strands...\",\n \"environment\": \"optional \u2013 VFX affecting the scene (ripples, wind...)\"\n },\n \"audio\": {\n \"music\": \"optional \u2013 cinematic score, trap beat, ambient tone\",\n \"sfx\": [\n \"list of sound effects (zip, pop, woosh...)\"\n ],\n \"ambience\": \"optional \u2013 background soundscape (traffic, wind...)\",\n \"voiceover\": {\n \"delivery\": \"tone and style (confident, whisper, deep...)\",\n \"line\": \"text spoken if applicable\"\n }\n },\n \"ending\": \"Final shot description \u2013 what is seen or felt at the end (freeze frame, logo pulse, glow...)\",\n \"text\": \"none | overlay | tagline | logo pulse at end only\",\n \"format\": \"16:9 | 4k | vertical\",\n \"keywords\": [\n \"brand\",\n \"scene style\",\n \"motion type\",\n \"camera style\",\n \"sound mood\",\n \"target theme\"\n ]\n}\n"
}
]
},
"options": {}
},
"id": "45e0b8ee-b830-48bc-8a9a-a426a7afcd43",
"name": "Set Master Prompt",
"type": "n8n-nodes-base.set",
"position": [
1600,
992
],
"typeVersion": 3.4
},
{
"parameters": {
"promptType": "define",
"text": "=Create a UGC-style video prompt using both the reference image and the user description. \n\n**Inputs** \n- User description (optional): \n `{{ $('Telegram Trigger: Receive Video Idea').item.json.message.caption }}` \n- Reference image analysis (stay strictly faithful to what\u2019s visible): \n `{{ $('Google Sheets: Update Image Description').item.json['IMAGE DESCRIPTION'] }}` \n\n**Rules** \n- Keep the style casual, authentic, and realistic. Avoid studio-like or cinematic language. \n- Default model: `veo3_fast` (unless otherwise specified). \n- Output only **one JSON object** with the key: `video_prompt`. \n",
"hasOutputParser": true,
"options": {
"systemMessage": "=system_prompt:\n ## SYSTEM PROMPT: Structured Video Ad Prompt Generator\n A - Ask:\n Generate a structured video ad prompt for cinematic generation, strictly based on the master schema provided in: {{ $json.json_master }}.\n The final result must be a JSON object with exactly two top-level keys: `title` and `final_prompt`.\n\n G - Guidance:\n role: Creative Director\n output_count: 1\n character_limit: None\n constraints:\n - The output must be valid JSON.\n - The `title` field should contain a short, descriptive and unique title (max 15 words).\n - The `final_prompt` field must contain a **single-line JSON string** that follows the exact structure of {{ $json.json_master }} with all fields preserved.\n - Do not include any explanations, markdown, or extra text \u2014 only the JSON object.\n - Escape all inner quotes in the `final_prompt` string so it is valid as a stringified JSON inside another JSON.\n tool_usage:\n - Ensure consistent alignment across all fields (camera, lighting, motion, etc.).\n - Maintain full structure even for optional fields (use \"none\", \"\", or [] as needed).\n\n N - Notation:\n format: JSON\n expected_output:\n {\n \"title\": \"A unique short title for the scene\",\n \"final_prompt\": \"{...stringified JSON of the full prompt...}\"\n }\n\n"
}
},
"id": "a27e8e28-cb43-4b3f-a96e-e986a25209fb",
"name": "AI Agent: Generate Video Script",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
1920,
992
],
"typeVersion": 2
},
{
"parameters": {
"method": "POST",
"url": "https://api.kie.ai/api/v1/veo/generate",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "googleApi",
"sendBody": true,
"contentType": "raw",
"rawContentType": "application/json",
"body": "={\n \"prompt\": {{ $json.prompt }},\n \"model\": \"{{ $('Google Sheets: Read Video Parameters (CONFIG)').item.json.model }}\",\n \"aspectRatio\": \"{{ $json.aspectRatio }}\",\n \"imageUrls\": [\n \"{{ $('Download Edited Image').item.json.images[0].url }}\"\n ]\n}",
"options": {}
},
"id": "16902ea9-197e-4cac-936e-83c1fc226854",
"name": "Generate Video with VEO3",
"type": "n8n-nodes-base.httpRequest",
"position": [
1200,
1504
],
"typeVersion": 4.2,
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
},
"googleApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"amount": 20
},
"id": "a7fffb23-dba4-4d1e-a42e-191a1414ec60",
"name": "Wait for VEO3 Rendering",
"type": "n8n-nodes-base.wait",
"position": [
1408,
1504
],
"typeVersion": 1.1
},
{
"parameters": {
"url": "https://api.kie.ai/api/v1/veo/record-info",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "taskId",
"value": "={{ $('Generate Video with VEO3').item.json.data.taskId }}"
}
]
},
"options": {}
},
"id": "67889216-2c0f-4ed8-ae54-8e7e7fdbac90",
"name": "Download Video from VEO3",
"type": "n8n-nodes-base.httpRequest",
"position": [
1616,
1504
],
"typeVersion": 4.2
},
{
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-4o",
"cachedResultName": "GPT-4O"
},
"messages": {
"values": [
{
"content": "=You are rewriting a TikTok video script, caption, and overlay \u2014\nnot inventing a new one. You must follow this format and obey\nthese rules strictly.\n---\n### CONTEXT:\nHere is the content idea to use:{{ $('Telegram Trigger: Receive Video Idea').item.json.message.caption }}\n\nand the Title is : {{ $('AI Agent: Generate Video Script').item.json.output.title }}\n\n\nWrite the caption text using the topic.\n\n---\n- MUST be under 200 characters (yes \"Characters\" not wordcount)\nthis is an absolute MUST, no more than 200 characters!!! \n\n### FINAL OUTPUT FORMAT (no markdown formatting):\n\nDO NOT return any explanations. Only return the Caption Text\n"
}
]
},
"options": {}
},
"id": "f6dda272-6129-4c04-b4c2-1e6bf5d156d8",
"name": "Rewrite Caption with GPT-4o",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
1776,
1504
],
"typeVersion": 1.8,
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"operation": "appendOrUpdate",
"documentId": {
"__rl": true,
"mode": "id",
"value": "="
},
"sheetName": {
"__rl": true,
"mode": "id",
"value": "="
},
"columns": {
"value": {
"STATUS": "CREATE",
"IMAGE NAME": "={{ $('Telegram Trigger: Receive Video Idea').item.json.message.photo[2].file_unique_id }}",
"TITRE VIDEO": "={{ $('AI Agent: Generate Video Script').item.json.output.title }}",
"CAPTION VIDEO": "={{ $json.message.content }}",
"URL VIDEO FINAL": "={{ $('Download Video from VEO3').item.json.data.response.resultUrls[0] }}"
},
"schema": [
{
"id": "IMAGE NAME",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "IMAGE NAME",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "IMAGE URL",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "IMAGE URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "IMAGE DESCRIPTION",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "IMAGE DESCRIPTION",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "CAPTION",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "CAPTION",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL VIDEO FINAL",
"type": "string",
"display": true,
"required": false,
"displayName": "URL VIDEO FINAL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "TITRE VIDEO",
"type": "string",
"display": true,
"required": false,
"displayName": "TITRE VIDEO",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "CAPTION VIDEO",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "CAPTION VIDEO",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "STATUS",
"type": "string",
"display": true,
"required": false,
"displayName": "STATUS",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"IMAGE NAME"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"id": "8b4c6b55-a0d7-4a19-b85c-1927ccb5eaa2",
"name": "Save Caption Video to Google Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
2080,
1504
],
"typeVersion": 4.6,
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsCode": "const structuredPrompt = $input.first().json.output.final_prompt;\nreturn {\n json: {\n prompt: JSON.stringify(structuredPrompt), // this escapes it correctly!\n model: \"veo3_fast\",\n aspectRatio: \"16:9\"\n }\n};\n"
},
"id": "30c415e0-58e0-48b9-b7e9-11dc5d979ac8",
"name": "Format Prompt",
"type": "n8n-nodes-base.code",
"position": [
1200,
1200
],
"typeVersion": 2
},
{
"parameters": {
"content": "# \ud83d\udcd1 STEP 3 \u2014 Generate Video Ad Script",
"height": 460,
"width": 1180
},
"id": "61ce4a03-4104-4beb-bb16-0b2d2dde142d",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1088,
880
],
"typeVersion": 1
},
{
"parameters": {
"content": "# \ud83d\udcd1 STEP 4 \u2014 Generate Video with VEO3",
"height": 320,
"width": 1180
},
"id": "9f91c353-3ad6-498c-ba14-907bb91e208c",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
1088,
1392
],
"typeVersion": 1
},
{
"parameters": {
"content": "# \ud83d\udcd1 STEP 1 \u2014 Collect Idea & Image",
"height": 592,
"width": 1184
},
"id": "3051b833-571a-4f0c-993a-ca8ffd03e476",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
1088,
240
],
"typeVersion": 1
},
{
"parameters": {
"content": "# \ud83d\udcd1 STEP 2 \u2014 Create Image with NanoBanana\n",
"height": 592,
"width": 1328
},
"id": "785aa7c8-8921-4b6b-8db3-8d55e2a42564",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
2320,
240
],
"typeVersion": 1
},
{
"parameters": {
"resource": "file",
"fileId": "={{ $json.message.photo[2].file_id }}",
"additionalFields": {}
},
"id": "fa25f6bf-d05b-4b8d-8a8a-b8684c601510",
"name": "Telegram: Get Image File",
"type": "n8n-nodes-base.telegram",
"position": [
1584,
304
],
"typeVersion": 1.2,
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"name": "={{ $('Telegram Trigger: Receive Video Idea').item.json.message.photo[2].file_unique_id }}",
"driveId": {
"__rl": true,
"mode": "id",
"value": "="
},
"folderId": {
"__rl": true,
"mode": "id",
"value": "="
},
"options": {}
},
"id": "7a362123-c86c-45f9-b80c-a5660f92da46",
"name": "Google Drive: Upload Image",
"type": "n8n-nodes-base.googleDrive",
"position": [
1600,
496
],
"typeVersion": 3,
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"operation": "appendOrUpdate",
"documentId": {
"__rl": true,
"mode": "id",
"value": "="
},
"sheetName": {
"__rl": true,
"mode": "id",
"value": "="
},
"columns": {
"value": {
"STATUS": "EN COURS",
"CAPTION": "={{ $('Telegram Trigger: Receive Video Idea').item.json.message.caption }}",
"IMAGE URL": "={{ $json.webContentLink }}",
"IMAGE NAME": "={{ $('Telegram Trigger: Receive Video Idea').item.json.message.photo[2].file_unique_id }}"
},
"schema": [
{
"id": "IMAGE NAME",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "IMAGE NAME",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "IMAGE URL",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "IMAGE URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "IMAGE DESCRIPTION",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "IMAGE DESCRIPTION",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "CAPTION",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "CAPTION",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "STATUS",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "STATUS",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"IMAGE NAME"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"id": "a9614733-44e3-4580-95f8-a955d9136be4",
"name": "Google Sheets: Log Image & Caption",
"type": "n8n-nodes-base.googleSheets",
"position": [
1600,
672
],
"typeVersion": 4.7,
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "af62651a-3fc8-419d-908b-6514f6f4bcb3",
"name": "YOUR_BOT_TOKEN",
"type": "string",
"value": ""
}
]
},
"options": {}
},
"id": "a8e85901-2451-4037-ba0c-aa2b229c9d0f",
"name": "Set: Bot Token (Placeholder)",
"type": "n8n-nodes-base.set",
"position": [
1840,
432
],
"typeVersion": 3.4
},
{
"parameters": {
"url": "=https://api.telegram.org/bot{{ $json.YOUR_BOT_TOKEN }}/getFile?file_id={{ $('Telegram Trigger: Receive Video Idea').item.json.message.photo[3].file_id }}",
"options": {},
"requestMethod": "GET"
},
"id": "ae9da8d7-f2c4-4ada-897c-651176cbfdb6",
"name": "Telegram API: Get File URL",
"type": "n8n-nodes-base.httpRequest",
"position": [
2032,
432
],
"typeVersion": 4.2
},
{
"parameters": {
"resource": "image",
"operation": "analyze",
"modelId": {
"__rl": true,
"mode": "list",
"value": "chatgpt-4o-latest",
"cachedResultName": "CHATGPT-4O-LATEST"
},
"text": "=You are an image analysis assistant.\n\nYour task is to analyze the given image and output results **only in YAML format**. Do not add explanations, comments, or extra text outside YAML.\n\nRules:\n\n- If the image depicts a **product**, return:\n \n ```yaml\n brand_name: (brand if visible or inferable)\n color_scheme:\n - hex: (hex code of each prominent color)\n name: (descriptive name of the color)\n font_style: (serif/sans-serif, bold/thin, etc.)\n visual_description: (1\u20132 sentences summarizing what is seen, ignoring the background)\n \n ```\n \n- If the image depicts a **character**, return:\n \n ```yaml\n character_name: (name if visible or inferable, else \"unknown\")\n color_scheme:\n - hex: (hex code of each prominent color on the character)\n name: (descriptive name of the color)\n outfit_style: (clothing style, accessories, or notable features)\n visual_description: (1\u20132 sentences summarizing what the character looks like, ignoring the background)\n \n ```\n \n- If the image depicts **both**, return **both sections** in YAML.\n\nOnly output valid YAML. No explanations.",
"imageUrls": "=https://api.telegram.org/file/bot{{ $('Set: Bot Token (Placeholder)').item.json.YOUR_BOT_TOKEN }}/{{ $json.result.file_path }}",
"options": {}
},
"id": "6527e03e-6417-45a5-95a8-2ef84b872df0",
"name": "OpenAI Vision: Analyze Reference Image",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
2448,
432
],
"typeVersion": 1.8,
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"operation": "appendOrUpdate",
"documentId": {
"__rl": true,
"mode": "id",
"value": "="
},
"sheetName": {
"__rl": true,
"mode": "id",
"value": "="
},
"columns": {
"value": {
"IMAGE NAME": "={{ $('Telegram Trigger: Receive Video Idea').item.json.message.photo[2].file_unique_id }}",
"IMAGE DESCRIPTION": "={{ $json.content }}"
},
"schema": [
{
"id": "IMAGE NAME",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "IMAGE NAME",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "IMAGE URL",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "IMAGE URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "IMAGE DESCRIPTION",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "IMAGE DESCRIPTION",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "CAPTION",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "CAPTION",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "STATUS",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "STATUS",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"IMAGE NAME"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"id": "6d78c44a-9073-4a2c-9a17-102c870b2162",
"name": "Google Sheets: Update Image Description",
"type": "n8n-nodes-base.googleSheets",
"position": [
2688,
432
],
"typeVersion": 4.7,
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsonSchemaExample": "{\n\t\"image_prompt\": \"string\"\n}"
},
"id": "efd41bb8-ecef-49ea-9051-ead169d6766b",
"name": "LLM: Structured Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
3072,
672
],
"typeVersion": 1.3
},
{
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"id": "96a49fe4-d013-42c8-9ae8-11eb713e132f",
"name": "LLM: OpenAI Chat",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
2864,
672
],
"typeVersion": 1.2,
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"promptType": "define",
"text": "=Your task is to create an image prompt following the system guidelines. \nEnsure that the reference image is represented as **accurately as possible**, including all text elements. \n\nUse the following inputs: \n\n- **User\u2019s description:** \n{{ $json.CAPTION }}\n\n- **Reference image description:** \n{{ $json['IMAGE DESCRIPTION'] }}\n",
"hasOutputParser": true,
"options": {
"systemMessage": "=ROLE: UGC Image Prompt Builder \n\nGOAL: \nGenerate one concise, natural, and realistic image prompt (\u2264120 words) from a given product or reference image. The prompt must simulate authentic UGC (user-generated content) photography. \n\nRULES: \n- Always output **one JSON object only** with the key: \n - `image_prompt`: (string with full description) \n- Do **not** add commentary, metadata, or extra keys. JSON only. \n\nSTYLE GUIDELINES: \n- Tone: casual, unstaged, lifelike, handheld snapshot. \n- Camera cues: include at least 2\u20133 (e.g., phone snapshot, handheld framing, off-center composition, natural indoor light, soft shadows, slight motion blur, auto exposure, unpolished look, mild grain). \n- Realism: embrace imperfections (wrinkles, stray hairs, skin texture, clutter, smudges). \n- Packaging/Text: preserve exactly as visible. Never invent claims, numbers, or badges. \n- Diversity: if people appear but are unspecified, vary gender/ethnicity naturally; default age range = 21\u201338. \n- Setting: default to real-world everyday spaces (home, street, store, gym, office). \n\nSAFETY: \n- No copyrighted character names. \n- No dialogue or scripts. Only describe scenes. \n\nOUTPUT CONTRACT: \n- JSON only, no prose outside. \n- Max 120 words in `image_prompt`. \n- Must cover: subject, action, mood, setting, style/camera, colors, and text accuracy. \n\nCHECKLIST BEFORE OUTPUT: \n- Natural handheld tone? \n- At least 2 camera cues included? \n- Product text preserved exactly? \n- Only JSON returned? \n\n--- \n\n### Example \n\nGood Example : \n```json\n{ \"image_prompt\": \"a young adult casually holding a skincare tube near a bathroom mirror; action: dabs small amount on the back of the hand; mood: easy morning; setting: small apartment bathroom with towel on rack and toothbrush cup; style/camera: phone snapshot, handheld framing, off-center composition, natural window light, slight motion blur, mild grain; colors: soft whites and mint label; text accuracy: keep every word on the tube exactly as visible, no added claims\" }\n"
}
},
"id": "f6599d80-4301-4dd1-bc38-1c39e57e21cb",
"name": "Generate Image Prompt",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
2912,
432
],
"typeVersion": 2.2
},
{
"parameters": {
"method": "POST",
"url": "https://queue.fal.run/fal-ai/nano-banana/edit",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n\t\"prompt\": \"{{ $json.output.image_prompt.replace(/\\\"/g, '\\\\\\\"').replace(/\\n/g, '\\\\n') }}\",\n\"image_urls\": [\"{{ $('Google Drive: Upload Image').item.json.webContentLink }}\"]\n\n}\n\n",
"options": {}
},
"id": "80274aa5-bdf0-49bf-9980-0624d99d68ef",
"name": "NanoBanana: Create Image",
"type": "n8n-nodes-base.httpRequest",
"position": [
3248,
432
],
"typeVersion": 4.2,
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"amount": 20
},
"id": "e132487d-da8c-4850-9d3f-9e057e9bde64",
"name": "Wait for Image Edit",
"type": "n8n-nodes-base.wait",
"position": [
3456,
432
],
"typeVersion": 1.1
},
{
"parameters": {
"url": "={{ $json.response_url }}",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"options": {}
},
"id": "2c7ffce1-8ace-418d-9738-c659f4554980",
"name": "Download Edited Image",
"type": "n8n-nodes-base.httpRequest",
"position": [
3456,
656
],
"typeVersion": 4.2
},
{
"parameters": {
"authentication": "serviceAccount",
"documentId": {
"__rl": true,
"value": "=https://docs.google.com/spreadsheets/d/1w2UMKmKeX37QLMKtNWTB8SHHd9s3zRaT9p-SsovK8kw/edit",
"mode": "url"
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": ""
}
},
"id": "ec725aa0-fd30-4d98-b984-0228873db428",
"name": "Google Sheets: Read Video Parameters (CONFIG)",
"type": "n8n-nodes-base.googleSheets",
"position": [
1392,
992
],
"typeVersion": 4.6,
"credentials": {
"googleApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"chatId": "={{ $('Telegram Trigger: Receive Video Idea').item.json.message.chat.id }}",
"text": "Published",
"additionalFields": {}
},
"id": "abafa8c6-55a0-488c-970e-d2a969ad7959",
"name": "Telegram: Send notification",
"type": "n8n-nodes-base.telegram",
"position": [
3472,
1520
],
"typeVersion": 1.2,
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"content": "# \ud83c\udfac Generate AI viral videos with NanoBanana & VEO3, shared on socials via Blotato (By Dr. Firas)\n\n\n# \ud83c\udfa5 Full Tutorial :\n[](https://youtu.be/nlwpbXQqNQ4)\n\n---\n\n# \ud83d\udcd8 Documentation \nAccess detailed setup instructions, API config, platform connection guides, and workflow customization tips:\n\n\ud83d\udcce [Open the full documentation on Notion](https://automatisation.notion.site/NonoBanan-2643d6550fd98041aef5dcbe8ab0f7a1?source=copy_link)\n\n---\n\n# \u2699\ufe0f Requirements\n\n1. \u2705 **Create a [Blotato](https://blotato.com/?ref=firas) account** (Pro plan required for API access) \n2. \ud83d\udd11 **Generate your Blotato API Key** via: `Settings > API > Generate API Key` \n3. \ud83d\udce6 **Enable \u201cVerified Community Nodes\u201d** in the n8n admin settings \n4. \ud83e\udde9 **Install the Blotato** verified community node in n8n \n5. \ud83d\udee0 **Create a Blotato API credential** inside your n8n credentials tab \n6. \ud83d\udcc4 **Duplicate this [Google Sheet template](https://docs.google.com/spreadsheets/d/1FutmZHblwnk36fp59fnePjONzuJBdndqZOCuRoGWSmY/edit?usp=sharing)** \n7. \u2601\ufe0f **Make sure your Google Drive folder is PUBLIC** (anyone with the link can access) \n8. \ud83d\udccc **Complete the 3 brown sticky note steps** inside the workflow editor\n\n",
"height": 1476,
"width": 700,
"color": 6
},
"id": "77030cb3-3246-41d5-bcbc-74f82bdd501b",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
352,
192
],
"typeVersion": 1
},
{
"parameters": {
"content": "# \ud83d\udcd1 STEP 5 \u2014 Auto-Post to All Platforms\n\n",
"height": 832,
"width": 1344,
"color": 4
},
"id": "69b0afaa-0762-4368-b512-4641cf7da613",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
4880,
1424
],
"typeVersion": 1
},
{
"parameters": {
"resource": "post",
"operation": "create"
},
"id": "22db68d6-c538-45d2-8244-1e341ae4538d",
"name": "Upload Video to BLOTATO1",
"type": "@blotato/n8n-nodes-preview-blotato.blotato",
"position": [
4944,
2048
],
"typeVersion": 2
},
{
"parameters": {
"resource": "post",
"operation": "create"
},
"id": "74332b0a-9a8a-471b-823c-bf983c48a141",
"name": "Youtube1",
"type": "@blotato/n8n-nodes-preview-blotato.blotato",
"position": [
5568,
1840
],
"typeVersion": 2
},
{
"parameters": {
"resource": "post",
"operation": "create"
},
"id": "9a1a6aed-cc94-4909-a525-a0f900a2c87d",
"name": "Tiktok1",
"type": "@blotato/n8n-nodes-preview-blotato.blotato",
"position": [
5200,
1664
],
"typeVersion": 2
},
{
"parameters": {
"mode": "chooseBranch",
"numberInputs": 9
},
"id": "f5794df9-ee9a-47eb-bcf7-c6939fcbdd72",
"name": "Merge1",
"type": "n8n-nodes-base.merge",
"position": [
5856,
1744
],
"typeVersion": 3.2
},
{
"parameters": {
"operation": "appendOrUpdate",
"documentId": {
"__rl": true,
"value": "https://docs.google.com/spreadsheets/d/1w2UMKmKeX37QLMKtNWTB8SHHd9s3zRaT9p-SsovK8kw/edit",
"mode": "url"
},
"sheetName": {
"__rl": true,
"value": "DESCRIPTION",
"mode": "name"
},
"columns": {
"value": {
"STATUS": "Published",
"IMAGE NAME": "={{ $('Telegram Trigger: Receive Video Idea1').item.json.message.photo[2].file_unique_id }}"
},
"schema": [
{
"id": "IMAGE NAME",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "IMAGE NAME",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "IMAGE URL",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "IMAGE URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "IMAGE DESCRIPTION",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "IMAGE DESCRIPTION",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "CAPTION",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "CAPTION",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL VIDEO FINAL",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "URL VIDEO FINAL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "TITRE VIDEO",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "TITRE VIDEO",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "CAPTION VIDEO",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "CAPTION VIDEO",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "STATUS",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "STATUS",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"IMAGE NAME"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"id": "c89a6a84-b433-41f9-a07f-45c37ddc5a05",
"name": "Update Status to \"DONE\"1",
"type": "n8n-nodes-base.googleSheets",
"position": [
6032,
1856
],
"typeVersion": 4.5,
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"resource": "post",
"operation": "create"
},
"id": "983ea5fb-e0e4-4aeb-b83f-4a6da2e8332a",
"name": "Linkedin1",
"type": "@blotato/n8n-nodes-preview-blotato.blotato",
"position": [
5392,
1664
],
"typeVersion": 2
},
{
"parameters": {
"resource": "post",
"operation": "create"
},
"id": "08cac42e-1c81-4697-a1fb-f4b39753a1de",
"name": "Facebook1",
"type": "@blotato/n8n-nodes-preview-blotato.blotato",
"position": [
5568,
1664
],
"typeVersion": 2
},
{
"parameters": {
"resource": "post",
"operation": "create"
},
"id": "5b6036ad-cc6f-4210-be30-be8356f0c550",
"name": "Instagram1",
"type": "@blotato/n8n-nodes-preview-blotato.blotato",
"position": [
5200,
1840
],
"typeVersion": 2
},
{
"parameters": {
"resource": "post",
"operation": "create"
},
"id": "099070c0-4a5d-4601-bbbb-2a91f5bf3d77",
"name": "Threads1",
"type": "@blotato/n8n-nodes-preview-blotato.blotato",
"position": [
5200,
2048
],
"typeVersion": 2
},
{
"parameters": {
"resource": "post",
"operation": "create"
},
"id": "b46b837f-fbc9-4c85-9a33-c2c02b0dbbf1",
"name": "Bluesky1",
"type": "@blotato/n8n-nodes-preview-blotato.blotato",
"position": [
5392,
2048
],
"typeVersion": 2
},
{
"parameters": {
"resource": "post",
"operation": "create"
},
"id": "04de5baa-84ef-4442-9255-051e1f04ebd7",
"name": "Pinterest1",
"type": "@blotato/n8n-nodes-preview-blotato.blotato",
"position": [
5568,
2048
],
"typeVersion": 2
},
{
"parameters": {
"resource": "post",
"operation": "create"
},
"id": "de99e983-2998-40ba-9ba0-1aa7b7b8e71e",
"name": "Twitter (X)1",
"type": "@blotato/n8n-nodes-preview-blotato.blotato",
"position": [
5392,
1840
],
"typeVersion": 2
},
{
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"id": "e4a10eaa-20d7-47b2-92bd-6b1a4155fce8",
"name": "OpenAI Chat Model1",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
4400,
1760
],
"typeVersion": 1.2,
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {},
"id": "942d05de-1940-4d82-a248-7e3014654e58",
"name": "Think1",
"type": "@n8n/n8n-nodes-langchain.toolThink",
"position": [
4544,
1760
],
"typeVersion": 1
},
{
"parameters": {
"jsonSchemaExample": "{\n \"title\": \"string\",\n \"final_prompt\": \"string\"\n}\n"
},
"id": "c15f6603-2617-4808-a6e0-5df202dbe22c",
"name": "Structured Output Parser1",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
4688,
1760
],
"typeVersion": 1.3
},
{
"parameters": {
"chatId": "={{ $('Telegram Trigger: Receive Video Idea1').item.json.message.chat.id }}",
"text": "=Url VIDEO : {{ $('Download Video from VEO').item.json.data.response.resultUrls[0] }}",
"additionalFields": {}
},
"id": "b3912bd0-a676-48bc-865c-e77837b37cb8",
"name": "Send Video URL via Telegram1",
"type": "n8n-nodes-base.telegram",
"position": [
4928,
1552
],
"typeVersion": 1.2,
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"operation": "sendVideo",
"chatId": "={{ $json.result.chat.id }}",
"file": "={{ $('Save Caption Video to Google Sheets1').item.json['URL VIDEO FINAL'] }}",
"additionalFields": {}
},
"id": "61a24744-6426-4627-beef-6426cf4471cc",
"name": "Send Final Video Preview1",
"type": "n8n-nodes-base.telegram",
"position": [
4944,
1792
],
"typeVersion": 1.2,
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"updates": [
"message"
],
"additionalFields": {}
},
"id": "cd4126de-a078-4195-8746-f06e3e790ae2",
"name": "Telegram Trigger: Receive Video Idea1",
"type": "n8n-nodes-base.telegramTrigger",
"position": [
3712,
976
],
"typeVersion": 1.2,
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "cc2e0500-57b1-4615-82cb-1c950e5f2ec4",
"name": "json_master",
"type": "string",
"value": "={\n \"description\": \"Brief narrative description of the scene, focusing on key visual storytelling and product transformation.\",\n \"style\": \"cinematic | photorealistic | stylized | gritty | elegant\",\n \"camera\": {\n \"type\": \"fixed | dolly | Steadicam | crane combo\",\n \"movement\": \"describe any camera moves like slow push-in, pan, orbit\",\n \"lens\": \"optional lens type or focal length for cinematic effect\"\n },\n \"lighting\": {\n \"type\": \"natural | dramatic | high-contrast\",\n \"sources\": \"key lighting sources (sunset, halogen, ambient glow...)\",\n \"FX\": \"optional VFX elements like fog, reflections, flares\"\n },\n \"environment\": {\n \"location\": \"describe location or room (kitchen, desert, basketball court...)\",\n \"set_pieces\": [\n \"list of key background or prop elements\",\n \"e.g. hardwood floors, chain-link fence, velvet surface\"\n ],\n \"mood\": \"describe the ambient atmosphere (moody, clean, epic...)\"\n },\n \"elements\": [\n \"main physical items involved (product box, accessories, vehicles...)\",\n \"include brand visibility (logos, packaging, texture...)\"\n ],\n \"subject\": {\n \"character\": {\n \"description\": \"optional \u2013 physical description, outfit\",\n \"pose\": \"optional \u2013 position or gesture\",\n \"lip_sync_line\": \"optional \u2013 spoken line if there\u2019s a voiceover\"\n },\n \"product\": {\n \"brand\": \"Brand name\",\n \"model\": \"Product model or name\",\n \"action\": \"description of product transformation or assembly\"\n }\n },\n \"motion\": {\n \"type\": \"e.g. transformation, explosion, vortex\",\n \"details\": \"step-by-step visual flow of how elements move or evolve\"\n },\n \"VFX\": {\n \"transformation\": \"optional \u2013 describe style (neon trails, motion blur...)\",\n \"impact\": \"optional \u2013 e.g. shockwave, glow, distortion\",\n \"particles\": \"optional \u2013 embers, sparks, thread strands...\",\n \"environment\": \"optional \u2013 VFX affecting the scene (ripples, wind...)\"\n },\n \"audio\": {\n \"music\": \"optional \u2013 cinematic score, trap beat, ambient tone\",\n \"sfx\": [\n \"list of sound effects (zip, pop, woosh...)\"\n ],\n \"ambience\": \"optional \u2013 background soundscape (traffic, wind...)\",\n \"voiceover\": {\n \"delivery\": \"tone and style (confident, whisper, deep...)\",\n \"line\": \"text spoken if applicable\"\n }\n },\n \"ending\": \"Final shot description \u2013 what is seen or felt at the end (freeze frame, logo pulse, glow...)\",\n \"text\": \"none | overlay | tagline | logo pulse at end only\",\n \"format\": \"16:9 | 4k | vertical\",\n \"keywords\": [\n \"brand\",\n \"scene style\",\n \"motion type\",\n \"camera style\",\n \"sound mood\",\n \"target theme\"\n ]\n}\n"
}
]
},
"options": {}
},
"id": "a602b676-bee7-46cb-8a1d-2fe14f81a5cd",
"name": "Set Master Prompt1",
"type": "n8n-nodes-base.set",
"position": [
4160,
1536
],
"typeVersion": 3.4
},
{
"parameters": {
"promptType": "define",
"text": "=Create a UGC-style video prompt using both the reference image and the user description. \n\n**Inputs** \n- User description (optional): \n `{{ $('Telegram Trigger: Receive Video Idea1').item.json.message.caption }}` \n- Reference image analysis (stay strictly faithful to what\u2019s visible): \n `{{ $('Google Sheets: Update Image Description1').item.json['IMAGE DESCRIPTION'] }}` \n\n**Rules** \n- Keep the style casual, authentic, and realistic. Avoid studio-like or cinematic language. \n- Default model: `veo3_fast` (unless otherwise specified). \n- Output only **one JSON object** with the key: `video_prompt`. \n",
"hasOutputParser": true,
"options": {
"systemMessage": "=system_prompt:\n ## SYSTEM PROMPT: Structured Video Ad Prompt Generator\n A - Ask:\n Generate a structured video ad prompt for cinematic generation, strictly based on the master schema provided in: {{ $json.json_master }}.\n The final result must be a JSON object with exactly two top-level keys: `title` and `final_prompt`.\n\n G - Guidance:\n role: Creative Director\n output_count: 1\n character_limit: None\n constraints:\n - The output must be valid JSON.\n - The `title` field should contain a short, descriptive and unique title (max 15 words).\n - The `final_prompt` field must contain a **single-line JSON string** that follows the exact structure of {{ $json.json_master }} with all fields preserved.\n - Do not include any explanations, markdown, or extra text \u2014 only the JSON object.\n - Escape all inner quotes in the `final_prompt` string so it is valid as a stringified JSON inside another JSON.\n tool_usage:\n - Ensure consistent alignment across all fields (camera, lighting, motion, etc.).\n - Maintain full structure even for optional fields (use \"none\", \"\", or [] as needed).\n\n N - Notation:\n format: JSON\n expected_output:\n {\n \"title\": \"A unique short title for the scene\",\n \"final_prompt\": \"{...stringified JSON of the full prompt...}\"\n }\n\n"
}
},
"id": "ecc7b020-6f13-482d-b1ec-911ac62e9b14",
"name": "AI Agent: Generate Video Script1",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
4480,
1536
],
"typeVersion": 2
},
{
"parameters": {
"method": "POST",
"url": "https://api.kie.ai/api/v1/veo/generate",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"contentType": "raw",
"rawContentType": "application/json",
"body": "={\n \"prompt\": {{ $json.pro
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.
googleApigoogleDriveOAuth2ApigoogleSheetsOAuth2ApihttpHeaderAuthopenAiApitelegramApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
How this works
This workflow automatically turns a new row in Google Sheets into a finished AI-generated video and posts it across YouTube, TikTok, LinkedIn and Facebook. It uses NanoBanana and Veo3 to create the clip, then hands the file to Blotato so the same content reaches every platform without manual uploads. The key step is the moment the sheet row is marked complete, which triggers the entire chain from prompt to published post.
Use it when you need to publish short-form video daily and already keep video briefs in a spreadsheet. Skip it if your content needs heavy human editing or if you only target one platform, as the multi-channel routing adds unnecessary steps. A common variation replaces the sheet trigger with a Telegram message so briefs arrive directly from a phone.
About this workflow
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.
Source: https://github.com/bermingham85/docker-n8n-review/blob/1ff69003aeb12b66e31244d6c03267b2ce6615ac/workflows/lageeFAHM9BIJphJ.json — 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.
🎯 Create viral TikToks, Shorts, Reels, podcasts, and ASMR videos in minutes — all on autopilot.
RAG CHATBOT Main. Uses telegram, telegramTrigger, lmChatOpenAi, n8n-nodes-mcp. Event-driven trigger; 87 nodes.
Creators, marketers, and brands that want to turn a single product photo into premium motion clips, then optionally publish to Instagram/TikTok/YouTube via LATE. No editing skills required.
Product to Social Video (xCodeWraith Edition). Uses telegram, agentTool, telegramTrigger, httpRequest. Event-driven trigger; 83 nodes.
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,”