This workflow corresponds to n8n.io template #17838 — we link there as the canonical source.
This workflow follows the Agent → Blotaton8N Nodes Blotato 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": "Q8fnksJzDJS5kIBo",
"meta": {
"builderVariant": "mcp",
"aiBuilderAssisted": true
},
"name": "Generate AI video ads from product photos with Seedance 2.0 and publish to social media",
"tags": [],
"nodes": [
{
"id": "95c2a42f-6aa3-4c67-8308-f7899264f287",
"name": "Receive Product Photo (Telegram Trigger)",
"type": "n8n-nodes-base.telegramTrigger",
"position": [
-1040,
160
],
"parameters": {
"updates": [
"message"
],
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "2aa21ad2-2671-41a4-a52f-92cfbff0f8d5",
"name": "Configuration",
"type": "n8n-nodes-base.set",
"position": [
-816,
160
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "cfg-1",
"name": "openai_vision_model",
"type": "string",
"value": "gpt-4o-mini"
},
{
"id": "cfg-2",
"name": "openai_agent_model",
"type": "string",
"value": "gpt-5-mini"
},
{
"id": "cfg-3",
"name": "atlas_model",
"type": "string",
"value": "bytedance/seedance-2.0/text-to-video"
},
{
"id": "cfg-4",
"name": "video_duration_seconds",
"type": "number",
"value": 10
},
{
"id": "cfg-5",
"name": "aspect_ratio",
"type": "string",
"value": "9:16"
},
{
"id": "cfg-6",
"name": "video_resolution",
"type": "string",
"value": "720p"
},
{
"id": "cfg-7",
"name": "video_status_wait_minutes",
"type": "number",
"value": 2
},
{
"id": "cfg-8",
"name": "output_language",
"type": "string",
"value": "English"
},
{
"id": "cfg-9",
"name": "tiktok_privacy_level",
"type": "string",
"value": "PUBLIC_TO_EVERYONE"
},
{
"id": "cfg-10",
"name": "campaign_text",
"type": "string",
"value": "={{ $json.message.caption ?? \"\" }}"
}
]
},
"includeOtherFields": true
},
"typeVersion": 3.4
},
{
"id": "9c9fb8a5-cb20-4d3d-832f-dbc7b64fe154",
"name": "Get Telegram File Path",
"type": "n8n-nodes-base.telegram",
"position": [
-640,
160
],
"parameters": {
"fileId": "={{ $json.message.photo[$json.message.photo.length - 1].file_id }}",
"resource": "file",
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "d170e643-4772-4a37-ad05-34a9511bf2e9",
"name": "Analyze Product Image (OpenAI Vision)",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
-368,
160
],
"parameters": {
"text": "Describe this product in full detail for an advertising video script: shape, color, material, texture, packaging and any visible branding. Fully ignore the background, focus only on the product.",
"images": {
"values": [
{}
]
},
"modelId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Configuration').item.json.openai_vision_model }}"
},
"options": {},
"resource": "image",
"inputType": "base64",
"operation": "analyze"
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.3
},
{
"id": "232e423f-ef33-4a8e-bf87-0ce703122a2c",
"name": "Generate Video Ad Concept",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
96,
160
],
"parameters": {
"text": "=Product description (from image analysis): {{ $('Analyze Product Image (OpenAI Vision)').item.json.content }}\nCampaign / caption from the user: {{ $('Configuration').item.json.campaign_text }}\nTarget video duration: {{ $('Configuration').item.json.video_duration_seconds }} seconds\nAspect ratio: {{ $('Configuration').item.json.aspect_ratio }}\nOutput language for any spoken/on-screen concept notes: {{ $('Configuration').item.json.output_language }}\n\nWrite ONE advertising video concept for a text-to-video AI model. Return only the JSON defined in your instructions.",
"options": {
"systemMessage": "You are an advertising Video Prompt Designer for a text-to-video AI model (no reference image is passed to the video model, only text).\n\nTreat the product description as factual ground truth: keep color, material and shape consistent with it.\nWrite ONE continuous, one-shot cinematic prompt: describe the setting, camera movement (e.g. slow dolly-in, orbit, static macro shot), lighting, and how the product is presented, in plain visual language a video model can follow.\nDo not include any on-screen text, logos or brand names in the video prompt itself, since text-to-video models cannot render legible text or exact logos reliably.\nIf a campaign or seasonal context is given (e.g. \"10.10\", \"Christmas\", \"Summer\"), reflect its mood in the lighting, props and color grade.\nKeep the prompt to 2-4 sentences, purely visual, no camera jargon the model would not understand.\nReturn only the JSON object defined by the output schema, nothing else."
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 3.1
},
{
"id": "0d60c86d-0982-4edd-b4c5-d5c2c6a66a1c",
"name": "AI Model (GPT)",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
592,
688
],
"parameters": {
"model": {
"__rl": true,
"mode": "id",
"value": "={{ $('Configuration').item.json.openai_agent_model }}"
},
"options": {},
"builtInTools": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "4a196bfd-40ad-4020-a0e0-fdc6ea6c28f1",
"name": "Video Concept Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
224,
624
],
"parameters": {
"autoFix": true,
"schemaType": "manual",
"inputSchema": "{\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"video_prompt\":{\"type\":\"string\",\"description\":\"Full one-shot cinematic prompt for a text-to-video AI model: camera movement, lighting, setting, motion, product presence\"},\"scene_description\":{\"type\":\"string\"},\"marketing_angle\":{\"type\":\"string\"},\"style\":{\"type\":\"string\"}},\"required\":[\"video_prompt\",\"scene_description\",\"marketing_angle\"]}"
},
"typeVersion": 1.3
},
{
"id": "f091b5d6-1af2-4e15-88ff-11d4b5c5c3c8",
"name": "Prepare Video Prompt Fields",
"type": "n8n-nodes-base.set",
"position": [
432,
160
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "vpf-1",
"name": "video_prompt",
"type": "string",
"value": "={{ $json.output.video_prompt }}"
},
{
"id": "vpf-2",
"name": "scene_description",
"type": "string",
"value": "={{ $json.output.scene_description }}"
},
{
"id": "vpf-3",
"name": "marketing_angle",
"type": "string",
"value": "={{ $json.output.marketing_angle }}"
},
{
"id": "vpf-4",
"name": "style",
"type": "string",
"value": "={{ $json.output.style ?? \"\" }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "e7cd67c2-9ea4-4c73-93df-da2243a76c2c",
"name": "User Review: Approve/Reject Video Prompt",
"type": "n8n-nodes-base.telegram",
"position": [
656,
160
],
"parameters": {
"chatId": "={{ $('Receive Product Photo (Telegram Trigger)').item.json.message.chat.id }}",
"message": "=\ud83c\udfac Video ad concept ready\n\nMarketing angle: {{ $json.marketing_angle }}\n\nScene: {{ $json.scene_description }}\n\nVideo prompt:\n{{ $json.video_prompt }}",
"options": {
"appendAttribution": false
},
"operation": "sendAndWait",
"formFields": {
"values": [
{
"fieldType": "radio",
"fieldLabel": "Approval",
"fieldOptions": {
"values": [
{
"option": "Approve"
},
{
"option": "Reject"
}
]
},
"requiredField": true
},
{
"fieldLabel": "Comment",
"placeholder": "If Reject, add feedback so the concept can be revised."
}
]
},
"responseType": "customForm"
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"executeOnce": true,
"typeVersion": 1.2
},
{
"id": "65511f61-5949-4ec7-87b9-cb6a05b17b3d",
"name": "Check Prompt Approval (Yes/No)",
"type": "n8n-nodes-base.if",
"position": [
880,
160
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.data.Approval }}",
"rightValue": "Approve"
}
]
}
},
"typeVersion": 2.3
},
{
"id": "a79bcb74-9c7e-4c3a-bc10-ab4c55db258f",
"name": "Prepare AtlasCloud Request Fields",
"type": "n8n-nodes-base.set",
"position": [
1152,
144
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "agf-1",
"name": "final_video_prompt",
"type": "string",
"value": "={{ $('Prepare Video Prompt Fields').item.json.video_prompt }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "47eb31f9-f186-4b15-8201-9a14ba1064a2",
"name": "Submit Video Generation (AtlasCloud)",
"type": "n8n-nodes-base.httpRequest",
"position": [
1392,
144
],
"parameters": {
"url": "https://api.atlascloud.ai/api/v1/model/generateVideo",
"method": "POST",
"options": {},
"jsonBody": "={\n \"model\": \"{{ $('Configuration').item.json.atlas_model }}\",\n \"prompt\": {{ JSON.stringify($json.final_video_prompt) }},\n \"duration\": {{ $('Configuration').item.json.video_duration_seconds }},\n \"aspect_ratio\": \"{{ $('Configuration').item.json.aspect_ratio }}\",\n \"resolution\": \"{{ $('Configuration').item.json.video_resolution }}\"\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.4
},
{
"id": "61cdad49-5eb8-407c-bb71-890f5c2d5d68",
"name": "Wait Before Checking Status",
"type": "n8n-nodes-base.wait",
"position": [
1632,
144
],
"parameters": {
"unit": "minutes",
"amount": "={{ $('Configuration').item.json.video_status_wait_minutes }}"
},
"typeVersion": 1.1
},
{
"id": "10a606c0-a016-4eb1-9f58-b37acfe09357",
"name": "Check Video Status (AtlasCloud)",
"type": "n8n-nodes-base.httpRequest",
"position": [
1856,
144
],
"parameters": {
"url": "=https://api.atlascloud.ai/api/v1/model/prediction/{{ $('Submit Video Generation (AtlasCloud)').item.json.data.id }}",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"typeVersion": 4.4
},
{
"id": "7bace0c2-6d56-48cf-8f12-47d1db692835",
"name": "Route by Video Status",
"type": "n8n-nodes-base.switch",
"position": [
2080,
128
],
"parameters": {
"rules": {
"values": [
{
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": false,
"typeValidation": "strict"
},
"combinator": "or",
"conditions": [
{
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.data.status }}",
"rightValue": "completed"
},
{
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.data.status }}",
"rightValue": "succeeded"
}
]
}
},
{
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": false,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.data.status }}",
"rightValue": "failed"
}
]
}
}
]
},
"options": {
"fallbackOutput": "extra",
"renameFallbackOutput": "Processing"
}
},
"typeVersion": 3.4
},
{
"id": "c1b0330b-ac2a-4f73-ba2a-9565d5b8515e",
"name": "Send Generated Video to Telegram",
"type": "n8n-nodes-base.telegram",
"position": [
2352,
0
],
"parameters": {
"file": "={{ $('Check Video Status (AtlasCloud)').item.json.data.outputs[0] }}",
"chatId": "={{ $('Receive Product Photo (Telegram Trigger)').item.json.message.chat.id }}",
"operation": "sendVideo",
"additionalFields": {
"caption": "Here is your generated ad video. Approve it to continue?"
}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "3d16c0f3-cdca-4579-afca-f0ba87f65949",
"name": "User Review: Approve/Reject Generated Video",
"type": "n8n-nodes-base.telegram",
"position": [
2576,
0
],
"parameters": {
"chatId": "={{ $('Receive Product Photo (Telegram Trigger)').item.json.message.chat.id }}",
"message": "Do you approve this generated video? If not, we will regenerate it from the same concept.",
"options": {
"appendAttribution": false
},
"operation": "sendAndWait",
"formFields": {
"values": [
{
"fieldType": "radio",
"fieldLabel": "Approval",
"fieldOptions": {
"values": [
{
"option": "Approve"
},
{
"option": "Reject"
}
]
},
"requiredField": true
}
]
},
"responseType": "customForm"
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"executeOnce": true,
"typeVersion": 1.2
},
{
"id": "56667605-bdb7-4393-9d25-f9d0a2e5ed6a",
"name": "Check Video Approval (Yes/No)",
"type": "n8n-nodes-base.if",
"position": [
2816,
0
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.data.Approval }}",
"rightValue": "Approve"
}
]
}
},
"typeVersion": 2.3
},
{
"id": "6309f562-d5b3-40ca-96f4-c167a98a3da3",
"name": "Generate Social Media Caption",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
3040,
64
],
"parameters": {
"text": "=Product description: {{ $('Analyze Product Image (OpenAI Vision)').item.json.content }}\nMarketing angle: {{ $('Prepare Video Prompt Fields').item.json.marketing_angle }}\nCampaign / caption from the user: {{ $('Configuration').item.json.campaign_text }}\nOutput language: {{ $('Configuration').item.json.output_language }}\n\nWrite one social media caption for this video ad. Return only the JSON defined in your instructions.",
"options": {
"systemMessage": "You are a social media copywriter writing captions for a short video ad (Facebook, Instagram, TikTok, YouTube Shorts).\n\nWrite in the requested output language. Keep the caption short (2-5 lines), engaging, with 1-3 relevant emojis, and a clear call to action.\nDo not fabricate product claims not present in the description.\nProvide 3 to 8 relevant hashtags, without the platform name itself.\nReturn only the JSON object defined by the output schema, nothing else."
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 3.1
},
{
"id": "d848666a-681b-40ca-ad36-95f49ed4e48e",
"name": "AI Model (Caption)",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
3056,
384
],
"parameters": {
"model": {
"__rl": true,
"mode": "id",
"value": "={{ $('Configuration').item.json.openai_agent_model }}"
},
"options": {},
"builtInTools": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "7ec74c75-bbec-41a1-b822-7b1b4412d7c0",
"name": "Caption Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
3232,
384
],
"parameters": {
"autoFix": true,
"schemaType": "manual",
"inputSchema": "{\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"post_text\":{\"type\":\"string\"},\"hashtags\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"minItems\":3,\"maxItems\":8}},\"required\":[\"post_text\",\"hashtags\"]}"
},
"typeVersion": 1.3
},
{
"id": "e06002eb-6b0c-457d-b760-a174388b109a",
"name": "Prepare Caption Fields",
"type": "n8n-nodes-base.set",
"position": [
3504,
-48
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "cf-1",
"name": "post_text",
"type": "string",
"value": "={{ $json.output.post_text }}"
},
{
"id": "cf-2",
"name": "hashtags_text",
"type": "string",
"value": "={{ $json.output.hashtags.join(\" \") }}"
},
{
"id": "cf-3",
"name": "full_caption",
"type": "string",
"value": "={{ $json.output.post_text + \"\\n\\n\" + $json.output.hashtags.join(\" \") }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "c9271bbc-26ca-49ec-b993-9cd0a0bd7341",
"name": "User Review: Approve/Reject Caption",
"type": "n8n-nodes-base.telegram",
"position": [
3744,
-48
],
"parameters": {
"chatId": "={{ $('Receive Product Photo (Telegram Trigger)').item.json.message.chat.id }}",
"message": "=This caption will be published with your video:\n\n{{ $json.full_caption }}",
"options": {
"appendAttribution": false
},
"operation": "sendAndWait",
"formFields": {
"values": [
{
"fieldType": "radio",
"fieldLabel": "Approval",
"fieldOptions": {
"values": [
{
"option": "Approve"
},
{
"option": "Reject"
}
]
},
"requiredField": true
},
{
"fieldLabel": "Comment",
"placeholder": "If Reject, add feedback to revise the caption."
}
]
},
"responseType": "customForm"
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"executeOnce": true,
"typeVersion": 1.2
},
{
"id": "ade84db2-a4d0-44e2-b310-7e288be4892f",
"name": "Check Caption Approval (Yes/No)",
"type": "n8n-nodes-base.if",
"position": [
3984,
-48
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.data.Approval }}",
"rightValue": "Approve"
}
]
}
},
"typeVersion": 2.3
},
{
"id": "7792ba60-68d7-4bd4-8db3-0a171f0d9542",
"name": "Publish to Facebook (Blotato)",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
4224,
-384
],
"parameters": {
"options": {
"facebookMediaType": "reel"
},
"platform": "facebook",
"accountId": {
"__rl": true,
"mode": "list",
"value": ""
},
"facebookPageId": {
"__rl": true,
"mode": "list",
"value": ""
},
"postContentText": "={{ $('Prepare Caption Fields').item.json.full_caption }}",
"postContentMediaUrls": "={{ $('Check Video Status (AtlasCloud)').item.json.data.outputs[0] }}"
},
"typeVersion": 2
},
{
"id": "c6736909-0d49-4965-9ef8-e3ad8adcd0e4",
"name": "Publish to Instagram (Blotato)",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
4224,
-144
],
"parameters": {
"options": {
"instagramMediaType": "reel"
},
"accountId": {
"__rl": true,
"mode": "list",
"value": ""
},
"postContentText": "={{ $('Prepare Caption Fields').item.json.full_caption }}",
"postContentMediaUrls": "={{ $('Check Video Status (AtlasCloud)').item.json.data.outputs[0] }}"
},
"typeVersion": 2
},
{
"id": "d8028e8b-e366-4e5c-b828-c22ece68d3f0",
"name": "Publish to TikTok (Blotato)",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
4224,
96
],
"parameters": {
"options": {},
"platform": "tiktok",
"accountId": {
"__rl": true,
"mode": "list",
"value": ""
},
"postContentText": "={{ $('Prepare Caption Fields').item.json.full_caption }}",
"postContentMediaUrls": "={{ $('Check Video Status (AtlasCloud)').item.json.data.outputs[0] }}",
"postCreateTiktokOptionPrivacyLevel": "={{ $('Configuration').item.json.tiktok_privacy_level }}",
"postCreateTiktokOptionIsAiGenerated": true
},
"typeVersion": 2
},
{
"id": "52201377-111c-4b74-b29b-1715aad9079b",
"name": "Publish to YouTube Shorts (Blotato)",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
4224,
336
],
"parameters": {
"options": {},
"platform": "youtube",
"accountId": {
"__rl": true,
"mode": "list",
"value": ""
},
"postContentText": "={{ $('Prepare Caption Fields').item.json.full_caption }}",
"postContentMediaUrls": "={{ $('Check Video Status (AtlasCloud)').item.json.data.outputs[0] }}",
"postCreateYoutubeOptionTitle": "={{ $('Prepare Video Prompt Fields').item.json.marketing_angle }}",
"postCreateYoutubeOptionContainsSyntheticMedia": true
},
"typeVersion": 2
},
{
"id": "41912632-0d52-45f8-a677-bdd10dc744e5",
"name": "Revise Caption",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
3728,
320
],
"parameters": {
"text": "=Previous caption: {{ $('Prepare Caption Fields').item.json.post_text }}\nPrevious hashtags: {{ $('Prepare Caption Fields').item.json.hashtags_text }}\nUser feedback to apply: {{ $('User Review: Approve/Reject Caption').item.json.data.Comment }}\nOutput language: {{ $('Configuration').item.json.output_language }}\n\nRevise the caption to address the feedback. Return only the JSON defined in your instructions.",
"options": {
"systemMessage": "You are a social media copywriter revising a caption for a short video ad.\nApply the user feedback precisely, keep it short (2-5 lines), 1-3 emojis, clear call to action, 3 to 8 relevant hashtags.\nReturn only the JSON object defined by the output schema, nothing else."
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 3.1
},
{
"id": "948bd68a-34ff-4f4a-b457-9a95504e1cef",
"name": "Notify Generation Failure",
"type": "n8n-nodes-base.telegram",
"position": [
2368,
224
],
"parameters": {
"text": "\u274c The AtlasCloud video generation failed. Please try again or adjust the video concept.",
"chatId": "={{ $('Receive Product Photo (Telegram Trigger)').item.json.message.chat.id }}",
"additionalFields": {
"appendAttribution": false
}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "ae415c1b-b793-4a46-bac5-4e0d4da9a9cf",
"name": "Revise Video Ad Concept",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
1008,
560
],
"parameters": {
"text": "=Previous video prompt: {{ $('Prepare Video Prompt Fields').item.json.video_prompt }}\nPrevious scene description: {{ $('Prepare Video Prompt Fields').item.json.scene_description }}\nUser feedback to apply: {{ $('User Review: Approve/Reject Video Prompt').item.json.data.Comment }}\nProduct description: {{ $('Analyze Product Image (OpenAI Vision)').item.json.content }}\nCampaign / caption from the user: {{ $('Configuration').item.json.campaign_text }}\n\nRevise the video concept to address the feedback. Return only the JSON defined in your instructions.",
"options": {
"systemMessage": "You are an advertising Video Prompt Designer for a text-to-video AI model (no reference image is passed to the video model, only text).\n\nTreat the product description as factual ground truth: keep color, material and shape consistent with it.\nWrite ONE continuous, one-shot cinematic prompt: describe the setting, camera movement, lighting, and how the product is presented, in plain visual language a video model can follow.\nDo not include any on-screen text, logos or brand names in the video prompt itself.\nApply the user feedback precisely.\nReturn only the JSON object defined by the output schema, nothing else."
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 3.1
},
{
"id": "5b7cc843-4b0a-4a53-a188-76cf2c2ea359",
"name": "Sticky Note 25776014",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2048,
-672
],
"parameters": {
"color": 4,
"width": 900,
"height": 1802,
"content": "# Generate AI video ads from product photos with Seedance 2.0 and publish to social media\n# \ud83d\udce5 [Open full documentation on Notion](https://automatisation.notion.site/Course-Generate-AI-video-ads-from-product-photos-with-Seedance-2-0-and-publish-to-social-media-3a03d6550fd9814a86fdd416333079c3)\n\n## How it works\nSend a product photo (with an optional caption describing the campaign, e.g. \"10.10 sale\") to your Telegram bot. The workflow analyzes the product, drafts a text-to-video ad concept with AI, generates the video with [AtlasCloud](https://www.atlascloud.ai/?ref=8QKPJE) Seedance 2.0, and after your approval on Telegram at every step, publishes the finished ad with [Blotato](https://blotato.com/?ref=firas) to Facebook, Instagram, TikTok and YouTube Shorts.\n\n## Setup\n1. Connect your Telegram bot credential on every Telegram node.\n2. Connect your OpenAI credential (already pre-filled if you use the same account).\n3. Create an \"AtlasCloud API\" header-auth credential (Name: Authorization, Value: Bearer YOUR_KEY) and select it manually on the two AtlasCloud HTTP Request nodes (generic auth credentials cannot be auto-attached).\n4. Enable the Blotato nodes you want to use and pick your connected social accounts on each one.\n5. Adjust every setting in the \"Configuration\" node: models, video duration, aspect ratio, resolution, wait time, output language.\n\n## Requirements\n- n8n self-hosted, or n8n Cloud with Verified Community Nodes enabled (Blotato is a community node)\n- A Telegram bot token (via @BotFather)\n- An OpenAI API key (vision + text generation)\n- An [AtlasCloud](https://www.atlascloud.ai/?ref=8QKPJE) API key for Seedance 2.0 text-to-video (~0.10-0.15 $/second of video)\n- A [Blotato](https://blotato.com/?ref=firas) account with your social media accounts connected\n\n## Customization\n- Swap the Seedance model for another AtlasCloud text-to-video model by changing `atlas_model` in Configuration.\n- Add or remove publish platforms by enabling/disabling the Blotato nodes at the end.\n- Adjust the system prompts on the AI Agent nodes to match your brand voice.\n\nNeed help customizing?\nContact me for consulting and support : [Linkedin](https://www.linkedin.com/in/doctor-firass/)\n\n# MY NEW YOUTUBE CHANNEL\n\ud83d\udc49 [Subscribe to my new YouTube channel](https://www.youtube.com/@DrFiras_AI). Here I'll share videos and Shorts with practical tutorials and FREE templates for n8n.\n\n[](https://www.youtube.com/@DrFiras_AI)"
},
"typeVersion": 1
},
{
"id": "a70c46b2-08b3-4d4c-9f96-64a006f82f21",
"name": "Sticky Note ee04aa4a",
"type": "n8n-nodes-base.stickyNote",
"position": [
-688,
-48
],
"parameters": {
"color": 7,
"width": 600,
"height": 200,
"content": "## 1. Product Photo & Configuration\nReceive the product photo from Telegram and centralize every adjustable setting in Configuration."
},
"typeVersion": 1
},
{
"id": "e3bbf6f7-3ab2-44d7-be86-13d22b97ff3a",
"name": "Sticky Note 31e0050b",
"type": "n8n-nodes-base.stickyNote",
"position": [
96,
-48
],
"parameters": {
"color": 7,
"width": 780,
"height": 300,
"content": "## 2. Video Ad Concept (AI + your approval)\nAI drafts a text-to-video prompt from the product analysis. You approve or ask for a revision on Telegram before any video is generated."
},
"typeVersion": 1
},
{
"id": "dc33bc4c-af3a-46db-b48e-0d0d5ed2fbb5",
"name": "Sticky Note 4289a1f3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1056,
-48
],
"parameters": {
"color": 7,
"width": 1300,
"height": 260,
"content": "## 3. Video Generation (AtlasCloud Seedance 2.0)\nSubmits the approved prompt to AtlasCloud, then polls until the video is ready or fails."
},
"typeVersion": 1
},
{
"id": "d8917e7c-55d2-4c2f-93b6-df4eaca6554b",
"name": "Sticky Note d46d87c0",
"type": "n8n-nodes-base.stickyNote",
"position": [
2384,
-176
],
"parameters": {
"color": 7,
"width": 620,
"height": 260,
"content": "## 4. Video Review\nThe generated video is sent back to Telegram for your final approval before writing the caption."
},
"typeVersion": 1
},
{
"id": "4df17ccc-32e0-4a05-8025-224c1775efd9",
"name": "Sticky Note d91b767f",
"type": "n8n-nodes-base.stickyNote",
"position": [
2976,
-96
],
"parameters": {
"color": 7,
"width": 900,
"height": 300,
"content": "## 5. Caption Generation & Review\nAI writes a social caption + hashtags, which you approve or revise on Telegram."
},
"typeVersion": 1
},
{
"id": "e26b4edf-0bfa-4830-88da-a5567a2d148d",
"name": "Sticky Note 14c32ee2",
"type": "n8n-nodes-base.stickyNote",
"position": [
4400,
-336
],
"parameters": {
"color": 7,
"width": 300,
"height": 620,
"content": "## 6. Publish (Blotato)\nOne node per platform, disabled by default. Enable the ones you use and pick your connected account."
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"binaryMode": "separate",
"availableInMCP": true,
"executionOrder": "v1"
},
"versionId": "38525a18-e046-432a-a7fb-534d0ffd8a6d",
"nodeGroups": [],
"connections": {
"Configuration": {
"main": [
[
{
"node": "Get Telegram File Path",
"type": "main",
"index": 0
}
]
]
},
"AI Model (GPT)": {
"ai_languageModel": [
[
{
"node": "Generate Video Ad Concept",
"type": "ai_languageModel",
"index": 0
},
{
"node": "Video Concept Output Parser",
"type": "ai_languageModel",
"index": 0
},
{
"node": "Revise Video Ad Concept",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Revise Caption": {
"main": [
[
{
"node": "Prepare Caption Fields",
"type": "main",
"index": 0
}
]
]
},
"AI Model (Caption)": {
"ai_languageModel": [
[
{
"node": "Generate Social Media Caption",
"type": "ai_languageModel",
"index": 0
},
{
"node": "Caption Output Parser",
"type": "ai_languageModel",
"index": 0
},
{
"node": "Revise Caption",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Caption Output Parser": {
"ai_outputParser": [
[
{
"node": "Generate Social Media Caption",
"type": "ai_outputParser",
"index": 0
},
{
"node": "Revise Caption",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Route by Video Status": {
"main": [
[
{
"node": "Send Generated Video to Telegram",
"type": "main",
"index": 0
}
],
[
{
"node": "Notify Generation Failure",
"type": "main",
"index": 0
}
]
]
},
"Get Telegram File Path": {
"main": [
[
{
"node": "Analyze Product Image (OpenAI Vision)",
"type": "main",
"index": 0
}
]
]
},
"Prepare Caption Fields": {
"main": [
[
{
"node": "User Review: Approve/Reject Caption",
"type": "main",
"index": 0
}
]
]
},
"Revise Video Ad Concept": {
"main": [
[
{
"node": "Prepare Video Prompt Fields",
"type": "main",
"index": 0
}
]
]
},
"Generate Video Ad Concept": {
"main": [
[
{
"node": "Prepare Video Prompt Fields",
"type": "main",
"index": 0
}
]
]
},
"Prepare Video Prompt Fields": {
"main": [
[
{
"node": "User Review: Approve/Reject Video Prompt",
"type": "main",
"index": 0
}
]
]
},
"Publish to TikTok (Blotato)": {
"main": [
[
{
"node": "Publish to YouTube Shorts (Blotato)",
"type": "main",
"index": 0
}
]
]
},
"Video Concept Output Parser": {
"ai_outputParser": [
[
{
"node": "Generate Video Ad Concept",
"type": "ai_outputParser",
"index": 0
},
{
"node": "Revise Video Ad Concept",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Wait Before Checking Status": {
"main": [
[
{
"node": "Check Video Status (AtlasCloud)",
"type": "main",
"index": 0
}
]
]
},
"Check Video Approval (Yes/No)": {
"main": [
[
{
"node": "Generate Social Media Caption",
"type": "main",
"index": 0
}
],
[
{
"node": "Prepare AtlasCloud Request Fields",
"type": "main",
"index": 0
}
]
]
},
"Generate Social Media Caption": {
"main": [
[
{
"node": "Prepare Caption Fields",
"type": "main",
"index": 0
}
]
]
},
"Publish to Facebook (Blotato)": {
"main": [
[
{
"node": "Publish to Instagram (Blotato)",
"type": "main",
"index": 0
}
]
]
},
"Check Prompt Approval (Yes/No)": {
"main": [
[
{
"node": "Prepare AtlasCloud Request Fields",
"type": "main",
"index": 0
}
],
[
{
"node": "Revise Video Ad Concept",
"type": "main",
"index": 0
}
]
]
},
"Publish to Instagram (Blotato)": {
"main": [
[
{
"node": "Publish to TikTok (Blotato)",
"type": "main",
"index": 0
}
]
]
},
"Check Caption Approval (Yes/No)": {
"main": [
[
{
"node": "Publish to Facebook (Blotato)",
"type": "main",
"index": 0
}
],
[
{
"node": "Revise Caption",
"type": "main",
"index": 0
}
]
]
},
"Check Video Status (AtlasCloud)": {
"main": [
[
{
"node": "Route by Video Status",
"type": "main",
"index": 0
}
]
]
},
"Send Generated Video to Telegram": {
"main": [
[
{
"node": "User Review: Approve/Reject Generated Video",
"type": "main",
"index": 0
}
]
]
},
"Prepare AtlasCloud Request Fields": {
"main": [
[
{
"node": "Submit Video Generation (AtlasCloud)",
"type": "main",
"index": 0
}
]
]
},
"User Review: Approve/Reject Caption": {
"main": [
[
{
"node": "Check Caption Approval (Yes/No)",
"type": "main",
"index": 0
}
]
]
},
"Submit Video Generation (AtlasCloud)": {
"main": [
[
{
"node": "Wait Before Checking Status",
"type": "main",
"index": 0
}
]
]
},
"Analyze Product Image (OpenAI Vision)": {
"main": [
[
{
"node": "Generate Video Ad Concept",
"type": "main",
"index": 0
}
]
]
},
"Receive Product Photo (Telegram Trigger)": {
"main": [
[
{
"node": "Configuration",
"type": "main",
"index": 0
}
]
]
},
"User Review: Approve/Reject Video Prompt": {
"main": [
[
{
"node": "Check Prompt Approval (Yes/No)",
"type": "main",
"index": 0
}
]
]
},
"User Review: Approve/Reject Generated Video": {
"main": [
[
{
"node": "Check Video Approval (Yes/No)",
"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.
openAiApitelegramApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow turns a product photo sent via Telegram into an AI-generated short video ad using OpenAI for image analysis and concept/caption writing, AtlasCloud Seedance 2.0 for text-to-video generation, and Blotato to publish the approved video to Facebook, Instagram, TikTok,…
Source: https://n8n.io/workflows/17838/ — 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.
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.
RAG CHATBOT Main. Uses telegram, telegramTrigger, lmChatOpenAi, n8n-nodes-mcp. Event-driven trigger; 87 nodes.
Digital marketers, content creators, social media managers, and businesses who want to use AI marketing automation for YouTube Shorts without spending hours on production. This AI workflow helps anyon
Transform your salon/service business with this streamlined Telegram automation system featuring Claude integration, zero-setup database management, and intelligent conversation handling. Claude MCP I
Inbox Guardian. Uses gmailTrigger, lmChatOpenAi, agent, textClassifier. Event-driven trigger; 66 nodes.