AutomationFlowsAI & RAG › Telegram → Google Drive: AI Video Ad Campaign Automation

Telegram → Google Drive: AI Video Ad Campaign Automation

Original n8n title: Automate & Publish Video Ad Campaigns with Nanobanana, Seedream, Gpt-4o, Veo 3

ByDr. Firas @drfiras on n8n.io

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…

Event trigger★★★★★ complexityAI-powered63 nodesTelegramTelegram TriggerGoogle DriveAgentOutput Parser StructuredTool ThinkOpenAI ChatHTTP Request
AI & RAG Trigger: Event Nodes: 63 Complexity: ★★★★★ AI nodes: yes Added:

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 →

Download .json
{
  "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.

Pro

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 →

More AI & RAG workflows → · Browse all categories →

Related workflows

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

AI & RAG

🎯 Create viral TikToks, Shorts, Reels, podcasts, and ASMR videos in minutes — all on autopilot.

OpenAI, HTTP Request, Form Trigger +7
AI & RAG

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.

@Blotato/N8N Nodes Blotato, Google Sheets, OpenAI Chat +9
AI & RAG

RAG CHATBOT Main. Uses telegram, telegramTrigger, lmChatOpenAi, n8n-nodes-mcp. Event-driven trigger; 87 nodes.

Telegram, Telegram Trigger, OpenAI Chat +8
AI & RAG

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.

Telegram, Agent Tool, Telegram Trigger +5
AI & RAG

Product to Social Video (xCodeWraith Edition). Uses telegram, agentTool, telegramTrigger, httpRequest. Event-driven trigger; 83 nodes.

Telegram, Agent Tool, Telegram Trigger +5