This workflow corresponds to n8n.io template #9200 — 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": "W9fdydWJuXntSK9c",
"name": "\ud83d\udca5 Automate video ads with NanoBanana, Seedream 4, ChatGPT Image and Veo 3 - VIDE",
"tags": [],
"nodes": [
{
"id": "172c7316-350a-46a8-a720-f0be6b22cff0",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
560,
0
],
"parameters": {
"color": 7,
"width": 1948,
"height": 624,
"content": "# 1\ufe0f\u20e3 \u2192 Step 1 \u2014 Generate prompts from Telegram input\n## Automate video ads with NanoBanana, Seedream 4, ChatGPT Image and Veo 3 (By Dr. Firas)\n### What problem is this workflow solving? / Use case\nCreating video ads usually requires multiple tools and a lot of time: writing scripts, designing product visuals, editing videos, and publishing them across platforms. \nThis workflow **automates the entire pipeline** \u2014 from idea to ready-to-publish ad video \u2014 ensuring brands can quickly test campaigns and boost engagement without production delays."
},
"typeVersion": 1
},
{
"id": "b5e1088e-f59b-48c0-bad0-65887aa9e37b",
"name": "Telegram: Get Image File",
"type": "n8n-nodes-base.telegram",
"position": [
944,
272
],
"parameters": {
"fileId": "={{ $json.message.photo[2].file_id }}",
"resource": "file",
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "7fd471ae-4ef4-436c-b476-b98cc8848cea",
"name": "Trigger: Receive Idea via Telegram",
"type": "n8n-nodes-base.telegramTrigger",
"position": [
672,
272
],
"parameters": {
"updates": [
"message"
],
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "00e2b4cb-7184-4068-a752-df588e48940d",
"name": "Google Drive: Upload Image",
"type": "n8n-nodes-base.googleDrive",
"position": [
1232,
272
],
"parameters": {
"name": "={{ $('Trigger: Receive Idea via Telegram').item.json.message.photo[2].file_unique_id }}",
"driveId": {
"__rl": true,
"mode": "id",
"value": "="
},
"options": {},
"folderId": {
"__rl": true,
"mode": "id",
"value": "="
}
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "51fa2428-83e5-469e-9fbd-e6b74e7fdf35",
"name": "Parse Idea Into Prompts",
"type": "n8n-nodes-base.code",
"position": [
1664,
272
],
"parameters": {
"jsCode": "const text = $('Trigger: Receive Idea via Telegram').first().json.message.caption;\nconst parts = text.split(';').map(part => part.trim());\nreturn {\nimagePrompt: parts[0],\nvideoPrompt: parts[1]\n};\n"
},
"typeVersion": 2
},
{
"id": "5c8efdcc-c697-412e-be62-1f31528075e5",
"name": "Generate Image Prompt",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
2064,
272
],
"parameters": {
"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.imagePrompt }}\n",
"options": {
"systemMessage": "=You are a helpful assistantROLE: 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: \nYou must always create a professional background for the product image. You must never return the image with a plain white or empty background. The background must always enhance and highlight the product in the photo.\n\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- User node think to be creative\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- User node think to be creative\nYou must always create a professional background for the product image. You must never return the image with a plain white or empty background. The background must always enhance and highlight the product in the photo.\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, background, 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; background: professional-looking bathroom scene that enhances the product, never plain white or empty, always styled to highlight the tube naturally; 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"
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2.2
},
{
"id": "749d97b2-bdc0-4b0d-a608-3860f8bc19a0",
"name": "Structured Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
2320,
496
],
"parameters": {
"jsonSchemaExample": "{\n\t\"image_prompt\": \"string\"\n}"
},
"typeVersion": 1.3
},
{
"id": "49ebe3b4-175c-480b-a78b-32a86b772c11",
"name": "Think",
"type": "@n8n/n8n-nodes-langchain.toolThink",
"position": [
2160,
496
],
"parameters": {},
"typeVersion": 1.1
},
{
"id": "6c14c0c2-425f-43a4-ac53-9a1110e24aef",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
1984,
496
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "o4-mini",
"cachedResultName": "o4-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "2b8bb026-a1a0-4f6a-952b-c66458be98ca",
"name": "NanoBanana: Create Image",
"type": "n8n-nodes-base.httpRequest",
"position": [
2816,
96
],
"parameters": {
"url": "https://queue.fal.run/fal-ai/nano-banana/edit",
"method": "POST",
"options": {},
"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} ",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "83dfe606-fca2-43a9-ad65-1c552899c739",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
2480,
656
],
"parameters": {
"color": 7,
"width": 1884,
"height": 432,
"content": "# 4\ufe0f\u20e3 \u2192 Step 4 \u2014 Merge videos into a final ad"
},
"typeVersion": 1
},
{
"id": "c35fcc2f-d3d1-4d83-8efb-6e8cf21d82fa",
"name": "Check Merge Status",
"type": "n8n-nodes-base.httpRequest",
"position": [
3936,
768
],
"parameters": {
"url": "={{ $json['URL FINAL VIDEO'] }}",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "37ef1072-100c-469e-a26d-22843dc2f657",
"name": "Wait: Merge Process",
"type": "n8n-nodes-base.wait",
"position": [
3408,
768
],
"parameters": {
"amount": 2
},
"typeVersion": 1.1
},
{
"id": "55d047f8-bb1c-4b79-ad10-9edb049f5807",
"name": "Upload Final Video to Google Drive",
"type": "n8n-nodes-base.googleDrive",
"position": [
4192,
768
],
"parameters": {
"name": "={{ $('Trigger: Receive Idea via Telegram').first().json.message.photo[2].file_unique_id }}",
"driveId": {
"__rl": true,
"mode": "id",
"value": "="
},
"options": {},
"folderId": {
"__rl": true,
"mode": "id",
"value": "="
}
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "6fb4ed26-d430-493a-a5ef-ecf993d7dca5",
"name": "Sticky Note9",
"type": "n8n-nodes-base.stickyNote",
"position": [
560,
1120
],
"parameters": {
"width": 3804,
"height": 608,
"content": "# 5\ufe0f\u20e3 \u2192 Step 5 \u2014 Publish the final ad to multiple social platforms with Blotato"
},
"typeVersion": 1
},
{
"id": "f6490202-896a-4a21-9689-ed0189da6863",
"name": "Read Brand Settings",
"type": "n8n-nodes-base.googleSheets",
"position": [
672,
1344
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "id",
"value": "="
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "="
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "8c3750e4-333e-4900-aa8e-97c6b5ce06b9",
"name": "Extract Brand Info",
"type": "n8n-nodes-base.code",
"position": [
912,
1344
],
"parameters": {
"jsCode": "const allRows = $input.all();\nreturn [{\njson: {\nproductName: allRows[0].json.col_2,\nproductCategory: allRows[1].json.col_2,\nmainOffer: allRows[2].json.col_2,\nkeyFeature1: allRows[3].json.col_2,\nkeyFeature2: allRows[4].json.col_2,\nwebsiteURL: allRows[5].json.col_2\n}\n}];"
},
"typeVersion": 2
},
{
"id": "660b172c-fe62-40ed-84c9-8b0c2aa7739d",
"name": "Message a model",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
1312,
1344
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-4o",
"cachedResultName": "GPT-4O"
},
"options": {},
"messages": {
"values": [
{
"content": "=You are an expert ad copywriter for social media campaigns.\nYour task: Create compelling ad copy following this exact\nstructure:\n\ud83d\udea8 [Attention-grabbing headline with product benefit]\n\u2714 [Primary offer/benefit]\n\u2714 [Key product feature/quality]\n\u2714 [Trust/credibility element]\n[Call to action] \u2192 [website/link]\n# Input Variables:\nProduct Name: {{ $json.productName }}\nProduct Category: {{ $json.productCategory }}\nMain Offer: {{ $json.mainOffer }}\nKey Feature 1: {{ $json.keyFeature1 }}\nKey Feature 2: {{ $json.keyFeature2 }}\nWebsite URL: {{ $json.websiteURL }}\nRules:\n- Keep headline under 35 characters\n- Each checkmark line under 40 characters\n- Use power words that create urgency\n- Include specific product benefits, not generic claims\n- CTA must be action-oriented (Shop Now, Get Yours, Claim Offer,\netc.)\n- Output ONLY the ad copy text, no explanations\n- No quotes around the text\n- Maintain the emoji structure exactly as shown"
}
]
}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.8
},
{
"id": "f12ad44b-3078-459d-8a23-b664889cc636",
"name": "Save Ad Data to Google Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
1840,
1344
],
"parameters": {
"columns": {
"value": {
"ADS TEXT": "={{ $json.message.content }}",
"ID IMAGE": "={{ $('Trigger: Receive Idea via Telegram').first().json.message.photo[2].file_unique_id }}"
},
"schema": [
{
"id": "ID IMAGE",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "ID IMAGE",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL IMAGE SOURCE",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "URL IMAGE SOURCE",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL IMAGE NANOBANANA",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "URL IMAGE NANOBANANA",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL IMAGE SENDREAM",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "URL IMAGE SENDREAM",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL IMAGE CHATGPT",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "URL IMAGE CHATGPT",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL VIDEO 1",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "URL VIDEO 1",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL VIDEO 2",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "URL VIDEO 2",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL VIDEO 3",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "URL VIDEO 3",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL FINAL VIDEO",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "URL FINAL VIDEO",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "ADS TEXT",
"type": "string",
"display": true,
"required": false,
"displayName": "ADS TEXT",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "STATUS",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "STATUS",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"ID IMAGE"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "id",
"value": "="
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "="
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "f9b4f876-3ce8-4896-9be5-88b76abf7a4b",
"name": "Send Video URL via Telegram",
"type": "n8n-nodes-base.telegram",
"position": [
2080,
1344
],
"parameters": {
"text": "=Url VIDEO : {{ $('Update URL Final video').first().json['URL FINAL VIDEO'] }}",
"chatId": "={{ $('Trigger: Receive Idea via Telegram').first().json.message.chat.id }}",
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "e7452627-f5ea-4083-964b-16832cf53f11",
"name": "Send a video",
"type": "n8n-nodes-base.telegram",
"position": [
2304,
1344
],
"parameters": {
"file": "={{ $('Update URL Final video').first().json['URL FINAL VIDEO'] }}",
"chatId": "={{ $('Trigger: Receive Idea via Telegram').first().json.message.chat.id }}",
"operation": "sendVideo",
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "6d574d77-e737-46b2-a79c-02518d8a2a9e",
"name": "Sticky Note11",
"type": "n8n-nodes-base.stickyNote",
"position": [
2480,
0
],
"parameters": {
"color": 3,
"width": 1884,
"height": 624,
"content": "# 2\ufe0f\u20e3 \u2192 Step 2 \u2014 Create product images with : \ud83c\udf0a Seedream 4.0 + \ud83c\udf4c NanoBanana + \ud83e\udd16 ChatGPT image"
},
"typeVersion": 1
},
{
"id": "de4624ec-4fd8-4456-97ec-ddcb1d7d476d",
"name": "AI Agent: Generate Video Script",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
880,
736
],
"parameters": {
"text": "=Create a BEFORE/AFTER transformation video prompt using the provided idea.\n\n**Inputs**\n\n- idea : {{ $('Parse Idea Into Prompts').first().json.videoPrompt }}\n\n**Rules**\n- The style must be cinematic, visually striking, and optimized for vertical 9:16 TikTok content.\n- Explicitly include: BEFORE scene, AFTER scene, TRANSITION style, CAMERA movement, LIGHTING, COLOR PALETTE, and MOOD.\n- Default model: `veo3_fast` (unless otherwise specified).\n- Output only one valid JSON object.\n\n- The JSON object must contain the following keys: title, final_prompt, final_prompt_2, final_prompt_3.\n\n- Create 3 different scenarios for the same product/topic.\n\n- Place each scenario in a separate key:\nfinal_prompt \u2192 Scenario 1\nfinal_prompt_2 \u2192 Scenario 2\nfinal_prompt_3 \u2192 Scenario 3\n\n- Use the Think tool to review your output\n",
"options": {
"systemMessage": "=system_prompt:\n ## SYSTEM PROMPT: Structured Safe Video Prompt Generator\n A - Ask:\n Generate a structured short video prompt for VEO 3 cinematic generation, strictly based on the master schema provided in: {{ $json.json_master }}.\n Write 3 scenarios for 3 short videos (VEO 3), each lasting about 8 seconds.\n\nThe first scenario should highlight a visual \"problem atmosphere\" (e.g., dull colors, lack of energy, flat lighting) that sets the stage for the product to improve the scene.\n\nThe second scenario should show a \"visual enhancement\" instead of a physical transformation (e.g., scene becomes brighter, colors more vibrant, light reflections intensify, foam glows more under sunlight).\n\nThe third scenario should show another \"creative enhancement\" with a different cinematic angle (e.g., abstract visuals like water, foam, or product bottle under glowing light that shifts into a fresh, uplifting ambiance).\n\n- The final result must be a JSON object with exactly four top-level keys:\n\ntitle \u2192 summarizes the overall concept.\nfinal_prompt \u2192 contains Scenario 1.\nfinal_prompt_2 \u2192 contains Scenario 2.\nfinal_prompt_3 \u2192 contains Scenario 3.\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`, `final_prompt_2`, and `final_prompt_3` fields must contain a **single-line JSON string** that follows the exact structure of {{ $json.json_master }} with all fields preserved.\n - All final prompts must clearly describe: SCENE, VISUAL ENHANCEMENT (instead of \"before/after\"), TRANSITION, CAMERA, LIGHTING, PALETTE, STYLE, and SOUND.\n - Do not include people\u2019s physical traits or body/hair transformations.\n - Avoid sensitive or restricted terms (e.g., frizzy, smooth, body, face, before/after physical changes).\n - The focus must be on cinematic visuals, light, environment, abstract product representation, and positive ambiance.\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, transition, palette, 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 enhancement concept\",\n \"final_prompt\": \"Scenario 1 description here...\",\n \"final_prompt_2\": \"Scenario 2 description here...\",\n \"final_prompt_3\": \"Scenario 3 description here...\"\n }\n"
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2
},
{
"id": "0352c6fb-0614-4266-a6a9-78fd88f1e742",
"name": "Generate Video with VEO3",
"type": "n8n-nodes-base.httpRequest",
"position": [
1872,
880
],
"parameters": {
"url": "https://api.kie.ai/api/v1/veo/generate",
"body": "=\n\n{\n \"prompt\": {{ $json.prompt }},\n \"model\": \"{{ $json.model }}\",\n \"imageUrls\": [ \"{{ $json.image_url }}\" ],\n \"aspectRatio\": \"{{ $json.aspectRatio }}\"\n}\n",
"method": "POST",
"options": {},
"sendBody": true,
"contentType": "raw",
"authentication": "genericCredentialType",
"rawContentType": "application/json",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "006fe9e9-b076-4345-aec4-27fcf1a7f30f",
"name": "Wait for VEO3 Rendering",
"type": "n8n-nodes-base.wait",
"position": [
2112,
880
],
"parameters": {
"unit": "minutes",
"amount": 3
},
"typeVersion": 1.1
},
{
"id": "b5089618-2b8f-4611-a7cf-78ec9e1ed077",
"name": "Download Video from VEO3",
"type": "n8n-nodes-base.httpRequest",
"position": [
2304,
880
],
"parameters": {
"url": "https://api.kie.ai/api/v1/veo/record-info",
"options": {},
"sendQuery": true,
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"queryParameters": {
"parameters": [
{
"name": "taskId",
"value": "={{ $('Generate Video with VEO3').item.json.data.taskId }}"
}
]
}
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "bb7a3989-1ffe-46c6-a2e9-4cba9a5fb47f",
"name": "Format Prompt",
"type": "n8n-nodes-base.code",
"position": [
1648,
880
],
"parameters": {
"jsCode": "const structuredPrompt = $input.first().json.final_prompt;\nimage = $input.first().json.image_url;\nreturn {\n json: {\n prompt: JSON.stringify(structuredPrompt), // this escapes it correctly!\n model: \"veo3_fast\",\n image_url : image,\n aspectRatio: \"9:16\"\n }\n}"
},
"typeVersion": 2
},
{
"id": "143c8983-02c7-4001-8bdf-9d69cbc77169",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
560,
656
],
"parameters": {
"color": 7,
"width": 1920,
"height": 432,
"content": "# 3\ufe0f\u20e3 \u2192 Step 3 \u2014 Produce video ads with Veo 3"
},
"typeVersion": 1
},
{
"id": "e4201ff8-435d-4509-baca-9cf9ba796453",
"name": "OpenAI Chat Model1",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
816,
960
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "bfa98213-7d12-422b-9fa9-e9f8c4e6eb36",
"name": "Think1",
"type": "@n8n/n8n-nodes-langchain.toolThink",
"position": [
976,
960
],
"parameters": {},
"typeVersion": 1
},
{
"id": "acd37b48-c17d-4f9e-82ed-233b04036eee",
"name": "Structured Output Parser1",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
1120,
960
],
"parameters": {
"jsonSchemaExample": "{\n \"title\": \"string\",\n \"final_prompt\": \"string\",\n \"final_prompt_2\": \"string\",\n \"final_prompt_3\": \"string\"\n}\n"
},
"typeVersion": 1.3
},
{
"id": "07dcc2c9-28ee-449a-919d-dbd3dc5196e7",
"name": "3 prompts",
"type": "n8n-nodes-base.code",
"position": [
1168,
736
],
"parameters": {
"jsCode": "// On r\u00e9cup\u00e8re les prompts depuis l'agent IA\nconst prompts = items[0].json.output;\n\n// On r\u00e9cup\u00e8re les images depuis le node \"Save Ad Data to Google Sheets1\"\nconst urls = $('Google Sheets \u2013 save image URLs').first().json;\n\nreturn [\n { \n json: { \n final_prompt: prompts.final_prompt,\n image_url: urls['URL IMAGE NANOBANANA']\n } \n },\n { \n json: { \n final_prompt: prompts.final_prompt_2,\n image_url: urls['URL IMAGE SENDREAM']\n } \n },\n { \n json: { \n final_prompt: prompts.final_prompt_3,\n image_url: urls['URL IMAGE CHATGPT']\n } \n }\n];\n"
},
"typeVersion": 2
},
{
"id": "5364e300-b999-4429-8b99-c1d40f48c28f",
"name": "Upload Video to BLOTATO",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
2544,
1344
],
"parameters": {
"mediaUrl": "={{ $('Update URL Final video').first().json['URL FINAL VIDEO'] }}",
"resource": "media"
},
"credentials": {
"blotatoApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "743afd32-6ebf-4e70-b911-2bbdba7d1ecf",
"name": "Youtube",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
3600,
1328
],
"parameters": {
"options": {},
"platform": "youtube",
"accountId": {
"__rl": true,
"mode": "list",
"value": "8047",
"cachedResultUrl": "https://backend.blotato.com/v2/accounts/8047",
"cachedResultName": "DR FIRASS (Dr. Firas)"
},
"postContentText": "={{ $('Save Ad Data to Google Sheets').item.json['ADS TEXT'] }}",
"postContentMediaUrls": "={{ $json.url }}",
"postCreateYoutubeOptionTitle": "={{ $('AI Agent: Generate Video Script').first().json.output.title }}",
"postCreateYoutubeOptionPrivacyStatus": "private",
"postCreateYoutubeOptionShouldNotifySubscribers": false
},
"credentials": {
"blotatoApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "035b6c10-43ac-4aea-a2ff-82a3ab0bcfa4",
"name": "Tiktok",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
3232,
1152
],
"parameters": {
"options": {},
"platform": "tiktok",
"accountId": {
"__rl": true,
"mode": "list",
"value": "2079",
"cachedResultUrl": "https://backend.blotato.com/v2/accounts/2079",
"cachedResultName": "elitecybzcs"
},
"postContentText": "={{ $('Save Ad Data to Google Sheets').item.json['ADS TEXT'] }}",
"postContentMediaUrls": "={{ $json.url }}"
},
"credentials": {
"blotatoApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "d2401532-aa7b-45b7-9dc4-2d5f51a32599",
"name": "Update Status to \"DONE\"",
"type": "n8n-nodes-base.googleSheets",
"position": [
4176,
1328
],
"parameters": {
"columns": {
"value": {
"STATUS": "DONE",
"ID IMAGE": "={{ $('Trigger: Receive Idea via Telegram').first().json.message.photo[2].file_unique_id }}"
},
"schema": [
{
"id": "ID IMAGE",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "ID IMAGE",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL IMAGE SOURCE",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "URL IMAGE SOURCE",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL IMAGE NANOBANANA",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "URL IMAGE NANOBANANA",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL IMAGE SENDREAM",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "URL IMAGE SENDREAM",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL IMAGE CHATGPT",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "URL IMAGE CHATGPT",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL VIDEO 1",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "URL VIDEO 1",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL VIDEO 2",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "URL VIDEO 2",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL VIDEO 3",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "URL VIDEO 3",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL FINAL VIDEO",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "URL FINAL VIDEO",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "ADS TEXT",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "ADS TEXT",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "STATUS",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "STATUS",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"ID IMAGE"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "id",
"value": "="
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "="
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "cc3d40a1-1123-4faf-8df9-2ae5448ed53a",
"name": "Linkedin",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
3424,
1152
],
"parameters": {
"options": {},
"platform": "linkedin",
"accountId": {
"__rl": true,
"mode": "list",
"value": "1446",
"cachedResultUrl": "https://backend.blotato.com/v2/accounts/1446",
"cachedResultName": "Samuel Amalric"
},
"postContentText": "={{ $('Save Ad Data to Google Sheets').item.json['ADS TEXT'] }}",
"postContentMediaUrls": "={{ $json.url }}"
},
"credentials": {
"blotatoApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "0a3810b6-c21f-4077-954b-79aab2e7985e",
"name": "Facebook",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
3600,
1152
],
"parameters": {
"options": {},
"platform": "facebook",
"accountId": {
"__rl": true,
"mode": "list",
"value": "1759",
"cachedResultUrl": "https://backend.blotato.com/v2/accounts/1759",
"cachedResultName": "Firass Ben"
},
"facebookPageId": {
"__rl": true,
"mode": "list",
"value": "101603614680195",
"cachedResultUrl": "https://backend.blotato.com/v2/accounts/1759/subaccounts/101603614680195",
"cachedResultName": "Dr. Firas"
},
"postContentText": "={{ $('Save Ad Data to Google Sheets').item.json['ADS TEXT'] }}",
"postContentMediaUrls": "={{ $json.url }}"
},
"credentials": {
"blotatoApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "7ec08451-6330-400e-87a2-ab9a2f0706ab",
"name": "Instagram",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
3232,
1328
],
"parameters": {
"options": {},
"accountId": {
"__rl": true,
"mode": "list",
"value": "11892",
"cachedResultUrl": "https://backend.blotato.com/v2/accounts/11892",
"cachedResultName": "doc.firass"
},
"postContentText": "={{ $('Save Ad Data to Google Sheets').item.json['ADS TEXT'] }}",
"postContentMediaUrls": "={{ $json.url }}"
},
"credentials": {
"blotatoApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "0bc8307e-3f4a-432a-8667-eb998ab55042",
"name": "Threads",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
3232,
1536
],
"parameters": {
"options": {},
"platform": "threads",
"accountId": {
"__rl": true,
"mode": "list",
"value": "2280",
"cachedResultUrl": "https://backend.blotato.com/v2/accounts/2280",
"cachedResultName": "doc.firass"
},
"postContentText": "={{ $('Save Ad Data to Google Sheets').item.json['ADS TEXT'] }}",
"postContentMediaUrls": "={{ $json.url }}"
},
"credentials": {
"blotatoApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "d039a2f5-5177-4cce-9018-6a37ab54fa19",
"name": "Bluesky",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
3424,
1536
],
"parameters": {
"options": {},
"platform": "bluesky",
"accountId": {
"__rl": true,
"mode": "list",
"value": "6012",
"cachedResultUrl": "https://backend.blotato.com/v2/accounts/6012",
"cachedResultName": "formationinternet.bsky.social"
},
"postContentText": "={{ $('Save Ad Data to Google Sheets').item.json['ADS TEXT'] }}",
"postContentMediaUrls": "={{ $json.url }}"
},
"credentials": {
"blotatoApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "a04336f9-f2e6-4fbb-a082-9d232a08aa52",
"name": "Pinterest",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
3600,
1536
],
"parameters": {
"options": {},
"platform": "pinterest",
"accountId": {
"__rl": true,
"mode": "list",
"value": "363",
"cachedResultUrl": "https://backend.blotato.com/v2/accounts/363",
"cachedResultName": "formationinternet2022"
},
"postContentText": "={{ $('Save Ad Data to Google Sheets').item.json['ADS TEXT'] }}",
"pinterestBoardId": {
"__rl": true,
"mode": "id",
"value": "1146658823815436667"
},
"postContentMediaUrls": "={{ $json.url }}"
},
"credentials": {
"blotatoApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "fb93e061-c5a9-4dfe-9ca2-ef8a3c6ce9f3",
"name": "Twitter (X)",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
3424,
1328
],
"parameters": {
"options": {},
"platform": "twitter",
"accountId": {
"__rl": true,
"mode": "list",
"value": "1289",
"cachedResultUrl": "https://backend.blotato.com/v2/accounts/1289",
"cachedResultName": "Docteur_Firas"
},
"postContentText": "={{ $('Save Ad Data to Google Sheets').item.json['ADS TEXT'] }}",
"postContentMediaUrls": "={{ $json.url }}"
},
"credentials": {
"blotatoApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "77b73727-3d32-41d6-b0ca-03b2ccaca631",
"name": "Merge1",
"type": "n8n-nodes-base.merge",
"position": [
3936,
1216
],
"parameters": {
"mode": "chooseBranch",
"numberInputs": 9
},
"typeVersion": 3.2
},
{
"id": "181c4741-92b4-4884-bffd-c1dbddca2477",
"name": "Seedream: Generate image from texte",
"type": "n8n-nodes-base.httpRequest",
"position": [
2816,
272
],
"parameters": {
"url": "https://api.kie.ai/api/v1/jobs/createTask",
"body": "={\n \"model\": \"bytedance/seedream-v4-text-to-image\",\n \"input\": {\n \"prompt\": \"{{ $('Parse Idea Into Prompts').item.json.videoPrompt }}\",\n \"image_size\": \"portrait_16_9\",\n \"image_resolution\": \"1K\"\n }\n}\n",
"method": "POST",
"options": {},
"sendBody": true,
"contentType": "raw",
"authentication": "genericCredentialType",
"rawContentType": "application/json",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "a2c358bc-ce2d-4f48-a444-8f2f24a3abbe",
"name": "Download image from Seedream",
"type": "n8n-nodes-base.httpRequest",
"position": [
3440,
272
],
"parameters": {
"url": "=https://api.kie.ai/api/v1/jobs/recordInfo?taskId={{ $json.data.taskId }}",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "b8637494-856c-46f2-9d3c-1df9593d02de",
"name": "Generate 4o Image\uff08GPT IMAG 1\uff09",
"type": "n8n-nodes-base.httpRequest",
"position": [
2816,
448
],
"parameters": {
"url": "https://api.kie.ai/api/v1/gpt4o-image/generate",
"body": "={\n \"prompt\": \"{{ $('Parse Idea Into Prompts').item.json.videoPrompt }}\",\n \"size\": \"2:3\"\n}\n",
"method": "POST",
"options": {},
"sendBody": true,
"contentType": "raw",
"authentication": "genericCredentialType",
"rawContentType": "application/json",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "8b6583ec-e141-4314-a83e-23ced0d3d504",
"name": "Set Master Prompt",
"type": "n8n-nodes-base.set",
"position": [
672,
736
],
"parameters": {
"options": {},
"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"
},
{
"id": "3c6ea609-e426-46d3-8617-2e289a833a64",
"name": "model",
"type": "string",
"value": "veo3_fast"
},
{
"id": "f15acf81-840c-4e09-9ff3-1647b634875f",
"name": "aspectRatio",
"type": "string",
"value": "9:16"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "f9e46614-a5d5-4520-9522-8a03674d226d",
"name": "Merge 3 Videos",
"type": "n8n-nodes-base.httpRequest",
"position": [
3120,
768
],
"parameters": {
"url": "https://fal.run/fal-ai/ffmpeg-api/merge-videos",
"body": "={\n \"video_urls\": [\n \"{{ $json['URL VIDEO 1'] }}\",\n \"{{ $json['URL VIDEO 2'] }}\",\n \"{{ $json['URL VIDEO 3'] }}\"\n ],\n \"resolution\": \"portrait_16_9\",\n \"output\": {\n \"format\": \"mp4\"\n }\n}\n",
"method": "POST",
"options": {},
"sendBody": true,
"contentType": "raw",
"authentication": "genericCredentialType",
"rawContentType": "application/json",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "606e323e-6e32-480e-855f-72baad361c54",
"name": "Loop Over Items - Split In Batches",
"type": "n8n-nodes-base.splitInBatches",
"position": [
1424,
784
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "729b59d4-fa07-4fc9-b6cc-64fca41b22ef",
"name": "Update row in sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
2848,
768
],
"parameters": {
"columns": {
"value": {
"ID IMAGE": "={{ $('Google Sheets \u2013 save image URLs').first().json['ID IMAGE'] }}",
"URL VIDEO 1": "={{ $json.data[0].data.response.resultUrls[0] }}",
"URL VIDEO 2": "={{ $json.data[1].data.response.resultUrls[0] }}",
"URL VIDEO 3": "={{ $json.data[2].data.response.resultUrls[0] }}"
},
"schema": [
{
"id": "ID IMAGE",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "ID IMAGE",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL IMAGE SOURCE",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "URL IMAGE SOURCE",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL IMAGE NANOBANANA",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "URL IMAGE NANOBANANA",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL IMAGE SENDREAM",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "URL IMAGE SENDREAM",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL IMAGE CHATGPT",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "URL IMAGE CHATGPT",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL VIDEO 1",
"type": "string",
"display": true,
"required": false,
"displayName": "URL VIDEO 1",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL VIDEO 2",
"type": "string",
"display": true,
"required": false,
"displayName": "URL VIDEO 2",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL VIDEO 3",
"type": "string",
"display": true,
"required": false,
"displayName": "URL VIDEO 3",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL FINAL VIDEO",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "URL FINAL VIDEO",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "ADS TEXT",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "ADS TEXT",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "STATUS",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "STATUS",
"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": [
"ID IMAGE"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "id",
"value": "="
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "="
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "5cc81f6d-9160-4f2c-b72a-12f1e83c48fd",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
0
],
"parameters": {
"width": 528,
"height": 1728,
"content": "### \ud83c\udfa5 Watch This Tutorial\n\n@[youtube](E17rYpMRvgA)\n\n### \ud83d\udce5 [Open full documentation on Notion](https://automatisation.notion.site/Automate-video-ads-with-NanoBanana-Seedream-4-ChatGPT-Image-and-Veo-3-27e3d6550fd9800dbe46e6192bae60a9?source=copy_link)\n---\n### 1. Set Up OpenAI Connection\n#### Get Your API Key\n1. Visit the [OpenAI API Keys](https://platform.openai.com/api-keys) page. \n2. Go to [OpenAI Billing](https://platform.openai.com/settings/organization/billing/overview). \n3. Add funds to your billing account. \n4. Copy your API key into your **OpenAI credentials** in n8n (or your chosen platform). \n\n---\n### 2. Setup\n1. Import this workflow into your n8n instance. \n2. Connect your Google Sheets, Gmail, and Google Calendar credentials. Tutorial: [Configure Your Google Sheets, Gmail, Calendar Credentials](https://youtu.be/fDzVmdw7bNU) \n3. Connect Your Data in Google Sheets. Data must follow this format: [Sample Sheets Data](https://docs.google.com/spreadsheets/d/1SpahDHWishtviYiivRlShgIi_vtHUFLvtlxcxuXp1XU/copy) \n4. Test the workflow using the **Connected Chat Trigger** node to start conversations with the AI Agent. \n\n---\n### 3. Integrate \ud83e\udd16 VEO 3 (Kie) into n8n\n1. Sign up or log in to the **Kie (VEO 3)** dashboard. \n2. Go to **API Keys** \u2192 **Create new key** \u2192 copy the key (keep it secret). \n3. Base API URL: `https://api.kie.ai/api/v1/veo/generate`. \n\n---\n### 4. Integrate \ud83c\udf4c NanoBanana\n1. Go to the [NanoBanana API](https://fal.ai/models/fal-ai/nano-banana/edit/api). \n2. Sign in with your **FAL.ai** account. \n3. Create a new API key and copy it. \n4. In n8n, create new credentials \u2192 **HTTP Header Auth**. \n5. Add header: `Authorization: Bearer <YOUR_API_KEY>`. \n\n---\n### 5. Integrate \ud83c\udf0a Seedream 4.0\n1. Visit the [Seedream API](https://kie.ai/seedream-api). \n2. Sign in and create an API key from your dashboard. \n3. Base API endpoint: `https://api.kie.ai/api/v1/seedream/generate`. \n4. In n8n, add credentials \u2192 **HTTP Header Auth** with `Authorization: Bearer <YOUR_API_KEY>`. \n\n---\n### 6. Integrate \ud83e\udd16 ChatGPT Image\n1. Visit the [ChatGPT Image API documentation](https://docs.kie.ai/4o-image-api/get-4-o-image-details). \n2. Log in with your Kie.ai account. \n3. Generate a new API key. \n4. Base endpoint: `https://api.kie.ai/api/v1/image/generate`. \n5. Add this key in n8n under **HTTP Header Auth** \u2192 `Authorization: Bearer <YOUR_API_KEY>`. \n\n---\n### 7. Install the Blotato [Blotato](https://blotato.com/?ref=firas) Node in n8n (Community Nodes)\n1. In n8n, open **Settings \u2192 Community Nodes**. \n2. Click **Install**, then add: `@blotato/n8n-nodes-blotato`. \n3. Log in to **Blotato**. \n4. Go to **Settings \u2192 API Keys**. \n5. In n8n \u2192 **Credentials \u2192 New**. \n6. Choose **Blotato API** (provided by the community node you installed). \n\n---\n## \ud83d\udcec Need Help or Want to Customize This?\n**Contact me for consulting and support:** [LinkedIn](https://www.linkedin.com/in/dr-firas/) / [YouTube](https://www.youtube.com/@DRFIRASS) \n"
},
"typeVersion": 1
},
{
"id": "322f6e01-5427-480c-b781-7e81f0786674",
"name": "Split out \u2013 iterate image_prompt",
"type": "n8n-nodes-base.splitOut",
"position": [
2528,
272
],
"parameters": {
"options": {},
"fieldToSplitOut": "output.image_prompt"
},
"typeVersion": 1
},
{
"id": "9cde12f3-ef41-4e9f-a8cc-7ebc6d5a5666",
"name": "Wait \u2013 NanoBanana job",
"type": "n8n-nodes-base.wait",
"position": [
3104,
96
],
"parameters": {
"unit": "minutes",
"amount": 4
},
"typeVersion": 1.1
},
{
"id": "c7cc7666-4e3c-4c13-b3df-18e6410a445d",
"name": "Update URL Final video",
"type": "n8n-nodes-base.googleSheets",
"position": [
3680,
768
],
"parameters": {
"columns": {
"value": {
"STATUS": "VIDEO CREATED",
"ID IMAGE": "={{ $('Google Sheets \u2013 save image URLs').first().json['ID IMAGE'] }}",
"URL FINAL VIDEO": "={{ $json.video.url }}"
},
"schema": [
{
"id": "ID IMAGE",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "ID IMAGE",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL IMAGE SOURCE",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "URL IMAGE SOURCE",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL IMAGE NANOBANANA",
"ty
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.
blotatoApigoogleDriveOAuth2ApigoogleSheetsOAuth2ApihttpHeaderAuthopenAiApitelegramApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
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 consistent, high-quality video ads for social media without spending hours on manual…
Source: https://n8n.io/workflows/9200/ — 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.
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.
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.