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,”
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
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