This workflow corresponds to n8n.io template #12128 — we link there as the canonical source.
This workflow follows the Agent → Google Sheets 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 →
{
"nodes": [
{
"id": "a4e22ec8-63ff-4640-bd25-c218e76ed5c1",
"name": "Telegram Message",
"type": "n8n-nodes-base.telegramTrigger",
"position": [
-1840,
1264
],
"parameters": {
"updates": [
"message"
],
"additionalFields": {}
},
"typeVersion": 1.2
},
{
"id": "75992abb-0176-4f34-ad2a-ed9db19d26f6",
"name": "Draft Video Prompt",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-1632,
1264
],
"parameters": {
"text": "=ROLE\nHidden Gateway Video Prompt Agent\n\nGOAL\nReturn ONE human-centric, cinematic 8-second video prompt. Output ONLY the prompt text. No JSON. No headings.\n\nINPUT\nUser Message: {{ $json.message.text }}\n\nCONTEXT\nBrand: Hidden Gateway creates transformative journeys through Lucia Light meditations, sound baths, and healing retreats. \n\nAesthetic: Serene, introspective, transformative. \n\nHARD RULES\n- Motion: Must include a natural actor showing calmness AND a subtle camera move.\n- Color palette: psychedelic purple + blue with neon lucid glow.\n- No on-screen text.\n- No fire imagery.\n\nSTRUCTURE (2\u20134 sentences)\n- Subject + serene action.\n- Camera movement + lighting/mood.\n- Audio design line.",
"options": {
"systemMessage": "=You are a helpful and intelligent assistant."
},
"promptType": "define"
},
"typeVersion": 2.2
},
{
"id": "342dcd30-df8d-4ca9-8b38-71a513cff9c8",
"name": "Generate Video (Fal.ai)",
"type": "n8n-nodes-base.httpRequest",
"position": [
-1264,
1264
],
"parameters": {
"url": "https://queue.fal.run/fal-ai/veo3/fast",
"method": "POST",
"options": {},
"jsonBody": "={\n \"prompt\": \"{{ $json.output }}\",\n \"aspect_ratio\": \"9:16\"\n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"typeVersion": 4.2
},
{
"id": "69db900c-732f-40ae-9f35-a7940211bebf",
"name": "Wait for Video",
"type": "n8n-nodes-base.wait",
"position": [
-1088,
1264
],
"parameters": {
"unit": "minutes",
"amount": 1.5
},
"typeVersion": 1.1
},
{
"id": "74ddae51-4982-4dac-b635-01cf3301a7ef",
"name": "Fetch Video URL",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueErrorOutput",
"position": [
-928,
1264
],
"parameters": {
"url": "={{ $json.response_url }}",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"typeVersion": 4.2
},
{
"id": "c2c89bf6-34f8-4066-b467-4c299a6d0bbd",
"name": "Send Preview to Telegram",
"type": "n8n-nodes-base.telegram",
"position": [
-624,
1248
],
"parameters": {
"chatId": "={{ $('Telegram Message').item.json.message.chat.id }}",
"operation": "sendVideo",
"binaryData": true,
"additionalFields": {}
},
"typeVersion": 1.2
},
{
"id": "143237c3-a5ac-461e-8c27-055ca414ccb5",
"name": "Wait for Approval",
"type": "n8n-nodes-base.telegram",
"position": [
-400,
1248
],
"parameters": {
"chatId": "={{ $('Telegram Message').item.json.message.chat.id }}",
"message": "=Is this video ready to post? Reply 'Great' to post, or describe changes to regenerate.",
"options": {},
"operation": "sendAndWait",
"responseType": "freeText"
},
"typeVersion": 1.2
},
{
"id": "8993b8a7-219e-420f-b67e-fdda308f26b0",
"name": "Approved?",
"type": "n8n-nodes-base.if",
"position": [
-144,
1248
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": false,
"typeValidation": "strict"
},
"combinator": "or",
"conditions": [
{
"id": "f76be284-b8d4-46e1-b859-9d05c220f4ce",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.data.text }}",
"rightValue": "great"
},
{
"id": "369535a3-e7e4-4fc9-9c2a-16e4ebfdbc7b",
"operator": {
"name": "filter.operator.contains",
"type": "string",
"operation": "contains"
},
"leftValue": "={{ $json.data.text }}",
"rightValue": "post it"
},
{
"id": "20ba5edb-a2ff-4286-8c82-acb4319c0420",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.data.text }}",
"rightValue": "yes"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "f165e95a-a4d5-45bf-a586-2d0a48c02a23",
"name": "Refine Prompt",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
96,
1248
],
"parameters": {
"text": "=ROLE\nAI Video Prompt Corrector\n\nGOAL\nRevise a rejected prompt based only on the provided user feedback.\n\nINPUTS\nRejected Prompt: {{ $('Draft Video Prompt').item.json.output }}\nUser Feedback: {{ $json.data.text }}\n\nReturn ONLY the prompt string.",
"options": {
"systemMessage": "=You are a helpful and intelligent assistant."
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2.2
},
{
"id": "519e4767-455d-479b-82e1-5a1c6a8eb51f",
"name": "Generate Video (Retry)",
"type": "n8n-nodes-base.httpRequest",
"position": [
528,
1248
],
"parameters": {
"url": "https://queue.fal.run/fal-ai/veo3/fast",
"method": "POST",
"options": {},
"jsonBody": "={\n \"prompt\": \"{{ $json.output }}\",\n \"aspect_ratio\": \"9:16\"\n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"typeVersion": 4.2
},
{
"id": "b683b957-ca4a-40f4-912e-ebc78a6f5e91",
"name": "Wait for Retry",
"type": "n8n-nodes-base.wait",
"position": [
720,
1248
],
"parameters": {
"unit": "minutes",
"amount": 1.5
},
"typeVersion": 1.1
},
{
"id": "a0b08c12-f223-419a-8389-11fa8cfe5c44",
"name": "Fetch Video URL (Retry)",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueErrorOutput",
"position": [
928,
1248
],
"parameters": {
"url": "={{ $('Generate Video (Retry)').item.json.response_url }}",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"typeVersion": 4.2
},
{
"id": "404e3e90-912d-4de0-a36b-f754bade6dcf",
"name": "Send Preview (Retry)",
"type": "n8n-nodes-base.telegram",
"position": [
1136,
1248
],
"parameters": {
"chatId": "={{ $('Telegram Message').item.json.message.chat.id }}",
"operation": "sendVideo",
"binaryData": true,
"additionalFields": {}
},
"typeVersion": 1.2
},
{
"id": "6edae254-ef44-4b5c-941e-849836c6dee0",
"name": "Generate Caption",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
272,
432
],
"parameters": {
"text": "=ROLE\nInstagram Caption & Hashtag Generator\n\nGOAL\nWrite short, meaningful captions that combine calm tone with practical insight. Output only the caption and hashtags.\n\nINPUT\nVideo prompt \u2192 {{ $('Draft Video Prompt').item.json.output }}\n\nOUTPUT FORMAT\nThree short paragraphs separated by line breaks. \nThen a blank line. \nThen hashtags on one line.",
"options": {},
"promptType": "define",
"needsFallback": true
},
"typeVersion": 2.2
},
{
"id": "c7a1be50-2d0f-4eac-9e3c-834ba8d7ef95",
"name": "Log to Google Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
880,
432
],
"parameters": {
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": ""
},
"documentId": {
"__rl": true,
"mode": "list",
"value": ""
}
},
"typeVersion": 4.7
},
{
"id": "121afbb7-9743-45ec-8408-edaf62cb1668",
"name": "Upload to Blotato",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
1168,
432
],
"parameters": {
"mediaUrl": "={{ $('Fetch Video URL').item.json.video.url }}",
"resource": "media"
},
"typeVersion": 2
},
{
"id": "64c7296c-88f7-4803-b87e-e6e70853f597",
"name": "Post to Instagram",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
1472,
64
],
"parameters": {
"options": {},
"accountId": {
"__rl": true,
"mode": "list",
"value": ""
},
"postContentText": "={{ $('Generate Caption').item.json.output }}",
"postContentMediaUrls": "={{ $json.url }}"
},
"typeVersion": 2
},
{
"id": "eba0206f-01cb-47a0-b78a-9fdb0a8729f9",
"name": "Post to Facebook",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
1488,
432
],
"parameters": {
"options": {},
"platform": "facebook",
"accountId": {
"__rl": true,
"mode": "list",
"value": ""
},
"facebookPageId": {
"__rl": true,
"mode": "list",
"value": ""
},
"postContentText": "={{ $('Generate Caption').item.json.output }}",
"postContentMediaUrls": "={{ $json.url }}"
},
"typeVersion": 2
},
{
"id": "ac581c32-2a38-4c3f-beab-33049309b35e",
"name": "Post to LinkedIn",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
1488,
240
],
"parameters": {
"options": {},
"platform": "linkedin",
"accountId": {
"__rl": true,
"mode": "list",
"value": ""
},
"postContentText": "={{ $('Generate Caption').item.json.output }}",
"postContentMediaUrls": "={{ $json.url }}"
},
"typeVersion": 2
},
{
"id": "317fa92d-87f9-4b04-9cdf-43ca71f966f3",
"name": "Post to Youtube",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
1504,
752
],
"parameters": {
"options": {},
"platform": "youtube",
"accountId": {
"__rl": true,
"mode": "list",
"value": ""
},
"postContentText": "={{ $('Generate Caption').item.json.output }} #shorts",
"postContentMediaUrls": "={{ $json.url }}",
"postCreateYoutubeOptionTitle": "={{ $('Generate Youtube Title').item.json.output }}"
},
"typeVersion": 2
},
{
"id": "7bf0e596-6036-4307-b8dc-4a043283bbec",
"name": "Post to TikTok",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
1488,
608
],
"parameters": {
"options": {},
"platform": "tiktok",
"accountId": {
"__rl": true,
"mode": "list",
"value": ""
},
"postContentText": "={{ $('Generate Caption').item.json.output }}",
"postContentMediaUrls": "={{ $json.url }}"
},
"typeVersion": 2
},
{
"id": "35f229dd-f895-4904-bd0e-19f41e0741f0",
"name": "Generate Youtube Title",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
576,
432
],
"parameters": {
"text": "=ROLE\nYoutube title creator\n\nINPUT\nCaptions- {{ $json.output }}\nPrompt- {{ $('Draft Video Prompt').item.json.output }}\n\nJust return 3-5 words for title.",
"options": {},
"promptType": "define",
"needsFallback": true
},
"typeVersion": 2.2
},
{
"id": "42a1045a-1765-48c2-bc06-dfa6cf1c0c91",
"name": "Think",
"type": "@n8n/n8n-nodes-langchain.toolThink",
"position": [
64,
1600
],
"parameters": {},
"typeVersion": 1.1
},
{
"id": "a79acf15-7f32-4346-9abf-51d8ee63c6f8",
"name": "Overview",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1936,
688
],
"parameters": {
"color": 6,
"width": 896,
"height": 386,
"content": "### \ud83e\udd16 AI Video Generator & Publisher\nThis workflow acts as your social media powerhouse. \n\n### How it works\n1. **Trigger:** Send a message to your Telegram bot (e.g., \"A calm forest scene\").\n2. **Generate:** AI drafts a prompt and Fal.ai creates a video.\n3. **Feedback:** You get a preview in Telegram. Reply \"Great\" to post, or describe changes (e.g., \"Make it darker\").\n4. **Publish:** If approved, it generates captions/hashtags and posts to Instagram, FB, LinkedIn, TikTok, and YouTube via Blotato.\n\n### Setup Steps\n1. **Credentials:** Add keys for OpenAI, Fal.ai, Telegram, Google Sheets, and Blotato.\n2. **Configuration:** \n - In `Log to Google Sheets`, select your Sheet ID.\n - In all `Blotato` nodes (Instagram, FB, etc.), select your Account IDs.\n"
},
"typeVersion": 1
},
{
"id": "82062af1-6ef7-4c64-8e24-6f4fe35df601",
"name": "Section 1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1936,
1120
],
"parameters": {
"color": 7,
"width": 1220,
"height": 380,
"content": "## 1. Generation Phase\nDrafts prompt and generates video via Fal.ai"
},
"typeVersion": 1
},
{
"id": "9f35e422-ea5a-4212-ab1e-013924635685",
"name": "Section 2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-656,
1120
],
"parameters": {
"color": 3,
"width": 1980,
"height": 380,
"content": "## 2. Feedback & Refinement Loop\nWait for human approval. If changes are needed, refine and regenerate."
},
"typeVersion": 1
},
{
"id": "82859930-9e57-4422-8e58-e9d1e7834265",
"name": "Section 3",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
0
],
"parameters": {
"color": 4,
"width": 1720,
"height": 960,
"content": "## 3. Multi-Channel Publishing\nIf approved: Generate captions, log to Sheets, and post via Blotato."
},
"typeVersion": 1
},
{
"id": "00d1164f-21d0-40a7-b10c-4994c38e284b",
"name": "OpenRouter Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"position": [
336,
640
],
"parameters": {
"model": "z-ai/glm-4.5-air:free",
"options": {}
},
"credentials": {
"openRouterApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "0c0a58b3-da8c-46fb-a268-8c65db14d22a",
"name": "OpenRouter Chat Model1",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"position": [
-160,
1600
],
"parameters": {
"model": "openai/gpt-5.2",
"options": {}
},
"credentials": {
"openRouterApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
}
],
"connections": {
"Think": {
"ai_tool": [
[
{
"node": "Draft Video Prompt",
"type": "ai_tool",
"index": 0
},
{
"node": "Refine Prompt",
"type": "ai_tool",
"index": 0
}
]
]
},
"Approved?": {
"main": [
[
{
"node": "Generate Caption",
"type": "main",
"index": 0
}
],
[
{
"node": "Refine Prompt",
"type": "main",
"index": 0
}
]
]
},
"Refine Prompt": {
"main": [
[
{
"node": "Generate Video (Retry)",
"type": "main",
"index": 0
}
]
]
},
"Wait for Retry": {
"main": [
[
{
"node": "Fetch Video URL (Retry)",
"type": "main",
"index": 0
}
]
]
},
"Wait for Video": {
"main": [
[
{
"node": "Fetch Video URL",
"type": "main",
"index": 0
}
]
]
},
"Fetch Video URL": {
"main": [
[
{
"node": "Send Preview to Telegram",
"type": "main",
"index": 0
}
]
]
},
"Generate Caption": {
"main": [
[
{
"node": "Generate Youtube Title",
"type": "main",
"index": 0
}
]
]
},
"Telegram Message": {
"main": [
[
{
"node": "Draft Video Prompt",
"type": "main",
"index": 0
}
]
]
},
"Upload to Blotato": {
"main": [
[
{
"node": "Post to Instagram",
"type": "main",
"index": 0
},
{
"node": "Post to Facebook",
"type": "main",
"index": 0
},
{
"node": "Post to LinkedIn",
"type": "main",
"index": 0
},
{
"node": "Post to Youtube",
"type": "main",
"index": 0
},
{
"node": "Post to TikTok",
"type": "main",
"index": 0
}
]
]
},
"Wait for Approval": {
"main": [
[
{
"node": "Approved?",
"type": "main",
"index": 0
}
]
]
},
"Draft Video Prompt": {
"main": [
[
{
"node": "Generate Video (Fal.ai)",
"type": "main",
"index": 0
}
]
]
},
"Log to Google Sheets": {
"main": [
[
{
"node": "Upload to Blotato",
"type": "main",
"index": 0
}
]
]
},
"OpenRouter Chat Model": {
"ai_languageModel": [
[
{
"node": "Generate Caption",
"type": "ai_languageModel",
"index": 0
},
{
"node": "Generate Youtube Title",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Generate Video (Retry)": {
"main": [
[
{
"node": "Wait for Retry",
"type": "main",
"index": 0
}
]
]
},
"Generate Youtube Title": {
"main": [
[
{
"node": "Log to Google Sheets",
"type": "main",
"index": 0
}
]
]
},
"OpenRouter Chat Model1": {
"ai_languageModel": [
[
{
"node": "Draft Video Prompt",
"type": "ai_languageModel",
"index": 0
},
{
"node": "Refine Prompt",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Fetch Video URL (Retry)": {
"main": [
[
{
"node": "Send Preview (Retry)",
"type": "main",
"index": 0
}
]
]
},
"Generate Video (Fal.ai)": {
"main": [
[
{
"node": "Wait for Video",
"type": "main",
"index": 0
}
]
]
},
"Send Preview to Telegram": {
"main": [
[
{
"node": "Wait for Approval",
"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.
openRouterApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Turn a single text message into a fully produced video and publish it across 5 social media platforms automatically. This workflow combines AI video generation (Fal.ai) with a "Human-in-the-loop" approval system via Telegram, ensuring you never post content without checking it…
Source: https://n8n.io/workflows/12128/ — 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.
This template is designed for marketers, content creators, and e-commerce brands who want to automate the creation of professional ad videos at scale. It’s ideal for teams looking to generate consiste
AI-powered Telegram bot for effortless expense tracking. Send receipts, voice messages, or text - the bot automatically extracts and categorizes your expenses. 📸 Receipt & Invoice OCR - Send photos of
This workflow contains community nodes that are only compatible with the self-hosted version of n8n.
Create Video Ia. Uses @blotato/n8n-nodes-blotato, googleSheets, lmChatOpenAi, toolThink. Event-driven trigger; 47 nodes.