개발 완료 - Veo3를 통한 제품 광고 생성
이것은Content Creation, Multimodal AI분야의자동화 워크플로우로, 16개의 노드를 포함합니다.주로 Code, Form, Wait, Airtable, FormTrigger 등의 노드를 사용하며. Google Veo 3, Gemini 및 Airtable을 사용한 AI 비디오 광고 생성 자동화
- •Airtable API Key
- •대상 API의 인증 정보가 필요할 수 있음
{
"id": "O7BiL9gvzMRGnzco",
"meta": {
"instanceId": "1a54c41d9050a8f1fa6f74ca858828ad9fb97b9fafa3e9760e576171c531a787",
"templateCredsSetupCompleted": true
},
"name": "Development Done - Product Ads via Veo3",
"tags": [
{
"id": "m1paRrANi4GrQXxX",
"name": "AI Internal",
"createdAt": "2025-09-18T04:05:25.667Z",
"updatedAt": "2025-09-18T04:05:25.667Z"
}
],
"nodes": [
{
"id": "dc93f801-d671-49a1-80a1-a19f3c3d4e8d",
"name": "레코드 생성",
"type": "n8n-nodes-base.airtable",
"position": [
-48,
-64
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "Your_Airtable_Base_ID",
"cachedResultUrl": "https://airtable.com/Your_Airtable_Base_ID",
"cachedResultName": "Dynamic Video Content"
},
"table": {
"__rl": true,
"mode": "list",
"value": "Your_Airtable_Table_ID",
"cachedResultUrl": "https://airtable.com/Your_Airtable_Base_ID/Your_Airtable_Table_ID",
"cachedResultName": "Product Ads"
},
"columns": {
"value": {
"Status": "Pending",
"Image Prompt": "={{ $json[\"Idea Prompt\"] }}"
},
"schema": [
{
"id": "Id",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Image Prompt",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Image Prompt",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Image",
"type": "array",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Image",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Video",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Video",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "options",
"display": true,
"options": [
{
"name": "Pending",
"value": "Pending"
},
{
"name": "Done",
"value": "Done"
}
],
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "create"
},
"credentials": {
"airtableTokenApi": {
"id": "Your_Airtable_Credentials_ID",
"name": "Airtable Personal Access Token account"
}
},
"typeVersion": 2.1
},
{
"id": "2cffa033-d677-4c1a-8bbd-92f10814e14d",
"name": "저장용 이미지 파일 변환",
"type": "n8n-nodes-base.code",
"position": [
400,
-64
],
"parameters": {
"jsCode": "// Get the first binary key dynamically\nconst binaryKey = Object.keys($input.item.binary || {})[0];\nif (!binaryKey) {\n throw new Error(\"No binary data found on input item.\");\n}\n\nconst binary = $input.item.binary[binaryKey];\n\n// Convert binary to base64\nconst base64File = binary.data.toString('base64');\n\n// Build JSON payload for Airtable\nreturn [\n {\n json: {\n contentType: binary.mimeType || \"image/jpeg\",\n file: base64File,\n filename: binary.fileName || \"upload.jpg\"\n },\n pairedItem: { item: 0 } // 🔑 keeps mapping to original input\n }\n];\n"
},
"typeVersion": 2
},
{
"id": "22250c9d-136c-43cd-be88-8c3423c1c642",
"name": "Airtable에 이미지 업로드",
"type": "n8n-nodes-base.httpRequest",
"position": [
624,
-64
],
"parameters": {
"url": "=https://content.airtable.com/v0/Your_Airtable_Base_ID/{{ $('Create a record').item.json.id }}/[Your_Column_Name]/uploadAttachment",
"method": "POST",
"options": {},
"sendBody": true,
"sendHeaders": true,
"bodyParameters": {
"parameters": [
{
"name": "contentType",
"value": "={{$json[\"contentType\"]}}"
},
{
"name": "file",
"value": "={{$json[\"file\"]}}"
},
{
"name": "filename",
"value": "={{$json[\"filename\"]}}"
}
]
},
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer Your_Airtable_Personal_Access_Token"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "3007c7d8-a294-4146-b610-ba10aa344881",
"name": "레코드 가져오기",
"type": "n8n-nodes-base.airtable",
"position": [
848,
-64
],
"parameters": {
"id": "={{ $json.id }}",
"base": {
"__rl": true,
"mode": "list",
"value": "Your_Airtable_Base_ID",
"cachedResultUrl": "https://airtable.com/Your_Airtable_Base_ID",
"cachedResultName": "Dynamic Video Content"
},
"table": {
"__rl": true,
"mode": "list",
"value": "Your_Airtable_Table_ID",
"cachedResultUrl": "https://airtable.com/Your_Airtable_Base_ID/Your_Airtable_Table_ID",
"cachedResultName": "Product Ads"
},
"options": {}
},
"credentials": {
"airtableTokenApi": {
"id": "Your_Airtable_Credentials_ID",
"name": "Airtable Personal Access Token account"
}
},
"typeVersion": 2.1
},
{
"id": "04a074e2-dd05-4699-b30f-cf1f004170e5",
"name": "이미지 분석",
"type": "@n8n/n8n-nodes-langchain.googleGemini",
"position": [
1056,
-64
],
"parameters": {
"text": "=You are an expert AI creative analyst. Your purpose is to analyze an input image together with the user’s creative request and produce a structured creative brief. Always treat the user’s request as the guiding vision, and reinterpret the image so that the final video concept fulfills that request. Your output must be only the plain text report as described below. Do not include any conversational filler or explanatory text.\n\nUSER REQUEST\n{{ $json[\"Image Prompt\"] }}\n\nIMAGE ANALYSIS\n\nDescription\nWrite a comprehensive, single-paragraph description of the image as it visually appears. Then explicitly describe how this image can be creatively reimagined or transformed to align with the user’s request.\n\nStyle Analysis\n\nCore Subject: Identify the main focus of the image and explain how it connects to the user’s request.\n\nSetting: Describe the environment/background and how it could be reinterpreted in the requested concept.\n\nMedium: Specify the artistic medium (e.g., product photography, 3D render) and suggest how the medium might shift in the video.\n\nLighting: Describe the current light and suggest adjustments to match the requested mood.\n\nMood: Define both the existing atmosphere of the image and the intended emotional tone per the user’s request.\n\nComposition: Describe the current framing/camera angle and how it might evolve in the video.\n\nColor Palette: List the dominant colors, then suggest enhancements or transformations to match the user’s request.\n\nText Overlay\nList and describe each distinct piece of text found in the image. If there is no text, simply write \"None.\"\n\nFor each text element, provide:\n- Text\n- Font\n- Effect\n- Color\n- Placement\n\nCREATIVE VIDEO BRIEF\n\nTranslate the user request and image analysis into a structured video brief suitable for Veo 3 generation:\n\nVideo Style: Describe the final style/genre of the requested video.\n\nTarget Emotion: Define the main emotional impact the video should deliver.\n\nMotion Guidance: Suggest dynamic camera motions, transitions, or visual effects that bring the user’s request to life.\n\nAudio/Music Direction: Suggest music/sound design that fits both the brand identity in the image and the requested theme.\n\nSuggested Script Elements: Provide a draft outline of possible voiceover or on-screen text. Ensure this ties the image (e.g., Pepsi product) with the user’s creative request (e.g., exploding into a disco party).\n",
"modelId": {
"__rl": true,
"mode": "list",
"value": "models/gemini-2.5-flash",
"cachedResultName": "models/gemini-2.5-flash"
},
"options": {},
"resource": "image",
"imageUrls": "={{ $json.Image[0].url }}",
"operation": "analyze"
},
"credentials": {
"googlePalmApi": {
"id": "Your_Gemini_API_Credentials_ID",
"name": "Gemini API Credentials"
}
},
"typeVersion": 1
},
{
"id": "e0533567-2b84-414d-b841-97f40163b08d",
"name": "대기",
"type": "n8n-nodes-base.wait",
"position": [
1744,
-64
],
"webhookId": "b98d5051-5f08-4709-9c31-e914da10b4ad",
"parameters": {
"unit": "minutes",
"amount": 1
},
"typeVersion": 1.1
},
{
"id": "6e0d258e-1e7e-453b-8780-47a959243ff6",
"name": "레코드 업데이트",
"type": "n8n-nodes-base.airtable",
"position": [
1968,
-64
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "Your_Airtable_Base_ID",
"cachedResultUrl": "https://airtable.com/Your_Airtable_Base_ID",
"cachedResultName": "Dynamic Video Content"
},
"table": {
"__rl": true,
"mode": "list",
"value": "Your_Airtable_Table_ID",
"cachedResultUrl": "https://airtable.com/Your_Airtable_Base_ID/Your_Airtable_Table_ID",
"cachedResultName": "Product Ads"
},
"columns": {
"value": {
"Id": "={{ $('Get a record').item.json.Id }}",
"Status": "Done"
},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "id",
"defaultMatch": true
},
{
"id": "Id",
"type": "string",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "Id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Image Prompt",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Image Prompt",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Image",
"type": "array",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Image",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "options",
"display": true,
"options": [
{
"name": "Pending",
"value": "Pending"
},
{
"name": "Done",
"value": "Done"
}
],
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Video",
"type": "array",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Video",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Id"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update"
},
"credentials": {
"airtableTokenApi": {
"id": "Your_Airtable_Personal_Access_Token_ID",
"name": "Airtable Personal Access Token account"
}
},
"typeVersion": 2.1
},
{
"id": "3ad82fa6-e313-46e3-bfe7-c3505f8ff8f7",
"name": "Veo 3 비디오 생성",
"type": "n8n-nodes-base.httpRequest",
"position": [
1520,
-64
],
"parameters": {
"url": "https://us-central1-aiplatform.googleapis.com/v1/projects/[Project ID]/locations/[Location]/publishers/google/models/veo-3.0-fast-generate-001:predictLongRunning",
"method": "POST",
"options": {},
"jsonBody": "={{ $json.veoRequestBody }}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"authentication": "predefinedCredentialType",
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer Your_Google_GCP_Token"
}
]
},
"nodeCredentialType": "googleOAuth2Api"
},
"credentials": {
"googlePalmApi": {
"id": "Your_Gemini_API_Credentials_ID",
"name": "Gemini Key account"
},
"googleOAuth2Api": {
"id": "Your_Google_OAuth2_Credentials_ID",
"name": "Google account"
}
},
"typeVersion": 4.2
},
{
"id": "ee7a1540-5467-4461-b73c-dc4eaeba8812",
"name": "비디오 가져오기",
"type": "n8n-nodes-base.httpRequest",
"position": [
2192,
-64
],
"parameters": {
"url": "https://us-central1-aiplatform.googleapis.com/v1/projects/[Project ID]/locations/[Location]/publishers/google/models/veo-3.0-generate-001:fetchPredictOperation",
"method": "POST",
"options": {
"response": {
"response": {}
}
},
"sendBody": true,
"sendHeaders": true,
"authentication": "predefinedCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "operationName",
"value": "={{ $('Generate Video Veo 3').item.json.name }}"
}
]
},
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer Your_Google_GCP_Token"
}
]
},
"nodeCredentialType": "googleOAuth2Api"
},
"credentials": {
"googleOAuth2Api": {
"id": "Your_Google_OAuth2_Credentials_ID",
"name": "Google account"
}
},
"typeVersion": 4.2
},
{
"id": "42d12f7e-34f5-474b-a136-5a6485763bf6",
"name": "다운로드 가능한 비디오",
"type": "n8n-nodes-base.convertToFile",
"position": [
2416,
-64
],
"parameters": {
"options": {},
"operation": "toBinary",
"sourceProperty": "response.videos[0].bytesBase64Encoded"
},
"typeVersion": 1.1
},
{
"id": "097d5ffc-0481-4261-9d68-355ab2ec9266",
"name": "요청 파싱",
"type": "n8n-nodes-base.code",
"position": [
1296,
-64
],
"parameters": {
"jsCode": "// Get the generated prompt text from the previous node\nconst promptText = $json.content.parts[0].text;\n\n// Build the complete JSON body for the VEO API\nconst requestBody = {\n \"endpoint\": \"projects/personalised-mail/locations/us-central1/publishers/google/models/veo-3.0-generate-001\",\n \"instances\": [\n {\n \"prompt\": promptText\n }\n ],\n \"parameters\": {\n \"aspectRatio\": \"16:9\",\n \"sampleCount\": 1,\n \"durationSeconds\": \"8\",\n \"personGeneration\": \"allow_all\",\n \"addWatermark\": true,\n \"includeRaiReason\": true,\n \"generateAudio\": true,\n \"resolution\": \"720p\"\n }\n};\n\n// Return the final object inside a wrapper\nreturn [\n {\n json: {\n \"veoRequestBody\": requestBody // <-- Wrapped here\n }\n }\n];"
},
"typeVersion": 2
},
{
"id": "f3054ab6-92de-415c-9f72-24feacebb207",
"name": "아이디어 프롬프트 작성",
"type": "n8n-nodes-base.formTrigger",
"position": [
-272,
-64
],
"webhookId": "5778677c-d323-4bb4-91df-d2870e3aced9",
"parameters": {
"options": {},
"formTitle": "Upload Your File",
"formFields": {
"values": [
{
"fieldLabel": "Idea Prompt",
"requiredField": true
}
]
},
"formDescription": "Please give the prompt !"
},
"typeVersion": 2.2
},
{
"id": "2b288e59-f675-4519-8c74-9014e8ce6479",
"name": "이미지 업로드",
"type": "n8n-nodes-base.form",
"position": [
176,
-64
],
"webhookId": "65fd2f3a-d87c-412e-9f57-15f0720aca1f",
"parameters": {
"options": {},
"formFields": {
"values": [
{
"fieldType": "file",
"fieldLabel": "Image"
}
]
}
},
"typeVersion": 1
},
{
"id": "89df8bc5-c051-4c14-9ea3-7f214bdbf1d9",
"name": "스티커 노트",
"type": "n8n-nodes-base.stickyNote",
"position": [
128,
-336
],
"parameters": {
"color": 5,
"width": 528,
"height": 192,
"content": "## Airtable Configuration\n* **Airtable Credentials**: In the \"Create a record\", \"Get a record\", and \"Update record\" nodes, you must select your own Airtable credentials.\n* **Base and Table IDs**: Update the Base ID and Table ID in all four Airtable-related nodes to match your own setup: \"Create a record\", \"Uploading Image in Airtable\" (in the URL), \"Get a record\", and \"Update record\"."
},
"typeVersion": 1
},
{
"id": "b4c1f237-6548-44d5-b232-247ac05ee4a8",
"name": "스티커 노트1",
"type": "n8n-nodes-base.stickyNote",
"position": [
1728,
-368
],
"parameters": {
"color": 4,
"width": 544,
"height": 240,
"content": "## Google AI Configuration\n* **Gemini Node** (\"Analyze image\"): Select your Google AI (Gemini) API credentials.\n**Veo Nodes (\"Parse Request\" & HTTP Requests):** \n* **Project ID**: In the URLs, replace with your Google Cloud Project ID.\n* **Credentials**: In both HTTP request nodes (\"Generate Video Veo 3\" & \"Get the Video\"), select your Google OAuth2 credentials.\n* **API Info**: For help with endpoints, see the [Google Cloud Vertex AI Studio](https://www.google.com/search?q=https://console.cloud.google.com/vertex-ai/studio/media/generate)"
},
"typeVersion": 1
},
{
"id": "e0741edb-ab0f-445e-a415-aff8e58057f3",
"name": "스티커 노트2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1216,
-352
],
"parameters": {
"color": 6,
"width": 304,
"height": 192,
"content": "## Customization\n**Video Generation Parameters**: In the \"Parse Request\" node, you can modify the JavaScript code to change video settings like *aspectRatio*, *durationSeconds*, and *resolution*."
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "88471e4e-1558-4a15-9060-712afdb19c0d",
"connections": {
"e0533567-2b84-414d-b841-97f40163b08d": {
"main": [
[
{
"node": "6e0d258e-1e7e-453b-8780-47a959243ff6",
"type": "main",
"index": 0
}
]
]
},
"3007c7d8-a294-4146-b610-ba10aa344881": {
"main": [
[
{
"node": "04a074e2-dd05-4699-b30f-cf1f004170e5",
"type": "main",
"index": 0
}
]
]
},
"2b288e59-f675-4519-8c74-9014e8ce6479": {
"main": [
[
{
"node": "2cffa033-d677-4c1a-8bbd-92f10814e14d",
"type": "main",
"index": 0
}
]
]
},
"04a074e2-dd05-4699-b30f-cf1f004170e5": {
"main": [
[
{
"node": "097d5ffc-0481-4261-9d68-355ab2ec9266",
"type": "main",
"index": 0
}
]
]
},
"ee7a1540-5467-4461-b73c-dc4eaeba8812": {
"main": [
[
{
"node": "42d12f7e-34f5-474b-a136-5a6485763bf6",
"type": "main",
"index": 0
}
]
]
},
"097d5ffc-0481-4261-9d68-355ab2ec9266": {
"main": [
[
{
"node": "3ad82fa6-e313-46e3-bfe7-c3505f8ff8f7",
"type": "main",
"index": 0
}
]
]
},
"6e0d258e-1e7e-453b-8780-47a959243ff6": {
"main": [
[
{
"node": "ee7a1540-5467-4461-b73c-dc4eaeba8812",
"type": "main",
"index": 0
}
]
]
},
"dc93f801-d671-49a1-80a1-a19f3c3d4e8d": {
"main": [
[
{
"node": "2b288e59-f675-4519-8c74-9014e8ce6479",
"type": "main",
"index": 0
}
]
]
},
"f3054ab6-92de-415c-9f72-24feacebb207": {
"main": [
[
{
"node": "dc93f801-d671-49a1-80a1-a19f3c3d4e8d",
"type": "main",
"index": 0
}
]
]
},
"42d12f7e-34f5-474b-a136-5a6485763bf6": {
"main": [
[]
]
},
"3ad82fa6-e313-46e3-bfe7-c3505f8ff8f7": {
"main": [
[
{
"node": "e0533567-2b84-414d-b841-97f40163b08d",
"type": "main",
"index": 0
}
]
]
},
"22250c9d-136c-43cd-be88-8c3423c1c642": {
"main": [
[
{
"node": "3007c7d8-a294-4146-b610-ba10aa344881",
"type": "main",
"index": 0
}
]
]
},
"2cffa033-d677-4c1a-8bbd-92f10814e14d": {
"main": [
[
{
"node": "22250c9d-136c-43cd-be88-8c3423c1c642",
"type": "main",
"index": 0
}
]
]
}
}
}이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
고급 - 콘텐츠 제작, 멀티모달 AI
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
Intuz
@intuzWorkflow automation can help automate your routine activities and help saves $$$, as well as hours of time. As a boutique tech consulting company, Intuz help businesses with custom AI/ML, AI Workflow Automations, and software development. Automate your business workflow for: Sales Marketing Accounting Finance Operations E-Commerce Customer Support Admin & Backoffice Logistics & Supply Chain
이 워크플로우 공유