This workflow corresponds to n8n.io template #8859 — we link there as the canonical source.
This workflow follows the Agent → Google Drive recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "pyErkv743Qswub8C",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Multi_Ad_Image",
"tags": [],
"nodes": [
{
"id": "1c6ff80d-c6dc-485d-9708-38b9f7af4961",
"name": "When clicking \u2018Execute workflow\u2019",
"type": "n8n-nodes-base.manualTrigger",
"position": [
304,
176
],
"parameters": {},
"typeVersion": 1
},
{
"id": "0ebd375b-d9c4-4ae0-90ac-5295b788a253",
"name": "Get row(s) in sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
480,
176
],
"parameters": {
"options": {},
"filtersUI": {
"values": [
{
"lookupValue": "Create",
"lookupColumn": "status"
}
]
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1XAKLXfhRqPB7RjA8neUHYGwF4FKpM38edJUONHxt9pE/edit#gid=0",
"cachedResultName": "product"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1XAKLXfhRqPB7RjA8neUHYGwF4FKpM38edJUONHxt9pE",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1XAKLXfhRqPB7RjA8neUHYGwF4FKpM38edJUONHxt9pE/edit?usp=drivesdk",
"cachedResultName": "n8n_Multi_Ad_Image"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "e982d7e4-dced-4897-85cf-708e09d5bc4e",
"name": "Analyze image",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
816,
176
],
"parameters": {
"text": "=You are an AI system specialized in **image analysis for advertising**. \nYour task is to carefully analyze the given product image and generate \nstructured insights that will later be used to create high-quality \nadvertising prompts.\n\n### Instructions:\n1. **Identify Product** \n - Type of product (e.g., sneakers, skincare, electronics). \n - Key visible features (color, shape, size, packaging). \n - Materials or textures that can be inferred. \n\n2. **Branding & Style** \n - Any visible logos, brand elements, or design patterns. \n - Style impression (luxury, casual, eco-friendly, tech-oriented). \n\n3. **Target Audience Guess** \n - Suggest who the product might appeal to (young adults, parents, professionals, etc.). \n\n4. **Ad Creative Angles (3\u20135 ideas)** \n - Marketing hooks inspired by the image. \n - Focus on visual storytelling (e.g., \u201cminimalist lifestyle shot\u201d, \u201cdynamic sports action scene\u201d). \n\n5. **Output Format (JSON)** \n ```json\n {\n \"product_type\": \"...\",\n \"features\": [\"...\", \"...\"],\n \"style\": \"...\",\n \"target_audience\": \"...\",\n \"ad_angles\": [\n \"Ad idea 1\",\n \"Ad idea 2\",\n \"Ad idea 3\",\n \"Ad idea 4\",\n \"Ad idea 5\"\n ]\n }\n",
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini",
"cachedResultName": "GPT-4O-MINI"
},
"options": {},
"resource": "image",
"inputType": "base64",
"operation": "analyze"
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.8
},
{
"id": "dcb3134c-a3aa-4384-9f37-e59ea93472f7",
"name": "Download file",
"type": "n8n-nodes-base.googleDrive",
"position": [
640,
176
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "url",
"value": "={{ $json.product_image_url }}"
},
"options": {},
"operation": "download"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "c87947e9-97eb-4758-b18c-bf14cc232573",
"name": "AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
1024,
176
],
"parameters": {
"text": "=You will receive a real product image and its short description. \nAnalyze them and generate exactly {{ $('Get row(s) in sheet').item.json.num_variations }} distinct, production-ready advertising image prompts.\nIf a campaign is provided, weave its seasonal or promotional context into the prompts naturally. \nIf campaign is empty or \"none\", ignore it.\n\n=== INPUTS ===\n- Product Image URL: {{ $('Get row(s) in sheet').item.json.product_image_url }}\n- Product Name: {{ $('Get row(s) in sheet').item.json.product_name }}\n- Product Description: \"{{ $('Get row(s) in sheet').item.json.product_description }}\"\n- Campaign (optional): {{ $('Get row(s) in sheet').item.json.campaign }} // e.g., \"8.8\", \"10.10\", \"Songkran\", \"Halloween\", \"none\"\n- Target Model: {{ $('Get row(s) in sheet').item.json.model_target }} // e.g., \"SDXL\", \"Midjourney\", \"Flux\", \"Veo\"\n- Aspect Ratio: {{ $('Get row(s) in sheet').item.json.aspect_ratio }} // e.g., \"1:1\", \"4:5\", \"16:9\"\n- Number of Variations (N): {{ $('Get row(s) in sheet').item.json.num_variations }}\n- Brand Guidelines (optional): {{ $('Get row(s) in sheet').item.json.brand_notes }} // e.g., brand palette hex codes, keep logo visible, avoid surreal\n- Creative Constraints (optional): {{ $('Get row(s) in sheet').item.json.constraints }} // e.g., \"no people\", \"no surreal\", \"text-safe negative space\"\n\n=== TASK ===\n1) Treat the product image as ground truth; keep product identity accurate (color, form, logo).\n2) Generate {{ $('Get row(s) in sheet').item.json.num_variations }} visually distinct prompts that are advertising-ready and usable by {{ $('Get row(s) in sheet').item.json.model_target }}.\n3) Vary at least one of: scene/environment, style, lighting, camera, background, composition, color mood, post-process.\n4) If \"campaign\" is provided (not empty/none), incorporate tasteful thematic elements: \n - Halloween \u2192 spooky mood, pumpkins, warm/orange accents, moody lighting\n - Songkran \u2192 water splashes, summer vibe, bright daylight, outdoor festivity\n - 8.8 / 10.10 / 11.11 \u2192 energetic sale vibe, dynamic composition, bold accents\n - Christmas \u2192 warm lights, pine elements, cozy red/green palette\n Keep it subtle and brand-safe; do not add new logos or misleading claims.\n5) Follow strictly the JSON schema in the **system prompt** (no extra text).\n6) If any subfield cannot be inferred safely, leave it as an empty string \"\".\n7) Ensure each \"prompt\" is **one line** and does not break JSON.\n\n=== REMINDERS ===\n- Avoid vague adjectives. Be concrete and visual.\n- Composition tips: centered hero, rule-of-thirds lifestyle, top-down flat-lay, negative space for copy.\n- Lighting tips: softbox/rim for packshots, natural daylight for lifestyle, golden hour for warmth.\n- Camera tips: 35mm/50mm for natural look, 85mm for product portrait with shallow DoF, macro for texture.\n- Color mood: align gently with any campaign; otherwise, use clean brand-safe palettes.\n\n=== RETURN FORMAT ===\n- Return a **single JSON object** only, matching the schema in the system prompt.\n",
"options": {
"systemMessage": "=You are an **Advertising Image Prompt Designer**.\n\nInputs you may receive:\n- product_image_url (image of the real product; treat as ground truth)\n- product_name\n- product_description\n- campaign (optional; e.g., \"8.8\", \"10.10\", \"Songkran\", \"Halloween\", \"Black Friday\", \"Christmas\")\n- model_target (e.g., \"SDXL\", \"Midjourney\", \"Flux\", \"Veo\")\n- aspect_ratio (e.g., \"1:1\", \"4:5\", \"16:9\")\n- N (number of distinct variations to generate)\n\nGoal:\n- Analyze the given product image, short description, and optional campaign context.\n- Produce **N distinct, production-ready image prompts** for ad creation.\n- **Preserve the product\u2019s true identity** (color, form, logo, key features). Do not invent or alter the product.\n\nOutput:\n- Return **JSON only** following the schema below. **No extra text** outside the JSON.\n\nQuality rules:\n- Each prompt must be visually distinct (vary at least one major axis: scene, mood, style, lighting, camera, background, composition).\n- Use concise, concrete descriptors; avoid vague words (e.g., \u201cnice\u201d, \u201cbeautiful\u201d).\n- Keep prompts brand-safe and realistic unless the user explicitly allows surreal concepts.\n- Prefer modern ad aesthetics: clean hero shots, lifestyle, editorial, macro texture, flat-lay, outdoor ambient, etc.\n- If any requested field is missing in the user input, **infer from the image**; if you cannot infer safely, set that subfield to an empty string.\n- If a **campaign** is provided, incorporate its seasonal or promotional theme **naturally and tastefully** (e.g., \n \u2022 Halloween \u2192 moody/spooky, pumpkins, warm/orange accents, fog \n \u2022 Songkran \u2192 water splash, festive Thai summer vibe, bright daylight \n \u2022 8.8 / 10.10 / 11.11 \u2192 bold sale energy, dynamic composition, price-tag visual cues without adding logos \n \u2022 Christmas \u2192 cozy, pine, warm lights, red/green palette \n \u2022 Black Friday \u2192 high contrast, dark sleek backdrops). \n If no campaign is provided (empty or \u201cnone\u201d), **ignore** campaign styling.\n\nTarget models:\n- Prompts should be usable by **Midjourney, SDXL, Flux, or Veo**. Avoid model-specific tokens unless provided in the user input (e.g., \u201c--ar 16:9\u201d, \u201c--style raw\u201d).\n\nPrompt composition guidance (recommended ingredients):\n- **Subject/Product**: exact product + salient features visible in the image (material, finish, color, unique parts).\n- **Scene/Environment**: studio / lifestyle / outdoor / occasion-linked (if campaign present).\n- **Style/Art direction**: minimalist / cinematic / editorial / lifestyle / high-fashion / tech-forward / cozy, etc.\n- **Lighting**: softbox / rim light / natural daylight / golden hour / neon / HDRI; mention shadows/reflections if relevant.\n- **Camera**: 35mm / 85mm / wide / macro / top-down / tilt-shift, F-stop or DoF if helpful.\n- **Composition**: centered / rule of thirds / flat-lay / hero shot / negative space for text.\n- **Background**: seamless white/black, textured concrete, wooden desk, gradient, seasonal set pieces (only if campaign present).\n- **Color mood**: pastel / vibrant / monochrome / brand palette; align gently with any campaign palette.\n- **Post-process**: subtle film grain / glossy reflections / HDR / product retouch / shadow catching.\n- **Marketing angle**: premium luxury / eco-friendly / active lifestyle / tech-forward / festive sale energy.\n\nBrand-safety & integrity:\n- Do **not** add or modify logos, certifications, or claims not present in the description.\n- Do **not** imply medical/health claims unless explicitly provided.\n- Avoid depicting real people/celebrities. If humans are implied, keep them generic and non-identifiable.\n\nRequired JSON schema (return this object only):\n{\n \"product_name\": string,\n \"product_description\": string,\n \"image_url\": string,\n \"campaign\": string, // optional; leave \"\" if none\n \"model_target\": string, // e.g., \"SDXL\", \"Midjourney\", \"Flux\", \"Veo\"\n \"aspect_ratio\": string, // e.g., \"1:1\", \"4:5\", \"16:9\"\n \"variations\": [\n {\n \"variation_id\": number,\n \"prompt\": string, // full generation prompt (one line)\n \"style\": string, // e.g., minimalist / cinematic / editorial / lifestyle / surreal\n \"scene\": string, // e.g., studio / outdoor / cafe / gym / beach\n \"lighting\": string, // e.g., softbox / natural daylight / neon / golden hour / rim light\n \"camera\": string, // e.g., 35mm / 85mm / macro / top-down / tilt-shift, include DoF if useful\n \"composition\": string, // e.g., centered / rule of thirds / flat-lay / hero shot / negative space\n \"background\": string, // e.g., white seamless / textured concrete / gradient / city night\n \"color_mood\": string, // e.g., pastel / vibrant / monochrome / brand palette\n \"post_process\": string, // e.g., subtle film grain / glossy reflections / HDR / product retouch\n \"marketing_angle\": string // e.g., premium luxury / eco-friendly / active lifestyle / tech-forward\n }\n ]\n}\n\nValidation:\n- Produce **exactly N** variations.\n- Ensure each \"prompt\" is a **single line** without JSON-breaking characters.\n- Escape any internal quotes if needed. Do not include commentary outside the JSON block.\n\nFailure handling:\n- If the image cannot be analyzed (unreachable URL or ambiguous), still return a valid JSON with minimal safe prompts derived from the description; leave unknown subfields as \"\" and add a short note in \"notes\".\n"
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2.2
},
{
"id": "f4b60076-6dd2-4da1-90db-117eabe4715c",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
1008,
288
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "12f40103-c60f-4a7b-82d1-960bd6b32755",
"name": "Split Out",
"type": "n8n-nodes-base.splitOut",
"position": [
1312,
176
],
"parameters": {
"options": {},
"fieldToSplitOut": "output.scenes"
},
"typeVersion": 1
},
{
"id": "e695e646-9759-46c4-a33c-36cda24da934",
"name": "Append row in sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
1456,
176
],
"parameters": {
"columns": {
"value": {
"prompt": "={{ $json.prompt }}",
"status": "Ready",
"scene_ref": "={{ $('Get row(s) in sheet').item.json.product_name }}_{{ $json.scene_id }}",
"product_name": "={{ $('Get row(s) in sheet').item.json.product_name }}"
},
"schema": [
{
"id": "scene_ref",
"type": "string",
"display": true,
"required": false,
"displayName": "scene_ref",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "product_name",
"type": "string",
"display": true,
"required": false,
"displayName": "product_name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "prompt",
"type": "string",
"display": true,
"required": false,
"displayName": "prompt",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "status",
"type": "string",
"display": true,
"required": false,
"displayName": "status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "output_url",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "output_url",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1544343606,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1XAKLXfhRqPB7RjA8neUHYGwF4FKpM38edJUONHxt9pE/edit#gid=1544343606",
"cachedResultName": "ad_image"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1XAKLXfhRqPB7RjA8neUHYGwF4FKpM38edJUONHxt9pE",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1XAKLXfhRqPB7RjA8neUHYGwF4FKpM38edJUONHxt9pE/edit?usp=drivesdk",
"cachedResultName": "n8n_Multi_Ad_Image"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "e1bb5b31-1f2b-4d9e-80ff-d91bbeac3793",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"disabled": true,
"position": [
-64,
384
],
"parameters": {
"width": 1840,
"height": 192,
"content": "### \ud83d\udfe8 Zone 2: Create Image\n\n1. **When clicking 'Execute workflow**\n2. **Get ImageURL and Prompt(Google Sheets)**\n3. **Create Image by Fal.ai (nano banana)**\n4. **Analys image for preparing video**"
},
"typeVersion": 1
},
{
"id": "d53e1592-7956-4154-9df9-bf8b7943e7fc",
"name": "Wait",
"type": "n8n-nodes-base.wait",
"position": [
976,
464
],
"parameters": {
"amount": 10
},
"typeVersion": 1.1
},
{
"id": "c75b4d0b-3309-4f03-8402-d13accc7edbc",
"name": "If",
"type": "n8n-nodes-base.if",
"position": [
816,
416
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "38f5427f-4fc7-4c07-87d5-fa7f5964deb2",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.status }}",
"rightValue": "=COMPLETED"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "b313b28e-10e0-4815-b8e5-a5e8c1ad4542",
"name": "Get image status",
"type": "n8n-nodes-base.httpRequest",
"position": [
656,
416
],
"parameters": {
"url": "={{ $json.status_url }}",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "16e46dfb-8cf7-45fd-9d72-c71b1b3eefad",
"name": "Call Fal.ai API (nannoBanana)",
"type": "n8n-nodes-base.httpRequest",
"position": [
480,
416
],
"parameters": {
"url": "=https://queue.fal.run/fal-ai/{{ $('Get row(s) in sheet').item.json.model_target }}/edit",
"method": "=POST",
"options": {},
"jsonBody": "={\n \"prompt\": \"{{ $json.prompt }} {{ $json.notes }}\",\n \"image_urls\": [\n \"{{ $json.product }}\"\n ],\n \"num_images\": 1,\n \"output_format\": \"jpeg\"\n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "56a8079f-6e4d-46db-b975-433463b9fa68",
"name": "Update row in sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
1584,
400
],
"parameters": {
"columns": {
"value": {
"status": "Complete",
"scene_ref": "={{ $('Append row in sheet').item.json.scene_ref }}",
"output_url": "={{ $json.webViewLink }}"
},
"schema": [
{
"id": "scene_ref",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "scene_ref",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "product_name",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "product_name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "prompt",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "prompt",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "notes",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "notes",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "status",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "output_url",
"type": "string",
"display": true,
"required": false,
"displayName": "output_url",
"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": [
"scene_ref"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1544343606,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1XAKLXfhRqPB7RjA8neUHYGwF4FKpM38edJUONHxt9pE/edit#gid=1544343606",
"cachedResultName": "ad_image"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1XAKLXfhRqPB7RjA8neUHYGwF4FKpM38edJUONHxt9pE",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1XAKLXfhRqPB7RjA8neUHYGwF4FKpM38edJUONHxt9pE/edit?usp=drivesdk",
"cachedResultName": "n8n_Multi_Ad_Image"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "8ae70d5b-3dd5-42e6-9c32-f6d36d299b21",
"name": "Upload file",
"type": "n8n-nodes-base.googleDrive",
"position": [
1440,
400
],
"parameters": {
"name": "={{ $('Get row(s) in sheet').item.json.product_name }}_{{ $('Append row in sheet').item.json.scene_ref }}.jpeg",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "1GyJp-XK4NIwjvUp13CHBUMiGNum1Yzl8",
"cachedResultUrl": "https://drive.google.com/drive/folders/1GyJp-XK4NIwjvUp13CHBUMiGNum1Yzl8",
"cachedResultName": "outputImage"
},
"inputDataFieldName": "=data"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "69afdf78-491a-4952-936e-03208adc6787",
"name": "Edit Fields",
"type": "n8n-nodes-base.set",
"position": [
320,
416
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "62a409c6-c607-452b-9bbb-f3d29c86dddf",
"name": "product",
"type": "string",
"value": "={{ \n (() => { \n const u = $('Get row(s) in sheet').item.json.product_image_url || ''; \n const q = u.match(/[?&]id=([-\\w]{25,})/); \n const d = u.match(/\\/d\\/([-\\w]{25,})/); \n const any = u.match(/[-\\w]{25,}/); \n const id = q?.[1] || d?.[1] || (any ? any[0] : ''); \n return id ? 'https://drive.google.com/uc?export=view&id=' + id : ''; \n })() \n}}"
}
]
},
"includeOtherFields": true
},
"typeVersion": 3.4
},
{
"id": "bc750bdb-45ad-4380-ad1d-6688cb242850",
"name": "Structured Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
1168,
288
],
"parameters": {
"jsonSchemaExample": "\n{\n \"product_name\": \"Smart Water Bottle\",\n \"product_description\": \"A sleek stainless steel smart water bottle with LED temperature display.\",\n \"image_url\": \"https://drive.google.com/uc?export=view&id=123abcXYZ\",\n \"scenes\": [\n {\n \"scene_id\": 1,\n \"prompt\": \"smart stainless steel water bottle on a minimalist white marble counter, cinematic studio lighting, soft shadows, product hero shot, centered composition\"\n },\n {\n \"scene_id\": 2,\n \"prompt\": \"smart water bottle on a wooden gym bench, fitness lifestyle, natural sunlight from window, sweat towel nearby, cinematic depth of field\"\n },\n {\n \"scene_id\": 3,\n \"prompt\": \"product placed in a futuristic cyberpunk neon city background, glowing reflections, dramatic rim lighting, 35mm lens, bold composition\"\n }\n ]\n}\n"
},
"typeVersion": 1.3
},
{
"id": "ee86e519-9ea5-41f0-b887-559558b1b206",
"name": "HTTP Request",
"type": "n8n-nodes-base.httpRequest",
"position": [
1296,
400
],
"parameters": {
"url": "={{ $json.images[0].url }}",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "e8505d4b-2bf8-4a36-be98-4e0fc0597fbf",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"disabled": true,
"position": [
-64,
160
],
"parameters": {
"color": 4,
"width": 1840,
"height": 208,
"content": "### \ud83d\udfe9 Zone 1: Create Image\n\n1. **When clicking 'Execute workflow**\n2. **Get ImageURL and Product Detail(Google Sheets)**\n3. **Analys image for create Ad image**\n4. **AI generate Prompt for Ad_Image**"
},
"typeVersion": 1
},
{
"id": "3c27ccb4-b7f0-4ddd-ad17-bb3563920552",
"name": "Get the image1",
"type": "n8n-nodes-base.httpRequest",
"position": [
1136,
400
],
"parameters": {
"url": "=https://queue.fal.run/fal-ai/nano-banana/requests/{{ $json.request_id }}",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"retryOnFail": true,
"typeVersion": 4.2,
"alwaysOutputData": false
},
{
"id": "c0798b64-0f44-44eb-b3f9-16c58f19f762",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"disabled": true,
"position": [
-48,
608
],
"parameters": {
"color": 4,
"width": 336,
"height": 464,
"content": "## Product Image\n\n"
},
"typeVersion": 1
},
{
"id": "9ab9daa1-fce9-47ab-86de-c577327cf1b0",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"disabled": true,
"position": [
304,
608
],
"parameters": {
"color": 4,
"width": 1472,
"height": 464,
"content": "## Product Image - nano Banana\n   "
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "d4b9b60e-31d7-4a7e-b78b-8dd85b374edc",
"connections": {
"If": {
"main": [
[
{
"node": "Get the image1",
"type": "main",
"index": 0
}
],
[
{
"node": "Wait",
"type": "main",
"index": 0
}
]
]
},
"Wait": {
"main": [
[
{
"node": "Get image status",
"type": "main",
"index": 0
}
]
]
},
"AI Agent": {
"main": [
[
{
"node": "Split Out",
"type": "main",
"index": 0
}
]
]
},
"Split Out": {
"main": [
[
{
"node": "Append row in sheet",
"type": "main",
"index": 0
}
]
]
},
"Edit Fields": {
"main": [
[
{
"node": "Call Fal.ai API (nannoBanana)",
"type": "main",
"index": 0
}
]
]
},
"Upload file": {
"main": [
[
{
"node": "Update row in sheet",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request": {
"main": [
[
{
"node": "Upload file",
"type": "main",
"index": 0
}
]
]
},
"Analyze image": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"Download file": {
"main": [
[
{
"node": "Analyze image",
"type": "main",
"index": 0
}
]
]
},
"Get the image1": {
"main": [
[
{
"node": "HTTP Request",
"type": "main",
"index": 0
}
]
]
},
"Get image status": {
"main": [
[
{
"node": "If",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Append row in sheet": {
"main": [
[
{
"node": "Edit Fields",
"type": "main",
"index": 0
}
]
]
},
"Get row(s) in sheet": {
"main": [
[
{
"node": "Download file",
"type": "main",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "AI Agent",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Call Fal.ai API (nannoBanana)": {
"main": [
[
{
"node": "Get image status",
"type": "main",
"index": 0
}
]
]
},
"When clicking \u2018Execute workflow\u2019": {
"main": [
[
{
"node": "Get row(s) in sheet",
"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.
googleDriveOAuth2ApigoogleSheetsOAuth2ApihttpHeaderAuthopenAiApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
⚠️ Note: All sensitive credentials should be set via n8n Credentials or environment variables. Do not hardcode API keys in nodes.
Source: https://n8n.io/workflows/8859/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
🎯 Create viral TikToks, Shorts, Reels, podcasts, and ASMR videos in minutes — all on autopilot.
Generate AI viral videos with NanoBanana & VEO3, shared on socials via Blotato 2. Uses @blotato/n8n-nodes-blotato, googleSheets, lmChatOpenAi, toolThink. Event-driven trigger; 94 nodes.
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,”
Inbox Guardian. Uses gmailTrigger, lmChatOpenAi, agent, textClassifier. Event-driven trigger; 66 nodes.
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