This workflow corresponds to n8n.io template #10514 — we link there as the canonical source.
This workflow follows the Blotaton8N Nodes Blotato → HTTP Request recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "do5lGSCHCPT5YhMr",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "\ud83d\udca5 Generate UGC Promo Videos with Blotato and Sora 2 for eCommerce vi",
"tags": [],
"nodes": [
{
"id": "9e45bc31-7369-48b0-8d37-93cf2faa5418",
"name": "Telegram Trigger",
"type": "n8n-nodes-base.telegramTrigger",
"position": [
-25824,
2112
],
"parameters": {
"updates": [
"message"
],
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "d118bd83-021e-470c-b6e2-f45fdced945b",
"name": "Workflow Configuration",
"type": "n8n-nodes-base.set",
"position": [
-25504,
2112
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "id-4",
"name": "maxPollingAttempts",
"type": "number",
"value": 20
},
{
"id": "id-5",
"name": "falApiKey",
"type": "string",
"value": "YOUR_API_falApiKey"
},
{
"id": "8b717e51-3c27-4787-b358-019f1438ea6c",
"name": "Model",
"type": "string",
"value": "sora-2"
},
{
"id": "c48eceea-cfec-4a6f-a379-127a3af40ad2",
"name": "aspect_ratio",
"type": "string",
"value": "9:16"
},
{
"id": "385e9561-7491-4df9-8f92-10b1a70180a8",
"name": "duration",
"type": "string",
"value": "12"
}
]
},
"includeOtherFields": true
},
"typeVersion": 3.4
},
{
"id": "f6b90f3d-c3a2-4ac4-94ec-dbcad40cc333",
"name": "Parse Script Response",
"type": "n8n-nodes-base.code",
"position": [
-24256,
2112
],
"parameters": {
"jsCode": "const response = $input.first().json;\nconst chatId = $('Extract Photo and text').first().json?.message?.chat?.id;\n\nif (!chatId) {\n throw new Error('Chat ID not found in workflow data');\n}\n\n// OpenAI node with JSON output returns parsed object directly in message.content\nconst scriptContent = response?.message?.content || response?.content || {};\n\nreturn [{\n json: {\n script: JSON.stringify(scriptContent),\n frames: scriptContent.frames || [],\n hashtags: scriptContent.hashtags || [],\n chatId: chatId\n }\n}];"
},
"typeVersion": 2
},
{
"id": "5ab4832e-f0f0-48c6-961e-066ef12b23a9",
"name": "Submit to Sora 2 API",
"type": "n8n-nodes-base.httpRequest",
"position": [
-25824,
2416
],
"parameters": {
"url": "https://queue.fal.run/fal-ai/sora-2/image-to-video",
"method": "POST",
"options": {},
"jsonBody": "={\n \"prompt\": \"{{ JSON.stringify($('Parse Script Response').first().json.script.replaceAll(/\\\\n/g, '')).slice(1, -1) }}\",\n \"resolution\": \"auto\",\n \"aspect_ratio\": \"9:16\",\n \"duration\": {{ $('Workflow Configuration').item.json.duration }},\n \"image_url\": \"{{ $json.data.url.replace(/^http:\\/\\/tmpfiles\\.org\\/(\\d+)\\/(.*)$/i, 'https://tmpfiles.org/dl/$1/$2') }}\"\n}\n",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "={{ 'Key ' + $('Workflow Configuration').first().json.falApiKey }}"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "14948abc-ed10-44d4-92c8-02ccc2c6c207",
"name": "Extract Video Job ID",
"type": "n8n-nodes-base.code",
"position": [
-25600,
2416
],
"parameters": {
"jsCode": "const response = $input.first().json;\nconst chatId = $('Extract Photo and text').first().json?.message?.chat?.id;\n\nif (!response?.request_id) {\n throw new Error('Request ID not found in API response');\n}\n\nif (!chatId) {\n throw new Error('Chat ID not found in workflow data');\n}\n\nreturn [{\n json: {\n requestId: response.request_id,\n chatId: chatId,\n pollingAttempt: 0\n }\n}];"
},
"typeVersion": 2
},
{
"id": "1522a6fd-be95-4fe2-910f-57e60e19ac64",
"name": "Wait 15 Seconds",
"type": "n8n-nodes-base.wait",
"position": [
-25376,
2416
],
"parameters": {
"amount": 1
},
"typeVersion": 1.1
},
{
"id": "4f83db5c-7a5a-4fc9-9a5a-a1239caa6c57",
"name": "Check Video Status",
"type": "n8n-nodes-base.httpRequest",
"position": [
-25152,
2416
],
"parameters": {
"url": "=https://queue.fal.run/fal-ai/sora-2/requests/{{ $json.requestId }}/status",
"options": {},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "={{ 'Key ' + $('Workflow Configuration').first().json.falApiKey }}"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "ad3a9068-d0f2-4982-8093-bf8d4c332409",
"name": "Parse Status Response",
"type": "n8n-nodes-base.code",
"position": [
-24928,
2416
],
"parameters": {
"jsCode": "const response = $input.first().json;\nconst previousData = $('Extract Video Job ID').first().json;\n\nif (!previousData) {\n throw new Error('Previous polling data not found');\n}\n\nreturn [{\n json: {\n status: response?.status || 'UNKNOWN',\n videoUrl: response?.video?.url || null,\n requestId: previousData.requestId,\n chatId: previousData.chatId,\n pollingAttempt: (previousData.pollingAttempt || 0) + 1\n }\n}];"
},
"typeVersion": 2
},
{
"id": "d684fc56-82ab-4c97-b53f-4068526a9f6d",
"name": "Check If Complete",
"type": "n8n-nodes-base.if",
"position": [
-24256,
2416
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "or",
"conditions": [
{
"id": "id-1",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $('Parse Status Response').item.json.status }}",
"rightValue": "COMPLETED"
},
{
"id": "id-2",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $('Parse Status Response').item.json.status }}",
"rightValue": "succeeded"
},
{
"id": "id-3",
"operator": {
"type": "number",
"operation": "gte"
},
"leftValue": "={{ $('Parse Status Response').item.json.pollingAttempt }}",
"rightValue": "={{ $('Workflow Configuration').first().json.maxPollingAttempts }}"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "631abf93-a412-4769-9161-941e666fb3bb",
"name": "Download Video File",
"type": "n8n-nodes-base.httpRequest",
"position": [
-23808,
2400
],
"parameters": {
"url": "=https://queue.fal.run/fal-ai/sora-2/requests/{{ $json.requestId }}",
"options": {},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "={{ 'Key ' + $('Workflow Configuration').first().json.falApiKey }}"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "9c4e387d-d47b-44b2-9fd4-2b08cf029a43",
"name": "Send Video to Telegram",
"type": "n8n-nodes-base.telegram",
"position": [
-25296,
2864
],
"parameters": {
"file": "={{ $json.video.url }}",
"chatId": "={{ $('Telegram Trigger').first().json.message.chat.id }}",
"operation": "sendVideo",
"additionalFields": {
"caption": "=Your UGC video is ready! \ud83c\udfa5 {{ $json.video.url }}"
}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "2dad18e3-3b7a-47f6-b948-4c327fa60c1d",
"name": "Send Error Message",
"type": "n8n-nodes-base.telegram",
"position": [
-24016,
2432
],
"parameters": {
"text": "Video generation timed out or failed. Please try again with a different product image or description.",
"chatId": "={{ $('Telegram Trigger').item.json.message.chat.id }}",
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "dcfa0e97-1b56-48a4-aacc-bf0f7dfb1257",
"name": "Analyze Product Image (Vision API)",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
-24832,
2112
],
"parameters": {
"text": "=Analyze this product image and extract: 1) Product name and category, 2) Key features and benefits, 3) Target audience, 4) Visual elements (colors, style, packaging). Promotion objective: {{ $('Extract Photo and text').item.json.promotionText }}",
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini",
"cachedResultName": "GPT-4O-MINI"
},
"options": {},
"resource": "image",
"inputType": "base64",
"operation": "analyze"
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.8
},
{
"id": "918f735a-2b6a-4515-8c6f-61778196300f",
"name": "Get Photo File from Telegram",
"type": "n8n-nodes-base.telegram",
"position": [
-25056,
2112
],
"parameters": {
"fileId": "={{ $json.photoUrl }}",
"resource": "file",
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "9cae8d6a-31a4-462d-8482-93ac5b591125",
"name": "Extract Photo and text",
"type": "n8n-nodes-base.set",
"position": [
-25280,
2112
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "id-1",
"name": "photoUrl",
"type": "string",
"value": "={{ $json.message.photo ? $json.message.photo[$json.message.photo.length - 1].file_id : '' }}"
},
{
"id": "id-2",
"name": "promotionText",
"type": "string",
"value": "={{ $json.message.caption || $json.message.text }}"
}
]
},
"includeOtherFields": true
},
"typeVersion": 3.4
},
{
"id": "ea8c58ec-28d1-47ac-b891-5f520a197d47",
"name": "Generate UGC Script (OpenAI)",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
-24608,
2112
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "id",
"value": "gpt-4o-mini"
},
"options": {
"temperature": 0.8
},
"messages": {
"values": [
{
"role": "system",
"content": "You are a UGC video script writer. Create a 12-second video script with frame-by-frame breakdown, natural dialogue, camera movements, and captions. Format as JSON with fields: frames (array of {timestamp, scene, dialogue, camera, caption}), hashtags (array)."
},
{
"content": "={{ 'Product Analysis: ' + $json.content + '\\n\\nPromotion Objective: ' + $('Extract Photo and text').first().json.promotionText + '\\n\\nCreate a compelling 12-second UGC video script.' }}"
}
]
},
"jsonOutput": true
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.8
},
{
"id": "cf8da3a8-e430-42b9-bcbe-d771ff736a85",
"name": "Build Public Image URL",
"type": "n8n-nodes-base.httpRequest",
"position": [
-24832,
1952
],
"parameters": {
"url": "https://tmpfiles.org/api/v1/upload",
"method": "POST",
"options": {
"response": {
"response": {
"responseFormat": "json"
}
}
},
"sendBody": true,
"contentType": "multipart-form-data",
"bodyParameters": {
"parameters": [
{
"name": "file",
"parameterType": "formBinaryData",
"inputDataFieldName": "data"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "e8db0d52-21e4-47a1-bf83-2b90fadeeddd",
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
-23824,
2096
],
"parameters": {},
"typeVersion": 3.2
},
{
"id": "34552393-86ff-4988-b40a-dae3c0d0d34b",
"name": "Step 5 - Publishing",
"type": "n8n-nodes-base.stickyNote",
"position": [
-25904,
2672
],
"parameters": {
"color": 5,
"width": 2220,
"height": 404,
"content": "# \ud83d\udce4 STEP 5: PUBLISHING & TRACKING\n\n### Install the Blotato [Blotato](https://blotato.com/?ref=firas) Node in n8n (Community Nodes)\n1. In n8n, open **Settings \u2192 Community Nodes**. \n2. Click **Install**, then add: `@blotato/n8n-nodes-blotato`. \n3. Log in to **Blotato**. \n4. Go to **Settings \u2192 API Keys**. \n5. In n8n \u2192 **Credentials \u2192 New**. \n6. Choose **Blotato API** \n(provided by the community node you installed). \n\n2. TikTok Publishing (Blotato):\n \u2022 Pre-configured to auto-publish\n \u2022 Uses caption from GPT-4\n \u2022 Privacy: Public\n \u2022 Requires Blotato API key from Step 2"
},
"typeVersion": 1
},
{
"id": "cb7916cc-10d4-435d-a893-6d6a613811b5",
"name": "Upload Video to BLOTATO",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
-24720,
2864
],
"parameters": {
"mediaUrl": "={{ $('Download Video File').item.json.video.url }}",
"resource": "media"
},
"credentials": {
"blotatoApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "8fa12c0b-cceb-4ef0-80d4-533435d017f1",
"name": "Youtube",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
-24192,
2864
],
"parameters": {
"options": {},
"platform": "youtube",
"accountId": {
"__rl": true,
"mode": "list",
"value": "8047",
"cachedResultUrl": "https://backend.blotato.com/v2/accounts/8047",
"cachedResultName": "DR FIRASS (Dr. Firas)"
},
"postContentText": "={{ $('Generate Caption with GPT-4').item.json.message.content }}",
"postContentMediaUrls": "={{ $json.url }}",
"postCreateYoutubeOptionTitle": "={{ $('Generate UGC Script (OpenAI)').first().json.message.content.hashtags[0] }}",
"postCreateYoutubeOptionPrivacyStatus": "private",
"postCreateYoutubeOptionShouldNotifySubscribers": false
},
"credentials": {
"blotatoApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "c85dd58e-e7c3-49fe-bc5b-56db1931ce02",
"name": "Tiktok",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
-24512,
2704
],
"parameters": {
"options": {},
"platform": "tiktok",
"accountId": {
"__rl": true,
"mode": "list",
"value": "2079",
"cachedResultUrl": "https://backend.blotato.com/v2/accounts/2079",
"cachedResultName": "elitecybzcs"
},
"postContentText": "={{ $('Generate Caption with GPT-4').item.json.message.content }}",
"postContentMediaUrls": "={{ $json.url }}"
},
"credentials": {
"blotatoApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "7862107b-f886-4d41-8f2e-0523f7a8f2ce",
"name": "Linkedin",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
-24352,
2704
],
"parameters": {
"options": {},
"platform": "linkedin",
"accountId": {
"__rl": true,
"mode": "list",
"value": "1446",
"cachedResultUrl": "https://backend.blotato.com/v2/accounts/1446",
"cachedResultName": "Samuel Amalric"
},
"postContentText": "={{ $('Generate Caption with GPT-4').item.json.message.content }}",
"postContentMediaUrls": "={{ $json.url }}"
},
"credentials": {
"blotatoApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "6cd5c506-f060-4d32-8425-383ff2b030b7",
"name": "Facebook",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
-24192,
2704
],
"parameters": {
"options": {},
"platform": "facebook",
"accountId": {
"__rl": true,
"mode": "list",
"value": "1759",
"cachedResultUrl": "https://backend.blotato.com/v2/accounts/1759",
"cachedResultName": "Firass Ben"
},
"facebookPageId": {
"__rl": true,
"mode": "list",
"value": "101603614680195",
"cachedResultUrl": "https://backend.blotato.com/v2/accounts/1759/subaccounts/101603614680195",
"cachedResultName": "Dr. Firas"
},
"postContentText": "={{ $('Generate Caption with GPT-4').item.json.message.content }}",
"postContentMediaUrls": "={{ $json.url }}"
},
"credentials": {
"blotatoApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "6560abd1-2f85-492b-bd6c-22b80dff52d1",
"name": "Instagram",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
-24512,
2864
],
"parameters": {
"options": {},
"accountId": {
"__rl": true,
"mode": "list",
"value": "1687",
"cachedResultUrl": "https://backend.blotato.com/v2/accounts/1687",
"cachedResultName": "acces.a.vie"
},
"postContentText": "={{ $('Generate Caption with GPT-4').item.json.message.content }}",
"postContentMediaUrls": "={{ $json.url }}"
},
"credentials": {
"blotatoApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "9d7bce3c-c612-4f2d-aee0-04cd913a95b0",
"name": "Twitter (X)",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
-24352,
2864
],
"parameters": {
"options": {},
"platform": "twitter",
"accountId": {
"__rl": true,
"mode": "list",
"value": "1289",
"cachedResultUrl": "https://backend.blotato.com/v2/accounts/1289",
"cachedResultName": "Docteur_Firas"
},
"postContentText": "={{ $('Generate Caption with GPT-4').item.json.message.content }}",
"postContentMediaUrls": "={{ $json.url }}"
},
"credentials": {
"blotatoApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "7b249aeb-b539-45d2-ba07-c6b41de4f491",
"name": "Merge1",
"type": "n8n-nodes-base.merge",
"position": [
-23984,
2720
],
"parameters": {
"mode": "chooseBranch",
"numberInputs": 6
},
"typeVersion": 3.2
},
{
"id": "4ae0f34b-7d81-426c-9b8f-4a01ad24409a",
"name": "Send a text message",
"type": "n8n-nodes-base.telegram",
"position": [
-23824,
2784
],
"parameters": {
"text": "Published",
"chatId": "={{ $('Telegram Trigger').first().json.message.chat.id }}",
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "41eb8c26-670d-4940-9bc9-ba90613e74c2",
"name": "Generate Caption with GPT-4",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
-25072,
2864
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "id",
"value": "gpt-4o-mini"
},
"options": {},
"messages": {
"values": [
{
"content": "=Create an engaging TikTok caption for a video about: {{ $('Telegram Trigger').first().json.message.caption }}\n\nBased on these trends: {{ $('Generate UGC Script (OpenAI)').first().json.message.content.hashtags[0] }}{{ $('Generate UGC Script (OpenAI)').first().json.message.content.hashtags[1] }}{{ $('Generate UGC Script (OpenAI)').first().json.message.content.hashtags[2] }}\n\nRequirements:\n- Catchy hook in first line\n- Include 5-8 relevant trending hashtags\n- Keep it concise and engaging\n- Optimize for TikTok algorithm\n- Return ONLY the caption text with hashtags, nothing else"
}
]
}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.8
},
{
"id": "ac940182-725e-4875-be7a-45f874be7f7b",
"name": "Step 1 - Telegram Setup",
"type": "n8n-nodes-base.stickyNote",
"position": [
-25408,
1120
],
"parameters": {
"color": 3,
"width": 420,
"height": 820,
"content": "# \ud83d\udcf1 STEP 1: TELEGRAM BOT SETUP\n\n## \ud83d\udcc4 **Documentation**: [Notion Guide](https://automatisation.notion.site/Generate-UGC-Promo-Videos-with-Blotato-and-Sora-2-for-eCommerce-2a23d6550fd980898426fe195192da6d?source=copy_link)\n\n## Create Your Telegram Bot:\n1. Open Telegram and search for @BotFather\n2. Send /newbot command\n3. Choose a name for your bot (e.g., \"UGC Video Generator\")\n4. Choose a username (must end with 'bot', e.g., \"myugc_video_bot\")\n5. Copy the API token provided\n\n## Configure Telegram Trigger Node:\n1. Click on \"Telegram Trigger\" node\n2. Create new credential\n3. Paste your bot token\n4. Save credential\n\n## Configure Telegram Nodes:\nThe following nodes need the same credential:\n\u2022 Get Photo File from Telegram\n\u2022 Send Video to Telegram\n\u2022 Send Error Message\n\n## Test Your Bot:\n1. Activate this workflow\n2. Find your bot in Telegram\n3. Send /start to begin\n4. Send a product image with caption"
},
"typeVersion": 1
},
{
"id": "41d17c01-3d6b-4390-a3e0-ddbe5e1e011c",
"name": "Step 2 - Configuration",
"type": "n8n-nodes-base.stickyNote",
"position": [
-24976,
1120
],
"parameters": {
"color": 6,
"width": 420,
"height": 820,
"content": "# \u2699\ufe0f STEP 2: API KEYS CONFIGURATION\n\n## Workflow Configuration Node:\nThis node stores all API keys and settings.\n\n### 1. FAL.ai API Key:\n\u2022 Go to https://fal.ai/\n\u2022 Sign up / Log in\n\u2022 Navigate to Dashboard \u2192 API Keys\n\u2022 Create new API key\n\u2022 Copy and paste in 'falApiKey' field\n\n### 2. OpenAI API Key:\n\u2022 Already configured with n8n free credits\n\u2022 Or use your own: https://platform.openai.com/api-keys\n\n### 3. Video Settings (Pre-configured):\n\u2022 maxPollingAttempts: 20 (max wait cycles)\n\u2022 Model: sora-2\n\u2022 aspect_ratio: 9:16 (vertical video)\n\u2022 duration: 12 (seconds)\n\n\ud83d\udca1 You can adjust these values based on your needs:\n- Change duration: 5, 10, or 12 seconds\n- Change aspect_ratio: 16:9, 9:16, or 1:1"
},
"typeVersion": 1
},
{
"id": "334f22f1-d976-4c69-9d08-803a94e395eb",
"name": "Step 3 - AI Analysis",
"type": "n8n-nodes-base.stickyNote",
"position": [
-24544,
1120
],
"parameters": {
"color": 5,
"width": 420,
"height": 820,
"content": "# \ud83e\udd16 STEP 3: AI ANALYSIS & SCRIPT GENERATION\n\n## How It Works:\n\n### Extract Photo and Text:\n\u2022 Extracts the highest quality photo from Telegram\n\u2022 Captures your promotion text/caption\n\n### Get Photo File from Telegram:\n\u2022 Downloads the actual image file\n\u2022 Prepares it for AI analysis\n\n### Build Public Image URL:\n\u2022 Uploads image to tmpfiles.org\n\u2022 Creates publicly accessible URL\n\u2022 Required for Sora 2 API\n\n### Analyze Product Image (Vision API):\n\u2022 Uses GPT-4o-mini with vision\n\u2022 Analyzes: product features, target audience, visual style\n\u2022 Extracts key selling points\n\n### Generate UGC Script (OpenAI):\n\u2022 Creates 12-second video script\n\u2022 Frame-by-frame breakdown\n\u2022 Natural dialogue and camera movements\n\u2022 Generates trending hashtags\n\u2022 Output: JSON format with frames array\n\n\u2705 No configuration needed - already set up!"
},
"typeVersion": 1
},
{
"id": "76c4ca21-2f00-4ecc-ac7b-1fbb05f2b8df",
"name": "Step 4 - Video Generation",
"type": "n8n-nodes-base.stickyNote",
"position": [
-24112,
1120
],
"parameters": {
"color": 7,
"width": 420,
"height": 820,
"content": "# \ud83c\udfa5 STEP 4: VIDEO GENERATION WITH SORA 2\n\n## Process Flow:\n\n### 1. Submit to Sora 2 API:\n\u2022 Sends image URL + script to FAL.ai\n\u2022 Uses Sora 2 image-to-video model\n\u2022 Returns job request_id\n\n### 2. Polling Loop (Wait \u2192 Check \u2192 Parse):\n\u2022 Waits 15 seconds between checks\n\u2022 Checks video generation status\n\u2022 Continues until complete or timeout\n\u2022 Max attempts: 20 (configurable)\n\n### 3. Check If Complete:\nRoutes based on status:\n\u2022 \u2705 COMPLETED/succeeded \u2192 Download video\n\u2022 \u23f3 IN_PROGRESS \u2192 Continue polling\n\u2022 \u274c Timeout \u2192 Send error message\n\n### 4. Download Video File:\n\u2022 Retrieves final video from FAL.ai\n\u2022 Prepares for Telegram delivery\n\n### 5. Send Video to Telegram:\n\u2022 Delivers video to your chat\n\u2022 Includes video URL in caption"
},
"typeVersion": 1
},
{
"id": "3cab5acb-c563-4dd6-bea5-8e379eb184d3",
"name": "Workflow Overview",
"type": "n8n-nodes-base.stickyNote",
"position": [
-25904,
1120
],
"parameters": {
"color": 4,
"width": 480,
"height": 816,
"content": "# \ud83c\udfac AUTOMATED UGC VIDEO GENERATOR\n\n### \ud83c\udfa5 Watch This Tutorial\n\n@[youtube](SZMWXW8Vk8E)\n\n## \ud83d\udccb What This Workflow Does:\nTransforms product images into professional UGC marketing videos automatically:\n\n1\ufe0f\u20e3 Receives product image + description via Telegram\n2\ufe0f\u20e3 AI analyzes product features and target audience\n3\ufe0f\u20e3 Generates engaging 12-second video script\n4\ufe0f\u20e3 Creates video using Sora 2 AI (image-to-video)\n5\ufe0f\u20e3 Delivers final video back to Telegram\n\n## \ud83d\udcec Need Help or Want to Customize This?\n**Contact me for consulting and support:** [LinkedIn](https://www.linkedin.com/in/dr-firas/) / [YouTube](https://www.youtube.com/@DRFIRASS) / [\ud83d\ude80 Mes Ateliers n8n ](https://hotm.art/formation-n8n)"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "5bc27066-9611-429d-b92c-0322e7781b5d",
"connections": {
"Merge": {
"main": [
[
{
"node": "Submit to Sora 2 API",
"type": "main",
"index": 0
}
]
]
},
"Merge1": {
"main": [
[
{
"node": "Send a text message",
"type": "main",
"index": 0
}
]
]
},
"Tiktok": {
"main": [
[
{
"node": "Merge1",
"type": "main",
"index": 0
}
]
]
},
"Youtube": {
"main": [
[
{
"node": "Merge1",
"type": "main",
"index": 5
}
]
]
},
"Facebook": {
"main": [
[
{
"node": "Merge1",
"type": "main",
"index": 2
}
]
]
},
"Linkedin": {
"main": [
[
{
"node": "Merge1",
"type": "main",
"index": 1
}
]
]
},
"Instagram": {
"main": [
[
{
"node": "Merge1",
"type": "main",
"index": 3
}
]
]
},
"Twitter (X)": {
"main": [
[
{
"node": "Merge1",
"type": "main",
"index": 4
}
]
]
},
"Wait 15 Seconds": {
"main": [
[
{
"node": "Check Video Status",
"type": "main",
"index": 0
}
]
]
},
"Telegram Trigger": {
"main": [
[
{
"node": "Workflow Configuration",
"type": "main",
"index": 0
}
]
]
},
"Check If Complete": {
"main": [
[
{
"node": "Download Video File",
"type": "main",
"index": 0
}
],
[
{
"node": "Wait 15 Seconds",
"type": "main",
"index": 0
},
{
"node": "Send Error Message",
"type": "main",
"index": 0
}
]
]
},
"Check Video Status": {
"main": [
[
{
"node": "Parse Status Response",
"type": "main",
"index": 0
}
]
]
},
"Download Video File": {
"main": [
[
{
"node": "Send Video to Telegram",
"type": "main",
"index": 0
}
]
]
},
"Extract Video Job ID": {
"main": [
[
{
"node": "Wait 15 Seconds",
"type": "main",
"index": 0
}
]
]
},
"Submit to Sora 2 API": {
"main": [
[
{
"node": "Extract Video Job ID",
"type": "main",
"index": 0
}
]
]
},
"Parse Script Response": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"Parse Status Response": {
"main": [
[
{
"node": "Check If Complete",
"type": "main",
"index": 0
}
]
]
},
"Build Public Image URL": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"Extract Photo and text": {
"main": [
[
{
"node": "Get Photo File from Telegram",
"type": "main",
"index": 0
}
]
]
},
"Send Video to Telegram": {
"main": [
[
{
"node": "Generate Caption with GPT-4",
"type": "main",
"index": 0
}
]
]
},
"Workflow Configuration": {
"main": [
[
{
"node": "Extract Photo and text",
"type": "main",
"index": 0
}
]
]
},
"Upload Video to BLOTATO": {
"main": [
[
{
"node": "Tiktok",
"type": "main",
"index": 0
},
{
"node": "Linkedin",
"type": "main",
"index": 0
},
{
"node": "Facebook",
"type": "main",
"index": 0
},
{
"node": "Instagram",
"type": "main",
"index": 0
},
{
"node": "Twitter (X)",
"type": "main",
"index": 0
},
{
"node": "Youtube",
"type": "main",
"index": 0
}
]
]
},
"Generate Caption with GPT-4": {
"main": [
[
{
"node": "Upload Video to BLOTATO",
"type": "main",
"index": 0
}
]
]
},
"Generate UGC Script (OpenAI)": {
"main": [
[
{
"node": "Parse Script Response",
"type": "main",
"index": 0
}
]
]
},
"Get Photo File from Telegram": {
"main": [
[
{
"node": "Analyze Product Image (Vision API)",
"type": "main",
"index": 0
},
{
"node": "Build Public Image URL",
"type": "main",
"index": 0
}
]
]
},
"Analyze Product Image (Vision API)": {
"main": [
[
{
"node": "Generate UGC Script (OpenAI)",
"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.
blotatoApiopenAiApitelegramApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow is perfect for eCommerce brands, content creators, and marketing teams who want to automatically generate short, eye-catching videos from their product images — without editing software or manual work.
Source: https://n8n.io/workflows/10514/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This workflow is designed for content creators, agencies, influencers, and automation builders who want to transform viral videos into personalized avatar-based edits — and automatically publish them
💥 Automate YouTube thumbnail creation from video links -vide. Uses telegramTrigger, httpRequest, googleDrive, gmail. Event-driven trigger; 25 nodes.
💥 Automate YouTube thumbnail creation from video links -vide. Uses telegramTrigger, httpRequest, googleDrive, gmail. Event-driven trigger; 25 nodes.
This workflow is designed for YouTube creators, content marketers, automation builders, and agencies who want to repurpose existing YouTube videos into new original content and automate the publishing
Ask questions like “How much did I spend on food last month?” and get instant answers from your financial data — directly in Telegram.