{
  "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[![The AI Doctor](https://www.dr-firas.com/the-ai-doctor.png)](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
          }
        ]
      ]
    }
  }
}