AutomationFlowsAI & RAG › Text-to-video Generator & Social Media Publisher with Fal.ai and Telegram…

Text-to-video Generator & Social Media Publisher with Fal.ai and Telegram…

Original n8n title: Text-to-video Generator & Social Media Publisher with Fal.ai and Telegram Approval

ByVasu Gupta @chetangupta11 on n8n.io

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…

Event trigger★★★★☆ complexityAI-powered29 nodesTelegram TriggerAgentHTTP RequestTelegramGoogle Sheets@Blotato/N8N Nodes BlotatoTool ThinkOpenRouter Chat
AI & RAG Trigger: Event Nodes: 29 Complexity: ★★★★☆ AI nodes: yes Added:

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 →

Download .json
{
  "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.

Pro

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 →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

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.

@Blotato/N8N Nodes Blotato, Google Sheets, OpenAI Chat +9
AI & RAG

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

Telegram, Telegram Trigger, Google Drive +8
AI & RAG

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

Telegram Trigger, Mcp Client Tool, Tool Calculator +7
AI & RAG

This workflow contains community nodes that are only compatible with the self-hosted version of n8n.

Output Parser Structured, Telegram, N8N Nodes Tesseractjs +14
AI & RAG

Create Video Ia. Uses @blotato/n8n-nodes-blotato, googleSheets, lmChatOpenAi, toolThink. Event-driven trigger; 47 nodes.

@Blotato/N8N Nodes Blotato, Google Sheets, OpenAI Chat +8