This workflow corresponds to n8n.io template #7487 — we link there as the canonical source.
This workflow follows the Airtable → HTTP Request 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 →
{
"meta": {
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "1d997e1f-83ba-4b13-89e4-037bbe762462",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"position": [
-240,
272
],
"parameters": {
"path": "test-button",
"options": {}
},
"typeVersion": 2.1
},
{
"id": "4bfe1dc6-813f-48be-9fcf-c326759d75bc",
"name": "Switch",
"type": "n8n-nodes-base.switch",
"position": [
-64,
272
],
"parameters": {
"rules": {
"values": [
{
"outputKey": "imageGeneration",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "bd840893-2fbd-48b2-a6c9-791a7a248579",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.query.action }}",
"rightValue": "imageGeneration"
}
]
},
"renameOutput": true
},
{
"outputKey": "videoGeneration",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "bda6d21c-3bd3-4624-b9e0-c581a481edcc",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.query.action }}",
"rightValue": "videoGeneration"
}
]
},
"renameOutput": true
}
]
},
"options": {}
},
"typeVersion": 3.2
},
{
"id": "928ae0c9-d721-4480-81a1-0d15449b9b82",
"name": "Get Concept Record ID - Image Generation",
"type": "n8n-nodes-base.airtable",
"position": [
48,
112
],
"parameters": {
"id": "={{ $json.query.recordId }}",
"base": {
"__rl": true,
"mode": "list",
"value": "appH2OEGW78g0qSOw",
"cachedResultUrl": "https://airtable.com/appH2OEGW78g0qSOw",
"cachedResultName": "AI-powered campaign concept generation"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tbliQfQHTLEw6henQ",
"cachedResultUrl": "https://airtable.com/appH2OEGW78g0qSOw/tbliQfQHTLEw6henQ",
"cachedResultName": "Concept Generation"
},
"options": {}
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "afa89c67-b217-439e-99bb-15236a629661",
"name": "Analyze image",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
656,
112
],
"parameters": {
"text": "Describe the product and brand in this image in full detail. Fully ignore the background. Focus ONLY on the product.",
"modelId": {
"__rl": true,
"mode": "list",
"value": "chatgpt-4o-latest",
"cachedResultName": "CHATGPT-4O-LATEST"
},
"options": {},
"resource": "image",
"imageUrls": "={{ $json.url }}",
"operation": "analyze"
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.8
},
{
"id": "78e4c04c-b58d-48f2-98a9-c9752b6fdd90",
"name": "Split Out Uploaded Asset",
"type": "n8n-nodes-base.splitOut",
"position": [
256,
112
],
"parameters": {
"options": {},
"fieldToSplitOut": "['Upload Assets']"
},
"typeVersion": 1
},
{
"id": "85d13c1f-b41f-4f12-91d9-e868bed021e7",
"name": "Loop Over Image Asset",
"type": "n8n-nodes-base.splitInBatches",
"position": [
480,
112
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "6328b318-b2ad-45d3-8d13-a70296fa04d8",
"name": "Code",
"type": "n8n-nodes-base.code",
"position": [
1600,
112
],
"parameters": {
"jsCode": "// Get the URL string from the aggregate node\nconst urlString = $json.url;\n\n// Split the comma-separated URLs and format each with quotes\nconst formattedUrls = urlString\n .flatMap(urlString => {\n if (typeof urlString === \"string\") {\n return urlString.split(',');\n }\n return [];\n })\n .map(url => `\"${url.trim()}\"`)\n .join(',\\n');\n\n// Return the formatted result\nreturn {\n formattedUrls: formattedUrls\n};"
},
"typeVersion": 2
},
{
"id": "bd2173af-e924-408f-9d9c-a06e898d7acb",
"name": "Generate System Prompt Images GPT-Image",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
1760,
112
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-5",
"cachedResultName": "GPT-5"
},
"options": {},
"messages": {
"values": [
{
"content": "=Here is the user request for the Images to be created:\n{{ $('Get Concept Record ID - Image Generation - 2').item.json['AI Images instructions'] }}\n\nHere is the Campaign Objective:\n{{ $('Get Concept Record ID - Image Generation').first().json.Description }}\n\nDescription of the Products seen in various images submitted by the user:\n{{ $('Aggregate Content Output').item.json.content }}\n\nUse the Think tool to double check your output"
},
{
"role": "system",
"content": "=You are an expert image generation prompt engineer specializing in OpenAI's GPT-4o image generation capabilities. Your role is to analyze campaign concepts and product reference images to create detailed, structured prompts that will generate high-quality marketing visuals.\n\nTASK: Transform the provided creative brief and product descriptions into a comprehensive image generation prompt formatted as stringified JSON that will work alongside user-provided reference images.\n\nINPUT ANALYSIS:\n- Campaign Concept: Carefully analyze the creative brief to understand the marketing goals, target audience, brand tone, and desired visual style\n- Product References: Examine the product descriptions from submitted images to identify key visual elements, packaging details, branding elements, colors, and design features\n- Reference Integration: The prompt will be used by an image generation API that will receive BOTH your text prompt AND the user's reference images simultaneously\n\nPROMPT LENGTH OPTIMIZATION:\nGPT Image 1 (GPT-4o) handles longer prompts better than DALL-E 3 but still benefits from concise, focused descriptions. Target 400-800 characters for optimal results - detailed enough for quality but not overly verbose.\n\nESSENTIAL ELEMENTS (prioritize in order):\n1. CORE SCENE: Main subject + setting + reference integration\n2. VISUAL STYLE: Photography style, lighting, composition \n3. QUALITY SPECIFICATIONS: Technical details (realistic, sharp, etc.)\n4. FALLBACK: Alternative if no reference images provided\n\nKEY ADVANTAGES OF GPT IMAGE 1:\n- Excellent text rendering and product detail preservation\n- Strong prompt adherence and contextual understanding\n- Natural language processing (conversational prompts work well)\n- Superior handling of detailed technical specifications\n\nREFERENCE IMAGE INTEGRATION STRATEGY:\nYour prompt must describe a SCENARIO where the user's reference images (products, objects, people, etc.) will be seamlessly integrated. Structure your prompt to:\n- Define the ENVIRONMENT and CONTEXT where reference elements should be placed\n- Specify how reference elements should INTERACT with the scene\n- Provide fallback descriptions in case reference images are not provided\n- Use phrases like \"incorporate the provided reference elements,\" \"integrate the uploaded objects,\" or \"place the reference items\"\n\nPROMPT QUALITY STANDARDS:\n- Be highly specific and detailed - vague prompts produce poor results\n- Use descriptive adjectives and precise terminology\n- Include technical photography terms for professional quality\n- Specify exact colors, materials, textures, and finishes\n- Define spatial relationships between elements\n- Account for brand guidelines and marketing objectives from the brief\n\nOUTPUT FORMAT:\nReturn only a valid stringified JSON object:\n{\"image_prompt\": \"Your comprehensive image generation prompt here...\"}\n\nOPTIMIZED SINGLE PARAGRAPH FORMAT:\nYour image_prompt should be ONE well-structured paragraph (1000-1500 characters) that creates a comprehensive scenario for integrating reference images while providing fallback descriptions.\n\nEXAMPLE STRUCTURE:\n\"Create a professional commercial photograph of [REFERENCE ITEMS/fallback description] positioned in [SPECIFIC SETTING] with [DETAILED LIGHTING DESCRIPTION], featuring [COMPOSITION DETAILS] that showcases [KEY VISUAL ELEMENTS], captured with [CAMERA/STYLE SPECIFICATIONS] to achieve [QUALITY/EFFECTS] aesthetic, ensuring any product packaging, labels, and logos remain crystal clear and sharp, with colors that complement the overall scene and realistic depth of field.\"\n\nADVANCED PROMPTING TIPS:\n- GPT Image 1 excels at understanding conversational, detailed prompts\n- Include specific technical photography terms for professional results\n- Mention text rendering requirements explicitly for product shots\n- Use descriptive adjectives for materials, textures, and finishes\n\nRemember: The more detailed and specific your single-paragraph prompt, the better GPT-4o will understand and execute your vision. Ensure all technical and creative elements flow seamlessly in one continuous description."
}
]
},
"jsonOutput": true
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.8
},
{
"id": "742238c2-1c73-4f6f-81b9-407ae3491761",
"name": "Get Concept Record ID - Image Generation - 2",
"type": "n8n-nodes-base.airtable",
"position": [
1040,
112
],
"parameters": {
"id": "={{ $('Get Concept Record ID - Image Generation').first().json.id }}",
"base": {
"__rl": true,
"mode": "list",
"value": "appH2OEGW78g0qSOw",
"cachedResultUrl": "https://airtable.com/appH2OEGW78g0qSOw",
"cachedResultName": "AI-powered campaign concept generation"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tbliQfQHTLEw6henQ",
"cachedResultUrl": "https://airtable.com/appH2OEGW78g0qSOw/tbliQfQHTLEw6henQ",
"cachedResultName": "Concept Generation"
},
"options": {}
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "e75dfe1d-c050-406f-af84-ee47f25748d1",
"name": "Split Out - Upload Assets",
"type": "n8n-nodes-base.splitOut",
"position": [
1248,
112
],
"parameters": {
"options": {},
"fieldToSplitOut": "['Upload Assets']"
},
"typeVersion": 1
},
{
"id": "a81e90b4-e7fc-454a-8119-48e2935c8ce9",
"name": "Aggregate Content Output",
"type": "n8n-nodes-base.aggregate",
"position": [
848,
112
],
"parameters": {
"options": {},
"fieldsToAggregate": {
"fieldToAggregate": [
{
"fieldToAggregate": "content"
},
{
"fieldToAggregate": "url"
}
]
}
},
"typeVersion": 1
},
{
"id": "636ef5bd-a91b-4843-ade7-4264e810f6e9",
"name": "Aggregate Image URLs",
"type": "n8n-nodes-base.aggregate",
"position": [
1440,
112
],
"parameters": {
"options": {},
"fieldsToAggregate": {
"fieldToAggregate": [
{
"fieldToAggregate": "url"
}
]
}
},
"typeVersion": 1
},
{
"id": "1551847b-acea-4105-b93a-a4af4c8f21b1",
"name": "Retrieve 4o Image",
"type": "n8n-nodes-base.httpRequest",
"position": [
2624,
112
],
"parameters": {
"url": "https://api.kie.ai/api/v1/gpt4o-image/record-info",
"options": {},
"sendQuery": true,
"sendHeaders": true,
"queryParameters": {
"parameters": [
{
"name": "taskId",
"value": "={{ $json.data.taskId }}"
}
]
},
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "=Bearer {{ $('Get Concept Record ID - Image Generation - 2').item.json['API Key (from API Services) (from Agency)'][0] }}"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "548f5ff0-37c9-4b50-8fae-7d8579c8b8fc",
"name": "If Success",
"type": "n8n-nodes-base.if",
"position": [
2272,
112
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "f8fc1069-c56a-483d-9257-6669d9eb9031",
"operator": {
"type": "number",
"operation": "equals"
},
"leftValue": "={{ $json.code }}",
"rightValue": 200
}
]
}
},
"typeVersion": 2.2
},
{
"id": "623be8ce-9cb8-4d93-92ad-7d038d7f0747",
"name": "Create or update a record",
"type": "n8n-nodes-base.airtable",
"position": [
2816,
112
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "appH2OEGW78g0qSOw",
"cachedResultUrl": "https://airtable.com/appH2OEGW78g0qSOw",
"cachedResultName": "AI-powered campaign concept generation"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tbliQfQHTLEw6henQ",
"cachedResultUrl": "https://airtable.com/appH2OEGW78g0qSOw/tbliQfQHTLEw6henQ",
"cachedResultName": "Concept Generation"
},
"columns": {
"value": {
"id": "={{ $('Get Concept Record ID - Image Generation - 2').first().json.id }}",
"Run": false,
"Image Status": "Success",
"Images Assets": "={{ $json.data.response.resultUrls.map(url => ({ url })) }}",
"Images Prompt ": "={{ $('Generate System Prompt Images GPT-Image').item.json.message.content.image_prompt }}",
"Images Description": "={{ String($('Aggregate Content Output').item.json.content) }}"
},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "id",
"defaultMatch": true
},
{
"id": "Campaign",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Campaign",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Description",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Description",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Upload Assets",
"type": "array",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Upload Assets",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Images Description",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Images Description",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Run",
"type": "boolean",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Run",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Details Status",
"type": "options",
"display": true,
"options": [
{
"name": "Start",
"value": "Start"
},
{
"name": "Generating",
"value": "Generating"
},
{
"name": "Completed",
"value": "Completed"
},
{
"name": "Error",
"value": "Error"
}
],
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Details Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Personas",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Personas",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Key messages",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Key messages",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Brand touchpoints",
"type": "array",
"display": true,
"options": [],
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Brand touchpoints",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "AI Images instructions",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "AI Images instructions",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "AI Videos instructions",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "AI Videos instructions",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Number of Images",
"type": "options",
"display": true,
"options": [
{
"name": "1",
"value": "1"
},
{
"name": "2",
"value": "2"
},
{
"name": "4",
"value": "4"
},
{
"name": "choose number",
"value": "choose number"
}
],
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Number of Images",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Image Size",
"type": "options",
"display": true,
"options": [
{
"name": "1:1",
"value": "1:1"
},
{
"name": "3:2",
"value": "3:2"
},
{
"name": "2:3",
"value": "2:3"
},
{
"name": "choose size",
"value": "choose size"
}
],
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Image Size",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Image Status",
"type": "options",
"display": true,
"options": [
{
"name": "Generating",
"value": "Generating"
},
{
"name": "Failed",
"value": "Failed"
},
{
"name": "Success",
"value": "Success"
},
{
"name": "waiting",
"value": "waiting"
}
],
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Image Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Images Prompt ",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Images Prompt ",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Images Assets",
"type": "array",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Images Assets",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "AI Model",
"type": "options",
"display": true,
"options": [
{
"name": "veo3",
"value": "veo3"
},
{
"name": "veo3_fast",
"value": "veo3_fast"
},
{
"name": "choose model",
"value": "choose model"
}
],
"removed": true,
"readOnly": false,
"required": false,
"displayName": "AI Model",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Aspect Ratio",
"type": "options",
"display": true,
"options": [
{
"name": "16:9",
"value": "16:9"
},
{
"name": "9:16",
"value": "9:16"
},
{
"name": "choose aspect ratio",
"value": "choose aspect ratio"
}
],
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Aspect Ratio",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Video Status",
"type": "options",
"display": true,
"options": [
{
"name": "waiting",
"value": "waiting"
},
{
"name": "generating",
"value": "generating"
},
{
"name": "failed",
"value": "failed"
},
{
"name": "success",
"value": "success"
}
],
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Video Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Videos Assets",
"type": "array",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Videos Assets",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Record ID",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Record ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Agency",
"type": "array",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Agency",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Created Time",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Created Time",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Last Modified Time",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Last Modified Time",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "API Key (from API Services) (from Agency)",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "API Key (from API Services) (from Agency)",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"id"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "upsert"
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "b2b223f6-66b7-43bc-b621-70ad10f555a5",
"name": "Get a Concept Record ID - Video Generation",
"type": "n8n-nodes-base.airtable",
"position": [
48,
416
],
"parameters": {
"id": "={{ $json.query.recordId }}",
"base": {
"__rl": true,
"mode": "list",
"value": "appH2OEGW78g0qSOw",
"cachedResultUrl": "https://airtable.com/appH2OEGW78g0qSOw",
"cachedResultName": "AI-powered campaign concept generation"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tbliQfQHTLEw6henQ",
"cachedResultUrl": "https://airtable.com/appH2OEGW78g0qSOw/tbliQfQHTLEw6henQ",
"cachedResultName": "Concept Generation"
},
"options": {}
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "20726688-a8bc-4c76-82e9-2157b6c1057f",
"name": "Update Image Generation Failed",
"type": "n8n-nodes-base.airtable",
"position": [
3008,
112
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "appH2OEGW78g0qSOw",
"cachedResultUrl": "https://airtable.com/appH2OEGW78g0qSOw",
"cachedResultName": "AI-powered campaign concept generation"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tbliQfQHTLEw6henQ",
"cachedResultUrl": "https://airtable.com/appH2OEGW78g0qSOw/tbliQfQHTLEw6henQ",
"cachedResultName": "Concept Generation"
},
"columns": {
"value": {
"id": "={{ $('Webhook').item.json.query.recordId }}",
"Run": false,
"Image Status": "Failed"
},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "id",
"defaultMatch": true
},
{
"id": "Campaign",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Campaign",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Description",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Description",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Upload Assets",
"type": "array",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Upload Assets",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Images Description",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Images Description",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Run",
"type": "boolean",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Run",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Details Status",
"type": "options",
"display": true,
"options": [
{
"name": "Start",
"value": "Start"
},
{
"name": "Generating",
"value": "Generating"
},
{
"name": "Completed",
"value": "Completed"
},
{
"name": "Error",
"value": "Error"
}
],
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Details Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Personas",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Personas",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Key messages",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Key messages",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Brand touchpoints",
"type": "array",
"display": true,
"options": [],
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Brand touchpoints",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "AI Images instructions",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "AI Images instructions",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "AI Videos instructions",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "AI Videos instructions",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Number of Images",
"type": "options",
"display": true,
"options": [
{
"name": "1",
"value": "1"
},
{
"name": "2",
"value": "2"
},
{
"name": "4",
"value": "4"
},
{
"name": "choose number",
"value": "choose number"
}
],
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Number of Images",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Image Size",
"type": "options",
"display": true,
"options": [
{
"name": "1:1",
"value": "1:1"
},
{
"name": "3:2",
"value": "3:2"
},
{
"name": "2:3",
"value": "2:3"
},
{
"name": "choose size",
"value": "choose size"
}
],
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Image Size",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Image Status",
"type": "options",
"display": true,
"options": [
{
"name": "Generating",
"value": "Generating"
},
{
"name": "Failed",
"value": "Failed"
},
{
"name": "Success",
"value": "Success"
},
{
"name": "waiting",
"value": "waiting"
}
],
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Image Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Images Prompt ",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Images Prompt ",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Images Assets",
"type": "array",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Images Assets",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "AI Model",
"type": "options",
"display": true,
"options": [
{
"name": "veo3",
"value": "veo3"
},
{
"name": "veo3_fast",
"value": "veo3_fast"
},
{
"name": "choose model",
"value": "choose model"
}
],
"removed": true,
"readOnly": false,
"required": false,
"displayName": "AI Model",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Aspect Ratio",
"type": "options",
"display": true,
"options": [
{
"name": "16:9",
"value": "16:9"
},
{
"name": "9:16",
"value": "9:16"
},
{
"name": "choose aspect ratio",
"value": "choose aspect ratio"
}
],
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Aspect Ratio",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Video Status",
"type": "options",
"display": true,
"options": [
{
"name": "waiting",
"value": "waiting"
},
{
"name": "generating",
"value": "generating"
},
{
"name": "failed",
"value": "failed"
},
{
"name": "success",
"value": "success"
}
],
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Video Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Videos Assets",
"type": "array",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Videos Assets",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Record ID",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Record ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Agency",
"type": "array",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Agency",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Created Time",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Created Time",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Last Modified Time",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Last Modified Time",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "API Key (from API Services) (from Agency)",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "API Key (from API Services) (from Agency)",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"id"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update"
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "642daf47-858f-44bc-8902-05c8cbee3e00",
"name": "Split Out - Images Assets",
"type": "n8n-nodes-base.splitOut",
"position": [
256,
416
],
"parameters": {
"options": {},
"fieldToSplitOut": "['Images Assets']"
},
"typeVersion": 1
},
{
"id": "c4887877-8be7-4f3c-bc97-29e05e49d3e9",
"name": "Aggregate - Images URLs",
"type": "n8n-nodes-base.aggregate",
"position": [
656,
416
],
"parameters": {
"options": {},
"fieldsToAggregate": {
"fieldToAggregate": [
{
"fieldToAggregate": "url"
}
]
}
},
"typeVersion": 1
},
{
"id": "224f74db-e7fa-48a3-8f77-ddea7e9f6949",
"name": "Code - Format URLs",
"type": "n8n-nodes-base.code",
"position": [
864,
416
],
"parameters": {
"jsCode": "// Get the URL string from the aggregate node\nconst urlString = $json.url;\n\n// Split the comma-separated URLs and format each with quotes\nconst formattedUrls = urlString\n .flatMap(urlString => {\n if (typeof urlString === \"string\") {\n return urlString.split(',');\n }\n return [];\n })\n .map(url => `\"${url.trim()}\"`)\n .join(',\\n');\n\n// Return the formatted result\nreturn {\n formattedUrls: formattedUrls\n};"
},
"typeVersion": 2
},
{
"id": "45fbf8d0-3aba-4932-9cba-2f3048eb46e0",
"name": "Generate System Prompt Video VEO3",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
1072,
416
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-5-2025-08-07",
"cachedResultName": "GPT-5-2025-08-07"
},
"options": {},
"messages": {
"values": [
{
"content": "=Here is the user request of the video generation:\n{{ $('Get a Concept Record ID - Video Generation').item.json['AI Videos instructions'] }}\n\nHere is the Campaign objectives:\n{{ $('Get a Concept Record ID - Video Generation').item.json.Campaign }}\n\n{{ $('Get a Concept Record ID - Video Generation').item.json.Description }}\n\nHere is the Images Description inputed by the user:\n{{ $('Get a Concept Record ID - Video Generation').item.json['Images Description'] }}\n\nHere is the requested aspect ratio by the user:\n{{ $('Get a Concept Record ID - Video Generation').item.json['Aspect Ratio'] }}\n\nUse the Think tool to double check your output"
},
{
"role": "system",
"content": "=# Veo3 Video Generation System Prompt\n\nYou are an expert video prompt engineer specializing in creating detailed, cinematic prompts for Veo3 video generation. Your role is to analyze user inputs and transform them into comprehensive video generation instructions that produce high-quality, engaging content.\n\n## Input Analysis\nYou will receive the following user inputs:\n- **AI Videos instructions**: The core user request for video generation\n- **Campaign objectives**: The marketing campaign goals and description\n- **Images Description**: Visual context provided by the user\n- **Aspect Ratio**: Requested video dimensions\n\n## Output Format\nYou must output ONLY a stringified JSON object with this exact structure:\n```json\n{\"Video_prompt\": \"{\\\"description\\\": \\\"your detailed scene description here\\\", \\\"setting\\\": \\\"environment and background details\\\", \\\"camera_type\\\": \\\"technical camera specifications\\\", \\\"camera_movement\\\": \\\"camera motion and framing\\\", \\\"action\\\": \\\"specific movements and timing\\\", \\\"lighting\\\": \\\"lighting setup and mood\\\", \\\"other_details\\\": \\\"additional production notes\\\", \\\"ending\\\": \\\"final shot and resolution\\\", \\\"keywords\\\": [\\\"relevant\\\", \\\"search\\\", \\\"terms\\\"]}\"}\n```\n\n**CRITICAL**: The Video_prompt value must be a stringified JSON object (JSON within JSON as a string). Ensure all quotes inside the stringified JSON are properly escaped with backslashes.\n\n## Prompt Construction Guidelines\n\n### Core Elements to Include:\n1. **Visual Description**: Detailed scene composition, subjects, and visual elements\n2. **Setting/Environment**: Location, atmosphere, and background details\n3. **Camera Work**: Shot type, movement, angles, and technical specifications\n4. **Lighting**: Mood, direction, and quality of light\n5. **Motion/Action**: Specific movements, transitions, and timing\n6. **Style**: Cinematic approach, visual aesthetic, and production quality\n7. **Technical Details**: Frame rate, resolution hints, and aspect ratio integration\n\n### Quality Standards:\n- Use cinematic, professional language\n- Include specific technical details (camera specs, lighting setup)\n- Describe motion and timing precisely\n- Maintain brand consistency with campaign objectives\n- Ensure visual coherence with provided image descriptions\n- Incorporate the requested aspect ratio naturally\n\n### Example Prompt Patterns:\nReference these successful structures:\n\n**High-Quality Commercial Example (Kellogg's Nutri-Grain) - Expected Output Format:**\n```json\n{\"Video_prompt\": \"{\\\"description\\\": \\\"Open on the Kellogg's Nutri-Grain Choc Malt Flavour box, placed centrally and heroically on a glossy surface. Product box is 100% sharp, all labels clear. Instantly, bursts of chocolate pieces, malt balls, cereal flakes, and dramatic milk splashes explode upward and outward from behind and around the box in cinematic slow motion, emphasizing the natural flavours and ingredients. Pieces freeze and suspend at peak motion, reveling in vibrant energy.\\\", \\\"setting\\\": \\\"Commercial studio scene matching the image, vibrant gold-red gradient background reflecting the packaging color scheme.\\\", \\\"camera_type\\\": \\\"Cinematic 4K broadcast camera, 50mm lens, 120fps slow-motion, f/5.6, ISO 200.\\\", \\\"camera_movement\\\": \\\"Slow, controlled dolly-in toward the box as ingredients explode, ending in a tight hero shot.\\\", \\\"action\\\": \\\"Bursts of real chocolate, malt, flakes, and milk erupt in slow motion from the background, swirling around before freezing midair, creating a spectacle around the box.\\\", \\\"lighting\\\": \\\"Bold studio lighting with bright frontal illumination, strong backlights to make the splashes pop and add glossy highlights.\\\", \\\"other_details\\\": \\\"All text on the box always kept readable; the explosion is energetic pop soundtrack underscoring the explosive freshness and power.\\\", \\\"ending\\\": \\\"The video ends with the suspended explosion around the box, tagline \\\\\\\"Fuels Active Bodies\\\\\\\" animating on-screen, all in sync with the music hit.\\\", \\\"keywords\\\": [\\\"Kellogg's Nutri-Grain Choc Malt\\\", \\\"explosive ingredients\\\", \\\"slow motion\\\", \\\"dynamic commercial\\\", \\\"16:9\\\", \\\"commercial lighting\\\"]}\"}\n```\n\n**Commercial Product Focus Pattern:**\n\"Cinematic 4K shot of [PRODUCT] placed heroically on [SURFACE]. [DYNAMIC ELEMENTS] explode/burst/emerge in slow motion, creating [VISUAL SPECTACLE]. Camera: [TECHNICAL SPECS]. Lighting: [SETUP]. Motion: [DETAILED ACTION]. Ending: [RESOLUTION].\"\n\n**Transformation/Assembly Pattern:**\n\"Fixed wide-angle shot of [ENVIRONMENT]. [CONTAINER/BOX] sits centrally and [INITIAL ACTION]. [TRANSFORMATION SEQUENCE] with precise timing. Elements: [LIST]. Motion: [ASSEMBLY DETAILS]. Style: cinematic, photorealistic.\"\n\n**Epic Reveal Pattern:**\n\"Epic cinematic shot in [LOCATION]. [CONTAINER] mechanically opens revealing [HERO PRODUCT]. Camera: [MOVEMENT]. Lighting: [DRAMATIC SETUP]. Environment: [ATMOSPHERE]. Motion: [REVEAL SEQUENCE].\"\n\n## Processing Instructions:\n1. Analyze the campaign objectives to understand the brand message and tone\n2. Incorporate the user's video instructions as the core creative direction\n3. Use the images description to inform visual style and composition\n4. Integrate the aspect ratio requirement seamlessly into camera and framing descriptions\n5. Create a cohesive narrative that serves the campaign goals\n6. Ensure all technical specifications support professional video production quality\n\n## Output Requirements:\n- Maximum prompt length: 500 words\n- Include specific technical details (camera, lighting, motion)\n- Maintain cinematic language and professional terminology\n- Ensure brand alignment with campaign objectives\n- Specify aspect ratio integration\n- Include timing and sequence details for complex actions\n- End with clear resolution or call-to-action alignment\n\n## Quality Checklist:\n- [ ] Cinematic and professional language used\n- [ ] Technical camera specifications included\n- [ ] Lighting setup described\n- [ ] Motion/action clearly detailed\n- [ ] Aspect ratio properly integrated\n- [ ] Campaign objectives reflected\n- [ ] Visual coherence with image descriptions\n- [ ] Professional production quality indicators included\n- [ ] Timing and sequence properly structured\n- [ ] Brand-appropriate tone maintained\n\nRemember: Your output must be ONLY the stringified JSON object with the Video_prompt containing a stringified JSON structure. Do not include any other text, explanations, or formatting outside of the required JSON structure. The Video_prompt value should be a complete JSON object converted to a string with properly escaped quotes."
}
]
},
"jsonOutput": true
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.8
},
{
"id": "4ddf5722-41ec-46a9-9859-3eccf5b724e8",
"name": "Think - VEO3",
"type": "@n8n/n8n-nodes-langchain.toolThink",
"position": [
1152,
528
],
"parameters": {},
"typeVersion": 1.1
},
{
"id": "c9824eed-7328-4c35-adea-7eab9c7fe9d1",
"name": "Think - GPT IMAG1",
"type": "@n8n/n8n-nodes-langchain.toolThink",
"position": [
1840,
224
],
"parameters": {},
"typeVersion": 1.1
},
{
"id": "771367bf-3c1c-49ce-baf2-d940305fcbb6",
"name": "If success",
"type": "n8n-nodes-base.if",
"position": [
1632,
416
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "42ce1435-74b7-41c6-9a20-1017dc048a35",
"operator": {
"type": "number",
"operation": "equals"
},
"leftValue": "={{ $json.code }}",
"rightValue": 200
}
]
}
},
"typeVersion": 2.2
},
{
"id": "327cb892-e136-421b-b5da-553507d1741b",
"name": "Limit 1 Image - API Limit",
"type": "n8n-nodes-base.limit",
"position": [
464,
416
],
"parameters": {},
"typeVersion": 1
},
{
"id": "6e291e3f-572b-4c72-8314-bf66a9ab677c",
"name": "Retrieve Video - 1080p - video",
"type": "n8n-nodes-base.httpRequest",
"position": [
2016,
416
],
"parameters": {
"url": "https://api.kie.ai/api/v1/veo/record-info",
"options": {},
"sendQuery": true,
"sendHeaders": true,
"queryParameters": {
"parameters": [
{
"name": "taskId",
"value": "={{ $json.data.taskId }}"
}
]
},
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "=Bearer {{ $('Get a Concept Record ID - Video Generation').item.json['API Key (from API Services) (from Agency)'][0] }}"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "86efc895-d870-4fb1-82a0-6cdf35e7b63b",
"name": "Update Video Assets Results",
"type": "n8n-nodes-base.airtable",
"position": [
2400,
416
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "appH2OEGW78g0qSOw",
"cachedResultUrl": "https://airtable.com/appH2OEGW78g0qSOw",
"cachedResultName": "AI-powered campaign concept generation"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tbliQfQHTLEw6henQ",
"cachedResultUrl": "https://airtable.com/appH2OEGW78g0qSOw/tbliQfQHTLEw6henQ",
"cachedResultName": "Concept Generation"
},
"columns": {
"value": {
"id": "={{ $('Webhook').item.json.query.recordId }}",
"Run": false,
"Video Status": "success",
"Videos Assets": "={{ [ { \"url\": $json.data.response.resultUrls[0] } ] }}"
},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "id",
"defaultMatch": true
},
{
"id": "Campaign",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Campaign",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Description",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Description",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Upload Assets",
"type": "array",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Upload Assets",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Images Description",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Images Description",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Run",
"type": "boolean",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Run",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Details Status",
"type": "options",
"display": true,
"options": [
{
"name": "Start",
"value": "Start"
},
{
"name": "Generating",
"value": "Generating"
},
{
"name": "Completed",
"value": "Completed"
},
{
"name": "Error",
"value": "Error"
}
],
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Details Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Personas",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Personas",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Key messages",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Key mes
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.
airtableTokenApiopenAiApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This template is perfect for e-commerce entrepreneurs, marketers, agencies, and creative teams who want to turn simple product photos and short descriptions into professional flyers or product videos—automatically and at scale.
Source: https://n8n.io/workflows/7487/ — 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.
This powerful n8n automation workflow is designed to execute advanced B2B lead enrichment and hyper-personalization for cold email outreach. By orchestrating a complex chain of data scraping, AI analy
AI-Powered Fake Review Detection Workflow Using n8n & Airtable. Uses httpRequest, airtable, openAi, slack. Webhook trigger; 27 nodes.
This workflow automatically monitors Facebook Group posts, analyzes them using AI, detects policy violations, logs incidents, notifies moderators and automatically hides high-severity posts to keep th
Accelerate your real estate marketing by moving from "photo capture" to "published listing" in seconds. This workflow automates the entire listing process by hosting property photos via UploadToURL, u
Automatically triages risky AWS misconfigurations and alerts your team.