AutomationFlowsAI & RAG › Generate UGC Product Video Ads from Reference Image

Generate UGC Product Video Ads from Reference Image

Original n8n title: Generate Ugc Product Video Ads From a Reference Image with Openai and Kie.ai

ByJannik Hiller @jannik-mtm on n8n.io

How it works Analyzes a reference product image using AI vision to extract brand elements, colors, and design Generates UGC-style prompts for image and video creation based on your specifications Calls external APIs to generate product images and videos at scale Polls for…

Event trigger★★★★★ complexityAI-powered34 nodesOpenAIOpenAI ChatOutput Parser StructuredBoxGoogle DriveTool ThinkAgentHTTP Request
AI & RAG Trigger: Event Nodes: 34 Complexity: ★★★★★ AI nodes: yes Added:

This workflow corresponds to n8n.io template #11701 — 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
{
  "nodes": [
    {
      "id": "51750529-e61f-4f6c-aa4b-20b4694a3988",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -768,
        432
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "c8a90a2e-d9b8-4543-881f-6b93c891b456",
      "name": "Analyze image",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        -96,
        432
      ],
      "parameters": {
        "text": "Return the analysis in YAML format with the following fields:\n\nbrand_name: (Name of the brand shown in the image, if visible or inferable)\ncolor_scheme:\n  - hex: (Hex code of each prominent color used)\n    name: (Descriptive name of the color)\nfont_style: (Describe the font family or style used: serif/sans-serif, bold/thin, etc.)\nvisual_description: (A full sentence or two summarizing what is seen in the image, ignoring the background)\n\nOnly return the YAML. Do not explain or add any other comments.",
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "chatgpt-4o-latest",
          "cachedResultName": "CHATGPT-4O-LATEST"
        },
        "options": {},
        "resource": "image",
        "simplify": false,
        "imageUrls": "=https://drive.google.com/uc?export=download&id={{ $('Setup (Image & Video settings)').item.json['googledrive link reference image'].match(/https:\\/\\/drive\\.google\\.com\\/file\\/d\\/([A-Za-z0-9_-]+)/)?.[1] }}",
        "operation": "analyze"
      },
      "typeVersion": 1.8
    },
    {
      "id": "a9442908-6903-4be5-b1a4-b81b02b1da5e",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        144,
        656
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1",
          "cachedResultName": "gpt-4.1"
        },
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "02f750e9-a228-44ec-ba78-b46108dadf2b",
      "name": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        400,
        656
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"scenes\": [\n    {\n      \"image_prompt\": \"emotion: [string]\\naction: [string]\\ncharacter: [string]\\nsetting: [string]\\ncamera: [string]\\nstyle: [string]\", \n      \"video_prompt\": \"dialogue: [string]\\nemotion: [string]\\nvoice_type: [string]\\naction: [string]\\ncharacter: [string]\\nsetting: [string]\\ncamera: [string]\", \n      \"aspect_ratio_video\": \"[9:16 or 16:9]\", \n      \"aspect_ratio_image\": \"[3:2 or 2:3]\", \n      \"model\": \"[veo3 or veo3_fast]\"\n    }\n  ]\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "8ebbe123-b5f9-4f0f-abc2-f15c4910ef60",
      "name": "Upload a file",
      "type": "n8n-nodes-base.box",
      "position": [
        3072,
        336
      ],
      "parameters": {
        "fileName": "={{ $('Retrieve generated video1').item.json.data.taskId }}.mp4",
        "binaryData": true
      },
      "typeVersion": 1
    },
    {
      "id": "f4273123-8b1c-4826-874a-8148adb7087e",
      "name": "Upload file",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        3072,
        528
      ],
      "parameters": {
        "name": "={{ $json['data.response.resultUrls[0]'] }} ",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "1AyXY9wyFsiVbgdXfVB8Rhv1ksb64M_LO",
          "cachedResultUrl": "https://drive.google.com/drive/folders/1AyXY9wyFsiVbgdXfVB8Rhv1ksb64M_LO",
          "cachedResultName": "8 sec Script Vids Bonsai"
        },
        "inputDataFieldName": "=data"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "291deead-2116-4d0f-99f4-1f68979a6962",
      "name": "Image Generation Loop",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        560,
        320
      ],
      "parameters": {
        "color": 6,
        "width": 1104,
        "height": 432,
        "content": "## Image Generation Loop\n\nGenerates keyframe images using Kie.ai API. Each image serves as the first frame for video generation."
      },
      "typeVersion": 1
    },
    {
      "id": "630b4978-8274-453b-880d-01318e7380c3",
      "name": "Video Generation Loop",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1664,
        320
      ],
      "parameters": {
        "color": 6,
        "width": 1296,
        "height": 432,
        "content": "## Video Generation Loop\n\nGenerates AI videos using the keyframes and dialogue. Downloads final video files."
      },
      "typeVersion": 1
    },
    {
      "id": "ad9ce726-c70c-48c7-947d-fb6ebc19e2e7",
      "name": "Validate prompt generation",
      "type": "@n8n/n8n-nodes-langchain.toolThink",
      "position": [
        272,
        672
      ],
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "56674795-213e-421d-ab61-5df97b8161c5",
      "name": "\ud83d\udccb Overview: Scale product videos with AI-generated UGC content",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1392,
        -128
      ],
      "parameters": {
        "color": "yellow",
        "width": 480,
        "height": 752,
        "content": "## Scale product videos with AI-generated UGC content\n\nThis workflow automates the creation of UGC-style product videos at scale. It analyzes a reference image, generates AI prompts for image and video creation, calls external APIs to generate media, and uploads the final videos to cloud storage with tracking.\n\n### How it works\n1. Upload a reference product image and specify video count\n2. AI analyzes the image and generates UGC-style prompts\n3. Calls image generation API to create product visuals\n4. Calls video generation API to create UGC-style videos\n5. Polls for completion and retrieves generated files\n6. Uploads videos to Box and Google Drive\n7. Logs all results to Google Sheets\n\n### Setup steps\n1. Connect OpenAI credentials for image analysis\n2. Configure image generation API credentials\n3. Configure video generation API credentials\n4. Connect Google Drive and Box for file uploads\n5. Connect Google Sheets for result tracking\n6. Update reference image link in Setup node"
      },
      "typeVersion": 1
    },
    {
      "id": "ed6ed6e3-6d78-4e6e-938d-f8445fbdc1df",
      "name": "Stage 1: Setup and image analysis",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -800,
        160
      ],
      "parameters": {
        "color": 7,
        "width": 832,
        "height": 464,
        "content": "## Stage 1: Setup and image analysis\n\nConfigures workflow variables and analyzes reference product image using OpenAI vision to extract brand, colors, and visual elements."
      },
      "typeVersion": 1
    },
    {
      "id": "71c48a15-5b09-4b9f-8f8f-017dc2e117ff",
      "name": "Stage 2: Prompt generation",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        32,
        160
      ],
      "parameters": {
        "color": 7,
        "width": 528,
        "height": 656,
        "content": "## Stage 2: Prompt generation\n\nUses AI agent to generate UGC-style prompts for image and video creation based on analysis, user preferences, and dialogue script."
      },
      "typeVersion": 1
    },
    {
      "id": "65015456-f371-403a-b301-bf2850102abc",
      "name": "Stage 3: Media generation and polling",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        560,
        176
      ],
      "parameters": {
        "color": 7,
        "width": 2400,
        "height": 704,
        "content": "## Stage 3: Media generation and polling\n\nCalls image and video generation APIs with generated prompts. Polls for completion status and retrieves generated media files."
      },
      "typeVersion": 1
    },
    {
      "id": "2145cd6c-fa93-45ce-9e98-d6edd79283db",
      "name": "Stage 4: Upload and tracking",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2960,
        176
      ],
      "parameters": {
        "color": 7,
        "width": 1264,
        "height": 704,
        "content": "## Stage 4: Upload and tracking\n\nUploads generated videos to Box and Google Drive. Logs all generation results and file locations to Google Sheets for tracking."
      },
      "typeVersion": 1
    },
    {
      "id": "ca10a0e9-310d-4d32-8964-5eb00536a4a5",
      "name": "Video script",
      "type": "n8n-nodes-base.set",
      "position": [
        -544,
        432
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "527483de-cf41-480e-b4e1-79fe4bd3d712",
              "name": "Script",
              "type": "string",
              "value": "\"It\u2019s airy, pre-mixed, and holds just the right moisture. Now my orchid blooms nonstop... and it actually feels easy.\""
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "94078249-6e86-4ef7-995e-971b91d055f6",
      "name": "Setup (Image & Video settings)",
      "type": "n8n-nodes-base.set",
      "position": [
        -320,
        432
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "933c1e54-08a4-4da0-9f4f-42dbb90d9853",
              "name": "googledrive link reference image",
              "type": "string",
              "value": "https://drive.google.com/file/d/1LVZ7zNSkJQnCpQYboZzv0gYXKVvInrv_/view?usp=drive_link"
            },
            {
              "id": "6d1a58c9-d775-42e0-b066-d00dda3b40e9",
              "name": "how many videos?",
              "type": "string",
              "value": "7"
            },
            {
              "id": "a44b9ee9-da35-47ce-8ec6-8530b5d30c91",
              "name": "dialouge",
              "type": "string",
              "value": "=It is EXTREMLY IMPORTANT that the Person follow this exact script! I want the person to say EXACTLY this:\n{{ $json.Script }}"
            },
            {
              "id": "81fc99fe-10f7-4f0d-b791-3e4a4b9d9804",
              "name": "model",
              "type": "string",
              "value": "veo3_fast"
            },
            {
              "id": "56d0aa2b-7ffb-49a3-add8-748b79e2d5de",
              "name": "aspec_ratio",
              "type": "string",
              "value": "vertical"
            },
            {
              "id": "d637e52c-a449-4ad4-9eee-cfd8e288a356",
              "name": "any special requirements?",
              "type": "string",
              "value": "For this run - I want normal & casual looking people. \n\nI want the actors in the video to be 40 to 60 years old.\n\nHave diversity in the actors' gender. Choose with the following probability distribution:\n\nGender: \n30% Male\n70% Women\n\nEthnicity:\n10% black\n20% Asian\n10% else\n60% white\n\nNo subtitles!\n\n***\nAlso I want diversity in the scenes from below, choose with the following probability distribution::\n\n10%: Car - Parked car during daytime with sunlight streaming through the side window, visible back seats and partial road outside.\n\n45%: Garden \u2013 A lush home garden with greenery, flowers, and sunlight filtering through trees, creating a warm and relatable lifestyle setting.\n\n45%: Brightly Lit Living Room \u2013 A clean, modern living space with large windows, natural light streaming in, and a cozy, aspirational home\u00a0atmosphere.\n"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "0b1d9845-f41d-4d03-a52c-0019caf7fa56",
      "name": "Generate UGC prompts with AI agent1",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        192,
        432
      ],
      "parameters": {
        "text": "=Your task: Create image and video prompts as guided by your system guidelines. \n\nMake sure that the reference image is depicted as ACCURATELY as possible in the resulting images, especially all text. \n\n***\n\nCount of videos to create: \n{{ $('Setup (Image & Video settings)').item.json['how many videos?'] }}\n***\n\nDescription of the reference image: \n{{ $json.choices[0].message.content }}\n\n***\n\nThe user's preferred aspect ratio: \n{{ $('Setup (Image & Video settings)').item.json.aspec_ratio }}\n\nThe user's preferred model:\n{{ $('Setup (Image & Video settings)').item.json.model }}\n\nThe user's preferred dialogue script: \n{{ $('Setup (Image & Video settings)').item.json.dialouge }}\n\nOther special requests from the user:\n{{ $('Setup (Image & Video settings)').item.json['any special requirements?'] }}\n\n***\nUse the Think tool to double check your output",
        "options": {
          "systemMessage": "=system_prompt: |\n  ## SYSTEM PROMPT: UGC-Style Veo3/Veo3_fast Prompt Generator\n\n  You are a UGC (User-Generated Content) AI agent. \n\n  Your task: Take the reference image or the product in the reference image and place it into realistic, casual scenes as if captured by everyday content creators or influencers. \n\n  All outputs must feel **natural, candid, and unpolished** \u2013 avoiding professional or overly staged looks. This means: \n\n  \u2013 Everyday realism with authentic, relatable settings \n  \u2013 Amateur-quality iPhone photo/video style \n  \u2013 Slightly imperfect framing and lighting \n  \u2013 Candid poses and genuine expressions \n  \u2013 Visible imperfections (blemishes, messy hair, uneven skin) \n  \u2013 Real-world environments left as-is (clutter, busy backgrounds)\n\nWe need these videos to look natural and real. So in the prompts, have the Camera parameter always use keywords like these: unremarkable amateur iPhone photos, reddit image, snapchat video, Casual iPhone selfie, slightly uneven framing, Authentic share, slightly blurry, Amateur quality phone photo \n\nIf the dialogue is not provided by the user or you are explicitly asked to create it, generate a casual, conversational line under 200 characters, as if a person were speaking naturally to a friend while talking about the product. Avoid overly formal or sales-like language. The tone should feel authentic, spontaneous, and relatable, matching the UGC style. For example: So TikTok made me buy this... and it turns out it's the best tasting fruit beer in Sydney? And they donate their profits to charity! And you know what it's honestly really good! \n\nIf the dialogue is provided by the user, it is EXTREMLY important that the person say this exact text!\n\nFor the dialogue, use ... to indicate pauses, and avoid special characters like em dashes or hyphens \n\nIMPORTANT: Do not use double quotes in the image and video prompts \n\nA - Ask: \n  Generate image and video generation instructions for AI image and video generation models based on the user\u2019s request, ensuring exact YAML format for both image and video prompts. Infer aspect ratios from vertical/horizontal context; default to vertical if unspecified. \n\n  **Scene count rule:** Read the user\u2019s requested number of video (an explicit integer) and output **exactly that many** scenes. If the user does not specify a number, default to **1 scene**. Never output more or fewer scenes than requested.\n\nG - Guidance: \n- Always follow UGC-style casual realism principles listed above. \n- Ensure diversity in gender, ethnicity, and hair color when applicable. Default to actors in 21 to 38 years old unless specified otherwise. \n- Use provided scene list when available. \n- Avoid double quotes in the image and video prompts \n\nE - Examples: \ngood_examples: \n  - \n    { \n      \"scenes\": [ \n        { \n          \"image_prompt\": \"action: Character is sitting in the driver's seat, smiling openly while looking at the camera\\ncharacter: Mid-20s blonde female with long straight hair, wearing a plain light-colored t-shirt, natural facial features with minimal makeup\\nsetting: Inside a parked car during daytime, sunlight streaming in from the side window, visible back seats and partial view of the road outside\\ncamera: Casual iPhone selfie, slightly uneven framing, natural lighting with mild overexposure on one side of the face from direct sunlight\\nstyle: Very casual and candid, unposed, authentic expression with friendly and cheerful emotion\", \n          \"video_prompt\": \"dialogue: 'So TikTok made me buy this... and it turns out it's the best tasting fruit beer in Sydney? And they donate their profits to charity! And you know what, it's honestly really good!'\\naction: Character sits in the driver's seat of a parked car, holding the beer can close to the camera while speaking the dialogue with a casual, friendly tone\\ncamera: Amateur-quality iPhone video, natural daylight coming through the side window, steady framing from a handheld position\\nemotion: Very happy and energetic, genuine enthusiasm and friendliness while talking about the beer\", \n          \"aspect_ratio_video\": \"9:16\", \n          \"aspect_ratio_image\": \"2:3\", \n          \"model\": \"veo3\" \n        } \n      ] \n    } \n\nN - Notation: \n- Final output is a \"scenes\" array at the root level. \n- The array must contain **exactly `scene_count`** objects, where `scene_count` is the user-specified number (or 1 if unspecified). \n- Each scene contains: \n  - `image_prompt` -> stringified YAML with: emotion, action, character, setting, camera, style \n  - `video_prompt` -> stringified YAML with: dialogue, emotion, voice_type, action, character, setting, camera\n- aspect_ratio_video -> \"9:16\" or \"16:9\" (default vertical -> 9:16) \n- aspect_ratio_image -> \"3:2\" or \"2:3\" (default vertical -> 2:3) \n- model -> \"veo3\" or \"veo3_fast\" \n\nT - Tools: \n- Think Tool: Double-check output for completeness, diversity, adherence to style, and that the number of scenes exactly matches the requested count.\n"
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "166b7a05-5f56-4151-bef3-b0b5895bdcb7",
      "name": "Process image prompts1",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        608,
        432
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "output.scenes"
      },
      "typeVersion": 1
    },
    {
      "id": "e3b037c6-4ca0-4ce3-95b4-7edf9bff39c4",
      "name": "Call image generation API1",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        832,
        432
      ],
      "parameters": {
        "url": "https://api.kie.ai/api/v1/gpt4o-image/generate",
        "method": "POST",
        "options": {
          "batching": {
            "batch": {
              "batchSize": 1,
              "batchInterval": 5000
            }
          }
        },
        "jsonBody": "={\n  \"filesUrl\": [\n    \"https://drive.google.com/uc?export=download&id={{ $('Setup (Image & Video settings)').item.json['googledrive link reference image'].match(/https:\\/\\/drive\\.google\\.com\\/file\\/d\\/([A-Za-z0-9_-]+)/)?.[1] }}\"\n  ],\n  \"prompt\": \"{{ $json.image_prompt.replace(/\\\"/g, '\\\\\\\"').replace(/\\n/g, '\\\\\\\\n') }}\",\n  \"size\": \"{{ $json.aspect_ratio_image }}\",\n  \"nVariants\": 1\n}\n",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpBearerAuth"
      },
      "typeVersion": 4.2
    },
    {
      "id": "9c2ad1c9-879f-4d51-9c0c-be35aff3dd1f",
      "name": "Wait for image generation1",
      "type": "n8n-nodes-base.wait",
      "position": [
        1056,
        432
      ],
      "parameters": {
        "unit": "minutes"
      },
      "typeVersion": 1.1
    },
    {
      "id": "0e7e4399-ae1e-47a3-b981-d7da900e1700",
      "name": "Retrieve generated image1",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1280,
        368
      ],
      "parameters": {
        "url": "https://api.kie.ai/api/v1/gpt4o-image/record-info",
        "options": {},
        "sendBody": true,
        "sendQuery": true,
        "authentication": "genericCredentialType",
        "bodyParameters": {
          "parameters": [
            {}
          ]
        },
        "genericAuthType": "httpBearerAuth",
        "queryParameters": {
          "parameters": [
            {
              "name": "taskId",
              "value": "={{ $('Call image generation API1').item.json.data.taskId }}"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "3aef6c2b-3741-403f-9698-739afa74f25d",
      "name": "Check if image is ready1",
      "type": "n8n-nodes-base.if",
      "position": [
        1504,
        432
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "01efc4df-577c-4388-b64a-3695a6da43ef",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.data.status }}",
              "rightValue": "=SUCCESS"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "2d32c267-4a3c-47b2-b46f-cdfc01e9a4c9",
      "name": "Call video generation API1",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1728,
        432
      ],
      "parameters": {
        "url": "https://api.kie.ai/api/v1/veo/generate",
        "body": "={\n\"prompt\": \"{{ $('Process image prompts1').item.json.video_prompt.replace(/\\n/g, '\\\\n').replace(/\"/g, '\\\\\"') }}\",\n  \"model\": \"{{ $('Process image prompts1').item.json.model }}\",\n  \"aspectRatio\": \"{{ $('Process image prompts1').item.json.aspect_ratio_video }}\",\n  \"imageUrls\": \"{{ $('Retrieve generated image1').item.json.data.response.resultUrls[0] }}\"\n}\n",
        "method": "POST",
        "options": {
          "batching": {
            "batch": {
              "batchSize": 1,
              "batchInterval": 5000
            }
          }
        },
        "sendBody": true,
        "contentType": "raw",
        "authentication": "genericCredentialType",
        "rawContentType": "application/json",
        "genericAuthType": "httpBearerAuth"
      },
      "typeVersion": 4.2
    },
    {
      "id": "dc567de4-bc01-4a54-bd09-8e70028af0b9",
      "name": "Wait for video generation1",
      "type": "n8n-nodes-base.wait",
      "position": [
        1952,
        432
      ],
      "parameters": {
        "amount": 800
      },
      "typeVersion": 1.1
    },
    {
      "id": "6f7e23a3-0098-4fc5-b5b2-a5ffce9d6e20",
      "name": "Retrieve generated video1",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2176,
        368
      ],
      "parameters": {
        "url": "https://api.kie.ai/api/v1/veo/record-info",
        "options": {},
        "sendQuery": true,
        "authentication": "genericCredentialType",
        "genericAuthType": "httpBearerAuth",
        "queryParameters": {
          "parameters": [
            {
              "name": "taskId",
              "value": "={{ $json.data.taskId }}"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "b3da9556-94e0-43e7-858d-b6886d43920f",
      "name": "Check if video is ready1",
      "type": "n8n-nodes-base.if",
      "position": [
        2400,
        432
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "e26f3c62-ef38-4f8c-bfc6-48522448498c",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.msg }}",
              "rightValue": "success"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "77c153b3-376e-480d-813d-7e644f147662",
      "name": "Process video files1",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        2624,
        432
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "data.response.resultUrls[0]"
      },
      "typeVersion": 1
    },
    {
      "id": "61bddfc7-7ff8-4ddf-ab59-d65db0a8dc79",
      "name": "Retrieve video file list1",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2848,
        432
      ],
      "parameters": {
        "url": "={{ $json['data.response.resultUrls[0]'] }}",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "695c971a-bbdd-44b0-8b93-f64ae4ece9e4",
      "name": "Put files together",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        3296,
        528
      ],
      "parameters": {
        "options": {},
        "fieldsToAggregate": {
          "fieldToAggregate": [
            {
              "fieldToAggregate": "webViewLink"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "81a58d54-1062-4315-b676-605695d04266",
      "name": "Fetch video generation logs1",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        3520,
        528
      ],
      "parameters": {
        "options": {},
        "filtersUI": {
          "values": [
            {
              "lookupValue": "for production",
              "lookupColumn": "Status"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 107294555,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/17eJzHuXXpUr4i3QSk6S48gYToNdos1VLUOu18ndrDVU/edit#gid=107294555",
          "cachedResultName": "Orchid"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "17eJzHuXXpUr4i3QSk6S48gYToNdos1VLUOu18ndrDVU",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/17eJzHuXXpUr4i3QSk6S48gYToNdos1VLUOu18ndrDVU/edit?usp=drivesdk",
          "cachedResultName": "UGC Ad Center - Bonsai Soil"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "3e9a5688-4f9c-4daa-bd1e-b0bc551c2854",
      "name": "Route based on output type1",
      "type": "n8n-nodes-base.switch",
      "position": [
        3744,
        512
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "Speaker 1",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "4da3ceac-8bcd-47fc-8449-e1a3b3dab716",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $('Video script').item.json.Script }}",
                    "rightValue": "={{ $json['Hook - Speaker 1'] }}"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Speaker 2",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "ed28a6fa-b3a8-463a-b208-e04de682caa7",
                    "operator": {
                      "name": "filter.operator.equals",
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $('Video script').item.json.Script }}",
                    "rightValue": "={{ $json['Speaker 2'] }}"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Speaker 3",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "fd1bafe2-c967-4aff-829d-7377e6ef81cd",
                    "operator": {
                      "name": "filter.operator.equals",
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $('Video script').item.json.Script }}",
                    "rightValue": "={{ $json['Speaker 3'] }}"
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "6c37808a-8a80-4fdb-b606-ac25cc7cc216",
      "name": "Log image generation status1",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        3968,
        336
      ],
      "parameters": {
        "columns": {
          "value": {
            "Status": "for production",
            "Video 1": "={{ $('Put files together').item.json.webViewLink[0] }}\n\n{{ $('Put files together').item.json.webViewLink[1] }}\n\n{{ $('Put files together').item.json.webViewLink[2] }}\n\n{{ $('Put files together').item.json.webViewLink[3] }}\n\n{{ $('Put files together').item.json.webViewLink[4] }}\n\n{{ $('Put files together').item.json.webViewLink[5] }}\n\n{{ $('Put files together').item.json.webViewLink[6] }}"
          },
          "schema": [
            {
              "id": "Hook - Speaker 1",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Hook - Speaker 1",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Speaker 2",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Speaker 2",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Speaker 3",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Speaker 3",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Video 1",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Video 1",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Video 2",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Video 2",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Video 3",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Video 3",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Final Video",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Final Video",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Status",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Partially Disapproved",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Partially Disapproved",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Feedback/ Notes",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Feedback/ Notes",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Approved",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Approved",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Disapproved",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Disapproved",
              "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": [
            "Status"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 107294555,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/17eJzHuXXpUr4i3QSk6S48gYToNdos1VLUOu18ndrDVU/edit#gid=107294555",
          "cachedResultName": "Orchid"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "17eJzHuXXpUr4i3QSk6S48gYToNdos1VLUOu18ndrDVU",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/17eJzHuXXpUr4i3QSk6S48gYToNdos1VLUOu18ndrDVU/edit?usp=drivesdk",
          "cachedResultName": "UGC Ad Center - Bonsai Soil"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "bafaabe7-d221-437a-9209-ac729c90613e",
      "name": "Log video generation status1",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        3968,
        528
      ],
      "parameters": {
        "columns": {
          "value": {
            "Status": "for production",
            "Video 2": "={{ $('Put files together').item.json.webViewLink[0] }}\n\n{{ $('Put files together').item.json.webViewLink[1] }}\n\n{{ $('Put files together').item.json.webViewLink[2] }}\n\n{{ $('Put files together').item.json.webViewLink[3] }}\n\n{{ $('Put files together').item.json.webViewLink[4] }}\n\n{{ $('Put files together').item.json.webViewLink[5] }}\n\n{{ $('Put files together').item.json.webViewLink[6] }}"
          },
          "schema": [
            {
              "id": "Hook - Speaker 1",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Hook - Speaker 1",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Speaker 2",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Speaker 2",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Speaker 3",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Speaker 3",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Video 1",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Video 1",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Video 2",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Video 2",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Video 3",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Video 3",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Final Video",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Final Video",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Status",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Feedback/ Notes",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Feedback/ Notes",
              "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": [
            "Status"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 107294555,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/17eJzHuXXpUr4i3QSk6S48gYToNdos1VLUOu18ndrDVU/edit#gid=107294555",
          "cachedResultName": "Orchid"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "17eJzHuXXpUr4i3QSk6S48gYToNdos1VLUOu18ndrDVU",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/17eJzHuXXpUr4i3QSk6S48gYToNdos1VLUOu18ndrDVU/edit?usp=drivesdk",
          "cachedResultName": "UGC Ad Center - Bonsai Soil"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "e7a2c585-4921-4bc0-9bac-b3bdf1d83c07",
      "name": "Update final results1",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        3968,
        720
      ],
      "parameters": {
        "columns": {
          "value": {
            "Status": "for production",
            "Video 3": "={{ $('Put files together').item.json.webViewLink[0] }}\n\n{{ $('Put files together').item.json.webViewLink[1] }}\n\n{{ $('Put files together').item.json.webViewLink[2] }}\n\n{{ $('Put files together').item.json.webViewLink[3] }}\n\n{{ $('Put files together').item.json.webViewLink[4] }}\n\n{{ $('Put files together').item.json.webViewLink[5] }}\n\n{{ $('Put files together').item.json.webViewLink[6] }}"
          },
          "schema": [
            {
              "id": "Hook - Speaker 1",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Hook - Speaker 1",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Speaker 2",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Speaker 2",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Speaker 3",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Speaker 3",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Video 1",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Video 1",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Video 2",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Video 2",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Video 3",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Video 3",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Final Video",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Final Video",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Status",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Approved",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Approved",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Send to Mica",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Send to Mica",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Partially Disapproved   ",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Partially Disapproved   ",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Feedback/ Notes",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Feedback/ Notes",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Disapproved",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Disapproved",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Feedback/ Notes",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Feedback/ Notes",
              "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": [
            "Status"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 107294555,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/17eJzHuXXpUr4i3QSk6S48gYToNdos1VLUOu18ndrDVU/edit#gid=107294555",
          "cachedResultName": "Orchid"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "17eJzHuXXpUr4i3QSk6S48gYToNdos1VLUOu18ndrDVU",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/17eJzHuXXpUr4i3QSk6S48gYToNdos1VLUOu18ndrDVU/edit?usp=drivesdk",
          "cachedResultName": "UGC Ad Center - Bonsai Soil"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    }
  ],
  "connections": {
    "Upload file": {
      "main": [
        [
          {
            "node": "Put files together",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Video script": {
      "main": [
        [
          {
            "node": "Setup (Image & Video settings)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analyze image": {
      "main": [
        [
          {
            "node": "Generate UGC prompts with AI agent1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Generate UGC prompts with AI agent1",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Put files together": {
      "main": [
        [
          {
            "node": "Fetch video generation logs1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process video files1": {
      "main": [
        [
          {
            "node": "Retrieve video file list1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process image prompts1": {
      "main": [
        [
          {
            "node": "Call image generation API1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check if image is ready1": {
      "main": [
        [
          {
            "node": "Call video generation API1",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait for image generation1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check if video is ready1": {
      "main": [
        [
          {
            "node": "Process video files1",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait for video generation1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "Generate UGC prompts with AI agent1",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Retrieve generated image1": {
      "main": [
        [
          {
            "node": "Check if image is ready1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Retrieve generated video1": {
      "main": [
        [
          {
            "node": "Check if video is ready1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Retrieve video file list1": {
      "main": [
        [
          {
            "node": "Upload a file",
            "type": "main",
            "index": 0
          },
          {
            "node": "Upload file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Call image generation API1": {
      "main": [
        [
          {
            "node": "Wait for image generation1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Call video generation API1": {
      "main": [
        [
          {
            "node": "Wait for video generation1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Validate prompt generation": {
      "ai_tool": [
        [
          {
            "node": "Generate UGC prompts with AI agent1",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Wait for image generation1": {
      "main": [
        [
          {
            "node": "Retrieve generated image1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait for video generation1": {
      "main": [
        [
          {
            "node": "Retrieve generated video1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Route based on output type1": {
      "main": [
        [
          {
            "node": "Log image generation status1",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Log video generation status1",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Update final results1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch video generation logs1": {
      "main": [
        [
          {
            "node": "Route based on output type1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Setup (Image & Video settings)": {
      "main": [
        [
          {
            "node": "Analyze image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate UGC prompts with AI agent1": {
      "main": [
        [
          {
            "node": "Process image prompts1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Video script",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

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

About this workflow

How it works Analyzes a reference product image using AI vision to extract brand elements, colors, and design Generates UGC-style prompts for image and video creation based on your specifications Calls external APIs to generate product images and videos at scale Polls for…

Source: https://n8n.io/workflows/11701/ — 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

The best content automation template in the market is now even better—with “deep research” on time-sensitive topics\! Unlike most n8n content automation templates that are mainly for “demo purposes,”

OpenAI, HTTP Request, XML +11
AI & RAG

This template is designed for marketers, content creators, and e-commerce brands who want to automate the creation of professional ad videos at scale. It’s ideal for teams looking to generate consiste

Telegram, Telegram Trigger, Google Drive +8
AI & RAG

This comprehensive n8n workflow automates the entire Meta (Facebook/Instagram) advertising process, from asset analysis to ad creation. It combines AI-powered content analysis with automated ad deploy

Facebook Graph Api, HTTP Request, Google Drive +5