PTENES
Home/Video Systems/Module 6.6

Video Systems · Module 6/6

AI UGC Ads

Description

_(no description)_

Downloaded Resources

{ "name": "NanoBanana 2 - UGC", "nodes": [ { "parameters": { "formTitle": "UGC Ad Generator", "formDescription": "Generates UGC ads from the user's description and a photo", "formFields": { "values": [ { "fieldLabel": "Image description" }, { "fieldLabel": "Image", "fieldType": "file", "acceptFileTypes": ".jpg, .png" } ] }, "options": {} }, "type": "n8n-nodes-base.formTrigger", "typeVersion": 2.3, "position": [ 96, ], "id": "fd1ae3d7-3f6d-4c7a-9324-a34d54207dae", "name": "On form submission", "webhookId": "52e0abd7-0e7b-427d-80d1-ba9f3558f456" }, { "parameters": { "inputDataFieldName": "Image", "driveId": { "__rl": true, "value": "My Drive", "mode": "list", "cachedResultName": "My Drive", "cachedResultUrl": "https://drive.google.com/drive/my-drive" }, "folderId": { "__rl": true, "value": "1MxaX7NrmmTHQtHLLEw3JqXqjMbNKU2lx", "mode": "list", "cachedResultName": "image urls", "cachedResultUrl": "https://drive.google.com/drive/folders/1MxaX7NrmmTHQtHLLEw3JqXqjMbNKU2lx" }, "options": {} }, "type": "n8n-nodes-base.googleDrive", "typeVersion": 3, "position": [ 272, ], "id": "87f3e51c-2851-4c2a-88e5-dc7ec3391a78", "name": "Upload file", "credentials": { "googleDriveOAuth2Api": { "id": "tTKNlY1ktx7UntI0", "name": "Google Drive account" } } }, { "parameters": { "resource": "image", "operation": "analyze", "modelId": { "__rl": true, "value": "chatgpt-4o-latest", "mode": "list", "cachedResultName": "CHATGPT-4O-LATEST" },

"text": "=Analyze the provided image and determine whether it mainly depicts a product, a character, or BOTH.\n\n- If the image shows a product, 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 for 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: (One or two complete sentences summarizing what is shown in the image, ignoring the background)\n\n- If the image shows a character, return the analysis in YAML format with the following fields:\n\ncharacter_name: (Name of the character, if visible or inferable)\ncolor_scheme:\n - hex: (Hex code for each prominent color used on the character)\n name: (Descriptive name of the color)\noutfit_style: (Description of the clothing style, accessories, or notable features)\nvisual_description: (One or two complete sentences summarizing what the character looks like, ignoring the background)\n\nReturn only the YAML. Do not explain or add any other comments.\n\n\n- If it is BOTH, return both descriptions as instructed above in YAML format\n", "imageUrls": "={{ $json.webContentLink }}", "simplify": false, "options": {} }, "type": "@n8n/n8n-nodes-langchain.openAi", "typeVersion": 1.8, "position": [ 432, ], "id": "44a31fee-0de4-4ffe-a668-a9971cdba567", "name": "Describe Img", "credentials": { "openAiApi": { "id": "zE5O89L0JjnRwfPU", "name": "OpenAi account" } } }, { "parameters": { "method": "POST", "url": "https://queue.fal.run/fal-ai/nano-banana-pro/edit", "authentication": "genericCredentialType", "genericAuthType": "httpHeaderAuth", "sendBody": true, "specifyBody": "json", "jsonBody": "={\n \"prompt\": \"{{ $json.output.image_prompt.replace(/\\\"/g, '\\\\\\\"').replace(/\\n/g, '\\\\n') }}\",\n \"image_urls\": [\n \"{{ $('Upload file').item.json.webContentLink }}\"\n ],\n \"resolution\": \"1K\",\n \"aspect_ratio\": \"9:16\",\n \"output_format\": \"png\"\n }", "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ 336, ], "id": "b562af1a-54de-4704-bdfa-15d2857558b4", "name": "Create Image", "credentials": { "httpHeaderAuth": { "id": "RTd7n9jC66iTTXnS", "name": "Header Auth account" }, "httpCustomAuth": { "id": "GCBAsv94tlQyuuNq", "name": "Custom Auth account" } } }, { "parameters": { "model": { "__rl": true, "mode": "list", "value": "gpt-4.1-mini" }, "options": {} }, "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi", "typeVersion": 1.2, "position": [ -64, ],

"id": "d8a4798c-b047-4b91-890e-4bc5c3cc94a3", "name": "OpenAI Chat Model", "credentials": { "openAiApi": { "id": "zE5O89L0JjnRwfPU", "name": "OpenAi account" } } }, { "parameters": { "amount": 40 }, "type": "n8n-nodes-base.wait", "typeVersion": 1.1, "position": [ 480, ], "id": "ad8162c8-aed7-4ea8-b9ad-4ae9a15d0347", "name": "Wait 3", "webhookId": "945cac64-0916-4f9c-aee7-f3a604eddda3" }, { "parameters": { "url": "={{ $('Create Image').item.json.response_url }}", "authentication": "genericCredentialType", "genericAuthType": "httpHeaderAuth", "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ 624, ], "id": "d5390379-63b5-41fc-859f-2c790409affc", "name": "Get Image", "credentials": { "httpHeaderAuth": { "id": "RTd7n9jC66iTTXnS", "name": "Header Auth account" } }, "onError": "continueRegularOutput" }, { "parameters": { "model": { "__rl": true, "value": "gpt-4.1", "mode": "list", "cachedResultName": "gpt-4.1" }, "options": {} }, "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi", "typeVersion": 1.2, "position": [ -256, 1056 ], "id": "5a2530f1-7f38-4924-a94d-a414fbb688f2", "name": "GPT", "credentials": { "openAiApi": { "id": "zE5O89L0JjnRwfPU", "name": "OpenAi account" } } }, { "parameters": { "jsonSchemaExample": "{\n \"video_prompt\": \"string\"\n}\n", "autoFix": true }, "type": "@n8n/n8n-nodes-langchain.outputParserStructured", "typeVersion": 1.3, "position": [ -80, 1024 ], "id": "e3fce802-57f9-4333-99a9-dba3dca75c6e", "name": "Structured Output 1" }, { "parameters": { "jsonSchemaExample": "{\n\t\"image_prompt\": \"string\"\n}", "autoFix": true }, "type": "@n8n/n8n-nodes-langchain.outputParserStructured", "typeVersion": 1.3, "position": [ 112, ], "id": "b78f76cd-537e-487f-b1b2-761887978d66", "name": "Structured Output Parser" }, { "parameters": { "promptType": "define", "text": "=Create a UGC-style video prompt from the reference image and the user description.\n\nUser description (may be empty):\n{{ $('On form submission').item.json['Image description'] }}\n\nReference image analysis (use to stay faithful to what’s visible):\n{{ $('Describe Img').first().json.choices[0].message.content }}\n\nRules\n- Keep the look casual and realistic; avoid studio language.\n- Default model: veo3_fast unless stated otherwise.\n- Return only a single JSON object: video_prompt.\n", "hasOutputParser": true, "options": {

"systemMessage": "=ROLE: UGC Video Prompt Builder\n\nObjective\n- Given a reference image and brief user notes, write a natural UGC-style video prompt suitable for Veo3/Veo3_fast.\n\nPrinciples (UGC appearance)\n- Phone-video vibe: handheld, slight movement, off-center framing, mixed indoor light, subtle grain.\n- Real life over polish: small imperfections, lived-in spaces, ambient feel.\n- Keep any visible packaging text accurate. Never invent claims, seals, or numbers.\n- Don't name copyrighted characters.\n- Conversational sound, not advertising language.\n\nOutput Contract\n- Return ONLY a single JSON object:\n - \"video_prompt\": one simple sentence/short paragraph (≤ 130 words) describing the subject, action, mood, setting, 2–3 camera cues, and color notes. Stay faithful to the image and user notes.\n\n- No code fences, extra keys, arrays, or headings.\n- Don't fabricate product text; mention accuracy only if relevant.\n- Keep one implied scene in the single object.\n\nFraming guardrails:\n- Keep the subject fully in frame at all times (no cropping the forehead or chin).\n- Keep the composition centered; avoid extreme close-ups.\n- If the prompt implies movement, keep the framing locked on the face and product.\n\n---\n\nGood Examples\n1)\n{\n \"video_prompt\": \"young adult casually unboxes a small gadget on a kitchen island; smiles, lifts it to the camera, then points to the visible label on the box; setting: cozy apartment kitchen with mugs and a dish rack; mood: friendly and unscripted; camera: handheld framing, off-center composition, auto exposure, subtle grain; color notes: warm wood, soft whites, product label stays clear and accurate\",\n \"model\": \"veo3_fast\"\n}\n\n2)\n{\n \"video_prompt\": \"commuter leaves a station, adjusts wireless earbuds, looks at phone, then pockets it and walks toward the light; setting: busy sidewalk with glass reflections; mood: in the moment; camera: handheld framing, slight motion blur, natural outdoor light; color notes: charcoal earbuds with silver accents stand out; keep the logo text exactly as seen on the box\",\n \"model\": \"veo3_fast\"\n}\n\n---\n\nBad Examples\nA)\n{\n \"scenes\": [{ \"video_prompt\": \"...\"}],\n \"duration\": 8\n}\n→ Wrong: uses an array and extra keys; violates the single-object contract.\n\nB)\n{\n \"video_prompt\": \"cinematic studio lighting with a perfect backdrop; the bottle claims ‘clinically proven 300% improvement’\",\n \"aspect_ratio_video\": \"9:16\",\n \"model\": \"veo3\"\n}\n→ Wrong: studio tone and fabricated claim.\n\nC)\nMake a casual phone video of...\n→ Wrong: not a JSON object.\n" } }, "type": "@n8n/n8n-nodes-langchain.agent", "typeVersion": 2, "position": [ -208, ], "id": "546f53aa-1b23-49d4-936f-be3b709fa49a", "name": "Video Prompt Generator" }, { "parameters": { "content": "# Use Uploaded Image & Description", "height": 288, "width": 656, "color": 4 }, "type": "n8n-nodes-base.stickyNote", "typeVersion": 1,

"position": [ 0, -16 ], "id": "e02f4169-1497-4d71-b5d0-782bbf65d43d", "name": "Sticky Note" }, { "parameters": { "content": "# Create NEW Image with Nano Banana 2", "height": 448, "width": 880, "color": 5 }, "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [ -128, ], "id": "5bd69bcf-fefe-431c-96d3-0a93f3f361bd", "name": "Sticky Note1" }, { "parameters": { "content": "# Create UGC Video with VEO 3.1", "height": 432, "width": 1232, "color": 6 }, "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [ -288, ], "id": "7f9f053c-7d5a-4c32-9f7e-2801db70686f", "name": "Sticky Note2" }, { "parameters": { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 2 }, "conditions": [ { "id": "242843af-2af4-4602-864d-cf14b7e8919e", "leftValue": "={{ $json.status }}", "rightValue": "COMPLETED", "operator": { "type": "string", "operation": "equals", "name": "filter.operator.equals" } } ], "combinator": "and" }, "options": {} }, "type": "n8n-nodes-base.if", "typeVersion": 2.2, "position": [ 640, ], "id": "314c338a-520b-41f0-bbe4-65bd31d0369b", "name": "If" }, { "parameters": { "url": "=https://queue.fal.run/fal-ai/veo3.1/requests/{{ $json.request_id }}/status", "authentication": "genericCredentialType", "genericAuthType": "httpHeaderAuth", "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ 480, ], "id": "1ed79b73-00a8-4296-958c-f2e2fa5bdec9", "name": "Get Video Status", "credentials": { "httpHeaderAuth": { "id": "RTd7n9jC66iTTXnS", "name": "Header Auth account" } } }, { "parameters": { "amount": 20 }, "type": "n8n-nodes-base.wait", "typeVersion": 1.1, "position": [ 320, ], "id": "e5e84e78-fdc5-461b-b7fe-77bd949b7b34", "name": "Wait1", "webhookId": "3867eb64-0376-44d9-9714-0b4ceaab4927" }, { "parameters": { "url": "=https://queue.fal.run/fal-ai/veo3.1/requests/{{ $json.request_id }}", "authentication": "genericCredentialType", "genericAuthType": "httpHeaderAuth", "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ 816, ], "id": "54753da9-55c6-479c-ae77-741e4620af64", "name": "Get Video", "credentials": { "httpHeaderAuth": { "id": "RTd7n9jC66iTTXnS",

"name": "Header Auth account" } } }, { "parameters": { "promptType": "define", "text": "=Your task: Create an image prompt 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\nThese are the user's description:\n{{ $('On form submission').item.json['Image description'] }}\n\n\nDescription of the reference image:\n{{ $('Describe Img').first().json.choices[0].message.content }}\n\n", "hasOutputParser": true, "options": {

"systemMessage": "=ROLE: UGC Image Prompt Builder\n\n Objective: Given an image URL (often a product or reference image), write a short natural description that can guide an image/video generator.\n\n Defaults:\n - If instructions are vague, place the product with the character in an everyday setting that makes sense for the item.\n - If style or setting isn't specified, assume casual UGC realism.\n\n UGC Realism Principles:\n - Make it look unposed and lively.\n - Phone-photo vibe: off-center framing, slight motion blur, mixed indoor light, subtle grain.\n - Embrace imperfections: wrinkles, flyaway hair, skin texture, cluttered backgrounds.\n - Keep any visible packaging text exactly as shown. Never invent claims, numbers, or seals.\n\n Camera Cues (use at least 2–3 each time):\n - \"phone photo\", \"handheld framing\", \"off-center composition\",\n \"natural indoor light\", \"soft shadows\", \"slight motion blur\",\n \"auto exposure\", \"unpolished look\", \"subtle grain\"\n\n Safety / Scope:\n - Don't name copyrighted characters.\n - You don't write dialogue or scripts; return only an image prompt.\n\n Output Contract:\n - Return only one JSON object:\n - image_prompt: a string (≤120 words) in plain prose covering\n subject, action, mood, setting, style/camera, color notes, and text accuracy notes.\n\n Diversity Defaults:\n - When people aren't specified, vary gender and ethnicity naturally.\n - Default age range: 21–38.\n - Prefer real-world spaces (home, street, store, gym, office) unless instructed otherwise.\n\n --- Examples ---\n\n Good example 1:\n { \"image_prompt\": \"young adult casually holding a skincare tube near a bathroom mirror; action: applies a small amount to the back of their hand; mood: quiet morning; setting: small apartment bathroom with towel on the bar and toothbrush cup; style/camera: phone photo, handheld framing, off-center composition, natural window light, slight motion blur, subtle grain; colors: soft whites and mint label; text accuracy: keep every word on the tube exactly as visible, no added claims\"}\n\n Good example 2:\n { \"image_prompt\": \"commuter wearing wireless earbuds while exiting a subway station; action: steps onto a busy sidewalk; mood: in the moment; setting: busy sidewalk with pedestrians and glass reflections; style/camera: unpolished phone photo, auto exposure, mixed daylight and neon glow, slight lens grime; colors: charcoal and silver product stands out; text accuracy: preserve the logo and model name precisely\"}\n\n Bad example (avoid):\n - Fabricating certifications or numbers on packaging.\n - Perfect studio lighting or ad-speak like \"cinematic masterpiece.\"\n - Returning anything beyond the one required key.\n\n Pre-send checklist:\n - Natural, handheld tone? ✔\n - At least two camera cues included? ✔\n - Product text preserved exactly? ✔\n - Only image_prompt returned? ✔\n\n\n" } }, "type": "@n8n/n8n-nodes-langchain.agent", "typeVersion": 2,

"position": [ 0, ], "id": "c44c9d64-3c62-4a47-a8ef-3eb02853633c", "name": "Image Prompt Generator" }, { "parameters": { "method": "POST", "url": "https://queue.fal.run/fal-ai/veo3.1/fast/image-to-video", "authentication": "genericCredentialType", "genericAuthType": "httpHeaderAuth", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Content-Type", "value": "application/json" } ] }, "sendBody": true, "contentType": "raw", "rawContentType": "application/json", "body": "={\n \"prompt\": {{ JSON.stringify($json.output.video_prompt) }},\n \"image_url\": \"{{ $('Get Image').first().json.images[0].url }}\"\n \n}\n", "options": { "batching": { "batch": { "batchSize": 1, "batchInterval": 3000 } } } }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ 144, ], "id": "3ef1a04c-d68b-4c9c-9bf0-84126d81abff", "name": "Create Video", "credentials": { "httpHeaderAuth": { "id": "RTd7n9jC66iTTXnS",

} ] ] }, "Structured Output 1": { "ai_outputParser": [ [ { "node": "Video Prompt Generator", "type": "ai_outputParser", "index": 0 } ] ] }, "Structured Output Parser": { "ai_outputParser": [ [ { "node": "Image Prompt Generator", "type": "ai_outputParser", "index": 0 } ] ] }, "Video Prompt Generator": { "main": [ [ { "node": "Create Video", "type": "main", "index": 0 } ] ] }, "If": { "main": [ [ { "node": "Get Video", "type": "main", "index": 0 } ], [ { "node": "Wait1", "type": "main", "index": 0 } ] ] }, "Get Video Status": { "main": [ [ { "node": "If", "type": "main", "index": 0 } ] ] }, "Wait1": { "main": [ [ { "node": "Get Video Status", "type": "main", "index": 0 } ] ] }, "Get Video": { "main": [ [] ] }, "Image Prompt Generator": { "main": [ [ { "node": "Create Image", "type": "main", "index": 0 } ] ] }, "Create Video": { "main": [ [ { "node": "Wait1", "type": "main", "index": 0 } ] ] } }, "active": false, "settings": { "executionOrder": "v1" }, "versionId": "95808815-3e52-47e5-844d-5afbee19779a", "meta": { "instanceId": "5f99b345c3a4501a22438ba5962ff6685e5e97ee4bd0a17cc04a19ed072b5c2a" }, "id": "0ZstEawJAPZZ5hfP", "tags": [] }

← Previous
Ad images with Nano Banana
Track completed ✓
Back to track