AutomationFlowsAI & RAG › Create & Auto-post Instagram Reels with AI Clones: Script-to-post (heygen +…

Create & Auto-post Instagram Reels with AI Clones: Script-to-post (heygen +…

Original n8n title: Create & Auto-post Instagram Reels with AI Clones: Script-to-post (heygen + Submagic + Blotato)

ByAutomate With Marc @marconi on n8n.io

Turn an idea into a finished Instagram Reel—end to end, on autopilot. This template generates a compelling Reel script, sends it to Heygen to produce an AI avatar/clone video, applies dynamic on-video captions with Submagic, then uploads and auto-posts to Instagram via Blotato,…

Chat trigger trigger★★★★☆ complexityAI-powered21 nodesOpenAI ChatChat TriggerHTTP Request@Blotato/N8N Nodes BlotatoOpenAIAgent
AI & RAG Trigger: Chat trigger Nodes: 21 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #8918 — we link there as the canonical source.

This workflow follows the Agent → Chat Trigger 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
{
  "id": "YtobuRA2wN6ab8zd",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "AI Clone Instagram Viral Reel Agent + Autopost",
  "tags": [],
  "nodes": [
    {
      "id": "9d35c2c2-3c87-4fa6-b3ae-a27c3fa21d1f",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        208,
        176
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultName": ""
        },
        "options": {}
      },
      "credentials": {},
      "typeVersion": 1.2
    },
    {
      "id": "f959f888-c721-4003-a0c7-830773f03c25",
      "name": "When chat message received",
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "position": [
        0,
        0
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1.3
    },
    {
      "id": "993018fa-feff-4352-972c-9f57aed5ca23",
      "name": "Post to Heygen",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        560,
        0
      ],
      "parameters": {
        "url": "https://api.heygen.com/v2/video/generate",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"video_inputs\": [\n    {\n      \"character\": {\n        \"type\": \"avatar\",\n        \"avatar_id\": \"56b7bf60959448f789bff62bd7b5ef48\",\n        \"avatar_style\": \"normal\"\n      },\n      \"voice\": {\n        \"type\": \"text\",\n        \"input_text\": \"{{ $json.output }}\",\n        \"voice_id\": \"0fcabc9607434b6385b4f5c6810c5b7a\",\n        \"speed\": 1.1\n      }\n    }\n  ],\n\"dimension\": { \"width\": 720, \"height\": 1280 }\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {},
      "typeVersion": 4.2
    },
    {
      "id": "33770860-f574-4c9c-8c64-c04380aae4bc",
      "name": "Wait 30 Secs",
      "type": "n8n-nodes-base.wait",
      "position": [
        768,
        0
      ],
      "parameters": {
        "amount": 30
      },
      "typeVersion": 1.1
    },
    {
      "id": "0d19fdd9-c648-496b-aaa6-ccba09028435",
      "name": "GET Result",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        976,
        0
      ],
      "parameters": {
        "url": "https://api.heygen.com/v1/video_status.get",
        "options": {},
        "sendQuery": true,
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "queryParameters": {
          "parameters": [
            {
              "name": "",
              "value": ""
            }
          ]
        }
      },
      "credentials": {},
      "typeVersion": 4.2
    },
    {
      "id": "a0ea782d-29b9-4af5-8376-d33b18874215",
      "name": "If",
      "type": "n8n-nodes-base.if",
      "position": [
        1184,
        0
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "",
              "operator": {
                "name": "",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.data.status }}",
              "rightValue": "completed"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "4dea5ac5-973e-49c0-b5e1-9a3f3c336a4a",
      "name": "Wait Another 30 Secs",
      "type": "n8n-nodes-base.wait",
      "position": [
        1216,
        176
      ],
      "parameters": {
        "amount": 30
      },
      "typeVersion": 1.1
    },
    {
      "id": "3aed255c-1b1e-4b1e-b446-1a4fe8d4e69e",
      "name": "Post to Submagic",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        176,
        464
      ],
      "parameters": {
        "url": "https://api.submagic.co/v1/projects",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "authentication": "genericCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "",
              "value": ""
            },
            {
              "name": "",
              "value": ""
            },
            {
              "name": "",
              "value": ""
            },
            {
              "name": "",
              "value": ""
            }
          ]
        },
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {},
      "typeVersion": 4.2
    },
    {
      "id": "fd3ebc70-09f4-465e-80d1-6e248b648874",
      "name": "Get Captioned Video from Submagic",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        576,
        464
      ],
      "parameters": {
        "url": "=https://api.submagic.co/v1/projects/{{ $json.id }}",
        "options": {},
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {},
      "typeVersion": 4.2
    },
    {
      "id": "93fac899-2378-41ab-ba74-22ebe6f05780",
      "name": "Wait 15 Secs",
      "type": "n8n-nodes-base.wait",
      "position": [
        704,
        688
      ],
      "parameters": {
        "amount": 15
      },
      "typeVersion": 1.1
    },
    {
      "id": "3832e8fa-dd5e-438c-bfb1-a8cd4a16bf04",
      "name": "Wait 15 Secs1",
      "type": "n8n-nodes-base.wait",
      "position": [
        368,
        464
      ],
      "parameters": {
        "amount": 15
      },
      "typeVersion": 1.1
    },
    {
      "id": "2b4f387d-8395-4374-9f1b-ac6de8529b72",
      "name": "If1",
      "type": "n8n-nodes-base.if",
      "position": [
        800,
        464
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "",
              "operator": {
                "name": "",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.status }}",
              "rightValue": "completed"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "d01faf37-a6f2-4dde-b7a0-eae89094f4ea",
      "name": "Upload media",
      "type": "@blotato/n8n-nodes-blotato.blotato",
      "position": [
        1040,
        464
      ],
      "parameters": {
        "mediaUrl": "={{ $json.downloadUrl }}",
        "resource": "media"
      },
      "credentials": {},
      "typeVersion": 2
    },
    {
      "id": "96273445-5a0f-46fd-ab6d-7d85332d95e8",
      "name": "Create post",
      "type": "@blotato/n8n-nodes-blotato.blotato",
      "position": [
        1664,
        464
      ],
      "parameters": {
        "options": {
          "instagramMediaType": "reel"
        },
        "accountId": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultUrl": "",
          "cachedResultName": ""
        },
        "postContentText": "={{ $json.message.content }}",
        "postContentMediaUrls": "={{ $('Upload media').item.json.url }}"
      },
      "credentials": {},
      "typeVersion": 2
    },
    {
      "id": "d3f149d2-cdb4-4e5e-8ef3-704cc8584e77",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        48,
        400
      ],
      "parameters": {
        "color": 5,
        "width": 944,
        "height": 528,
        "content": "Text Overlay Agent"
      },
      "typeVersion": 1
    },
    {
      "id": "b07d245d-5ed4-4bc7-bdfe-f8b560647611",
      "name": "Instagram Caption Agent",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        1248,
        464
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultName": ""
        },
        "options": {},
        "messages": {
          "values": [
            {
              "content": "={{ $('Instagram Script Generator').item.json.output }}"
            },
            {
              "role": "system",
              "content": "=You are an Instagram Reel Caption Generator Agent.\nYou will receive a short-form Reel script as user input. Your task is to transform this into a scroll-stopping Instagram caption that maximizes engagement and virality.\n\nYour Objectives\n\nHook the Audience\n\nStart with a punchy, curiosity-driven first line to stop the scroll.\n\nUse rhetorical questions, bold claims, or surprising facts tied to the script.\n\nAdd Context & Value\n\nExpand briefly on the Reel topic (1\u20133 short sentences).\n\nEnsure it complements\u2014not repeats\u2014the script.\n\nProvide a quick takeaway, insight, or relatable statement.\n\nEngagement Call-to-Action (CTA)\n\nInvite comments, saves, and shares (e.g., \u201cWhich one would you try first?\u201d or \u201cTag a friend who needs this\u201d).\n\nKeep CTAs natural and aligned with the influencer\u2019s style.\n\nHashtags\n\nAdd a mix of broad reach hashtags (#moneytips, #investing, #financialfreedom) and niche-specific hashtags (#personalfinancesimplified, #moneymindset).\n\nUse 8\u201315 highly relevant hashtags only (avoid clutter).\n\nTailor hashtags to personal finance + trending/viral growth.\n\nStyle Guidelines\n\nTone: conversational, authentic, slightly provocative (similar to podcast-style influencers like Steven Bartlett or Chris Williamson).\n\nKeep sentences short and easy to scan.\n\nUse line breaks to make the caption readable.\n\nAdd the occasional emoji to highlight emotion or draw attention (sparingly, 2\u20134 max).\n\nTotal length: 80\u2013150 words (enough for depth, but not overwhelming).\n\nOutput Format\n\nCaption text (ready to post).\n\nHashtags block at the end (separated from caption with a line break or dots)."
            }
          ]
        }
      },
      "credentials": {},
      "typeVersion": 1.8
    },
    {
      "id": "7c1a535c-9cb9-4910-942c-1a232c9a2bd6",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1008,
        400
      ],
      "parameters": {
        "color": 4,
        "width": 896,
        "height": 528,
        "content": "Post to Instagram"
      },
      "typeVersion": 1
    },
    {
      "id": "fb863785-c0fd-42d5-8d4f-8a1e57d349d0",
      "name": "Instagram Script Generator",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        208,
        0
      ],
      "parameters": {
        "options": {
          "systemMessage": "=You are an Instagram Reel Script Generator Agent.\nYour role is to take a topic or idea provided by the user and transform it into a short, compelling Instagram Reel script that hooks attention within the first 3 seconds and keeps the viewer engaged until the end.\n\nAudience & Persona\n\nYou are writing for an Instagram influencer in the personal finance niche.\n\nThe influencer\u2019s style should reflect the conversational, thoughtful, and emotionally engaging approach of podcast-style creators like Steven Bartlett or Chris Williamson.\n\nThe tone should be: authentic, curious, slightly provocative, and always value-driven.\n\nOutput Requirements\n\nHook (Opening 1\u20132 sentences):\n\nMust grab attention immediately.\n\nCan use surprising facts, bold statements, or rhetorical questions.\n\nMain Content (Body):\n\nDeliver 1\u20133 clear, actionable insights or a thought-provoking perspective related to the finance topic.\n\nKeep sentences short and conversational, as if speaking directly to camera.\n\nUse relatable analogies, storytelling, or thought experiments to build engagement.\n\nClose (CTA/Takeaway):\n\nEnd with either:\n\na memorable one-liner, or\n\na soft call-to-action (e.g., \u201cWhat do you think?\u201d or \u201cFollow for more insights like this\u201d).\n\nStyle Guide\n\nWrite in a spoken voice, not academic prose.\n\nKeep it under 30 seconds of spoken word\n\nUse short paragraphs or line breaks to make it easy to read and perform.\n\nAvoid jargon unless it\u2019s explained in simple terms.\n\nPrioritize emotional resonance + practical value over raw information.\n\n#Rules\nKeep it under 1500 characters\nOutput in one paragraph."
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "3a809732-f356-424a-b106-469cd6ad17f5",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        496,
        -144
      ],
      "parameters": {
        "color": 3,
        "width": 944,
        "height": 528,
        "content": "Create IG Reel with Personal Avatar"
      },
      "typeVersion": 1
    },
    {
      "id": "b2d61d68-38c4-453f-8f6b-c1e4b7faf644",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -48,
        -144
      ],
      "parameters": {
        "color": 6,
        "width": 528,
        "height": 528,
        "content": "Trigger and Script"
      },
      "typeVersion": 1
    },
    {
      "id": "e223ad26-a528-4d3d-85d2-bdba09472663",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1232,
        -160
      ],
      "parameters": {
        "width": 1088,
        "height": 1904,
        "content": "AI Clone Instagram Reel Builder + Auto-Post (Heygen + Submagic + Blotato + n8n)\n\nDescription\nTurn an idea into a finished Instagram Reel\u2014end to end, on autopilot.\nThis template generates a compelling Reel script, sends it to Heygen to produce an AI avatar/clone video, applies dynamic on-video captions with Submagic, then uploads and auto-posts to Instagram via Blotato, complete with a tailored AI-written caption. Ideal for creators, agencies, and brands who want consistent short-form output without manual editing.\n\n\ud83d\udc49 Watch step-by-step automation builds on YouTube: https://youtu.be/MmZxLuAkqig?si=DRfS89yQlSlbMbfZ\n\nWhat This Template Does\n\n\u270d\ufe0f Generates a short-form Reel script from your topic/idea (optimized hook \u2192 body \u2192 close).\n\n\ud83e\uddd1\u200d\ud83c\udfa4 Creates an AI avatar video using Heygen (character + voice) from that script.\n\n\ud83c\udd70\ufe0f Adds stylized overlaid captions using Submagic (template selectable).\n\n\u2601\ufe0f Uploads media to Blotato and auto-posts to Instagram Reels.\n\n\ud83e\udde0 Writes an IG caption (with hashtags) using an AI Caption Agent tuned for engagement.\n\nHow It Works (Node Flow)\n\nChat Trigger \u2013 Send a topic/idea to start the run.\n\nInstagram Script Generator (Agent) \u2013 Creates a 25\u201330s script (hook \u2192 insights \u2192 soft CTA).\n\nPOST to Heygen \u2013 Generates an avatar video from the script (avatar_id, voice_id, size).\n\nWait & Poll \u2013 Checks Heygen status until the video is ready.\n\nPOST to Submagic \u2013 Creates a project and applies your caption style (e.g., \u201cHormozi 2\u201d).\n\nWait & Poll \u2013 Retrieves the captioned video URL when completed.\n\nUpload media (Blotato) \u2013 Uploads the final video to your Blotato account.\n\nInstagram Caption Agent \u2013 Produces an on-brand IG caption + hashtag block from the original script.\n\nCreate Post (Blotato) \u2013 Publishes to Instagram as a Reel with the AI caption and uploaded media.\n\nRequired Credentials\n\nOpenAI (or compatible) \u2013 for script + caption agents.\n\nHeygen API \u2013 HTTP Header Auth (API key).\n\nSubmagic API \u2013 HTTP Header Auth (API key).\n\nBlotato API \u2013 Account + token.\n\n(Optional) KodeKey/Base URL if you route OpenAI-compatible models through your gateway.\n\nBest practice: store all secrets in n8n Credentials, not hard-coded in nodes.\n\nQuick Start\n\nImport the template into n8n.\n\nCreate/assign credentials for OpenAI (or compatible), Heygen, Submagic, and Blotato.\n\nIn Heygen, set your avatar_id and voice_id (or swap with your own).\n\nIn Submagic, set templateName, language, and style preferences.\n\nIn Blotato, confirm the accountId and instagramMediaType: reel.\n\nRun the workflow from the Chat Trigger with a topic (e.g., \u201c3 money habits for 2025\u201d).\n\nConfirm the Reel shows up in your connected Instagram account.\n\nCustomization Tips\n\nScript Persona: Adjust the agent system prompt (niche, tone, audience).\n\nCaption Style: Tweak the Caption Agent for hook length, CTAs, and hashtag strategy.\n\nHeygen Output: Change dimension to 1080\u00d71920 for full-HD vertical.\n\nSubmagic Template: Swap templateName to match your brand.\n\nPosting Targets: Extend Blotato to cross-post to TikTok/YouTube Shorts.\n\nError Handling & Reliability\n\nUses Wait + status polling for both Heygen and Submagic before downstream steps.\n\nIncludes IF checks to re-poll when processing is not complete.\n\nRecommendation: add Slack/Email alerts and Retry options for production use.\n\nIdeal For\n\nSolo creators and founders posting daily\n\nSocial media managers and agencies\n\nEdu/Coach brands scaling short-form content"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "8b1880da-9612-4b99-b46d-67a6af185537",
  "connections": {
    "If": {
      "main": [
        [
          {
            "node": "Post to Submagic",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait Another 30 Secs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If1": {
      "main": [
        [
          {
            "node": "Upload media",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait 15 Secs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "GET Result": {
      "main": [
        [
          {
            "node": "If",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload media": {
      "main": [
        [
          {
            "node": "Instagram Caption Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait 15 Secs": {
      "main": [
        [
          {
            "node": "Get Captioned Video from Submagic",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait 30 Secs": {
      "main": [
        [
          {
            "node": "GET Result",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait 15 Secs1": {
      "main": [
        [
          {
            "node": "Get Captioned Video from Submagic",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Post to Heygen": {
      "main": [
        [
          {
            "node": "Wait 30 Secs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Post to Submagic": {
      "main": [
        [
          {
            "node": "Wait 15 Secs1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Instagram Script Generator",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Wait Another 30 Secs": {
      "main": [
        [
          {
            "node": "GET Result",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Instagram Caption Agent": {
      "main": [
        [
          {
            "node": "Create post",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Instagram Script Generator": {
      "main": [
        [
          {
            "node": "Post to Heygen",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When chat message received": {
      "main": [
        [
          {
            "node": "Instagram Script Generator",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Captioned Video from Submagic": {
      "main": [
        [
          {
            "node": "If1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Turn an idea into a finished Instagram Reel—end to end, on autopilot. This template generates a compelling Reel script, sends it to Heygen to produce an AI avatar/clone video, applies dynamic on-video captions with Submagic, then uploads and auto-posts to Instagram via Blotato,…

Source: https://n8n.io/workflows/8918/ — 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

Watch the full step-by-step tutorial on YouTube: https://youtu.be/id22R7iBTjo

Chat Trigger, Agent, OpenAI Chat +5
AI & RAG

Who’s it for Creators who want to create faceless videos automatically, while keeping human oversight and quality control.

Read Write File, Agent, OpenAI Chat +7
AI & RAG

The Best Linkedin Posting System. Uses httpRequest, lmChatOpenAi, agent, chatTrigger. Chat trigger; 49 nodes.

HTTP Request, OpenAI Chat, Agent +8
AI & RAG

Who is this workflow for? This workflow is designed for SEO analysts, content creators, marketing agencies, and developers who need to index a website and then interact with its content as if it were

Agent, OpenAI Chat, Memory Buffer Window +10
AI & RAG

Categories: AI Agents, Design Automation, Business Tools

Tool Workflow, HTTP Request Tool, Memory Buffer Window +7