AutomationFlowsAI & RAG › Auto-Caption & Post Google Drive Videos to Instagram

Auto-Caption & Post Google Drive Videos to Instagram

Original n8n title: Submagic + Autopost

Submagic + Autopost. Uses googleDriveTrigger, httpRequest, googleSheets, lmChatOpenAi. Event-driven trigger; 21 nodes.

Event trigger★★★★☆ complexityAI-powered21 nodesGoogle Drive TriggerHTTP RequestGoogle SheetsOpenAI ChatAgent
AI & RAG Trigger: Event Nodes: 21 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow follows the Agent → Google Drive 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": "6LCQ1CdkcxmGPWYs",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Submagic + Autopost",
  "tags": [],
  "nodes": [
    {
      "id": "0a25a595-fde8-41b1-b748-4aaa76dfa3c7",
      "name": "Google Drive Trigger",
      "type": "n8n-nodes-base.googleDriveTrigger",
      "position": [
        -16,
        0
      ],
      "parameters": {
        "event": "fileCreated",
        "options": {},
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "triggerOn": "specificFolder",
        "folderToWatch": {
          "__rl": true,
          "mode": "list",
          "value": "<<<GOOGLE_DRIVE_FOLDER_ID>>>",
          "cachedResultUrl": "<<<GOOGLE_DRIVE_FOLDER_URL>>>",
          "cachedResultName": "<<<GOOGLE_DRIVE_FOLDER_NAME>>>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "603fe943-e36c-44f0-82fc-0d419e2571f8",
      "name": "Post to Submagic",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        240,
        0
      ],
      "parameters": {
        "url": "https://api.submagic.co/v1/projects",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "authentication": "genericCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "title",
              "value": "My First Video"
            },
            {
              "name": "language",
              "value": "en"
            },
            {
              "name": "videoUrl",
              "value": "={{ $json.webViewLink }}"
            },
            {
              "name": "templateName",
              "value": "Hormozi 2"
            }
          ]
        },
        "genericAuthType": "httpHeaderAuth"
      },
      "typeVersion": 4.2
    },
    {
      "id": "713c3d1c-b739-4298-b3ac-29bd76dde2a9",
      "name": "Get Captioned Video from Submagic",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        672,
        0
      ],
      "parameters": {
        "url": "=https://api.submagic.co/v1/projects/{{ $json.id }}",
        "options": {},
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "typeVersion": 4.2
    },
    {
      "id": "5744f643-fb29-4975-85c3-77d85ea6a35e",
      "name": "Download Captioned Video",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1136,
        0
      ],
      "parameters": {
        "url": "={{ $json.downloadUrl }}",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "14e5ea48-6b99-4742-a520-fac3335dcdf6",
      "name": "Upload to Postiz",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1376,
        0
      ],
      "parameters": {
        "url": "https://api.postiz.com/public/v1/upload",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "contentType": "multipart-form-data",
        "authentication": "genericCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "file",
              "parameterType": "formBinaryData",
              "inputDataFieldName": "data"
            }
          ]
        },
        "genericAuthType": "httpHeaderAuth"
      },
      "typeVersion": 4.2
    },
    {
      "id": "57225264-85f2-4c4c-82f7-9a63022d6d94",
      "name": "Post to Instagram",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2480,
        0
      ],
      "parameters": {
        "url": "https://api.postiz.com/public/v1/posts",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"type\": \"now\",\n  \"shortLink\": false,\n  \"date\": \"{{ new Date($now).toISOString() }}\",\n  \"tags\": [],\n  \"posts\": [\n    {\n      \"integration\": { \"id\": \"cmeku38qa00cpo90yfw4ai6lt\" },\n      \"value\": [\n        {\n          \"content\": \"{{ $json.output }}\",\n          \"image\": [\n            {\n              \"id\": \"{{ $node['Upload to Postiz'].json.id }}\",\n              \"path\": \"{{ $node['Upload to Postiz'].json.path }}\"\n            }\n          ]\n        }\n      ],\n      \"settings\": {\n        \"post_type\": \"post\"\n      }\n    }\n  ]\n}\n",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "typeVersion": 4.2
    },
    {
      "id": "814fb8ae-7536-4da9-9217-88e00cb0749c",
      "name": "Update Log",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1568,
        0
      ],
      "parameters": {
        "columns": {
          "value": {},
          "schema": [
            {
              "id": "Video Description / Prompt",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Video Description / Prompt",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Video URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Video URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Caption",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Caption",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "<<<SHEET_ID>>>",
          "cachedResultUrl": "<<<GOOGLE_SHEET_URL>>>",
          "cachedResultName": "<<<SHEET_NAME>>>"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "<<<GOOGLE_SHEET_ID>>>",
          "cachedResultUrl": "<<<GOOGLE_SHEET_URL>>>",
          "cachedResultName": "<<<SHEET_NAME>>>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "00c8896b-6b79-43fc-b541-13c097ddb72f",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        2064,
        224
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-5",
          "cachedResultName": "gpt-5"
        },
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "30f23841-c8ae-476c-881e-61a05d848e0f",
      "name": "Caption Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        2144,
        0
      ],
      "parameters": {
        "text": "={{ $json['Image Prompt'] }}",
        "options": {
          "systemMessage": "You are an expert Instagram caption writer.\nYour task is to take the image prompt provided by the user and generate a short, engaging caption that encourages parents and children to try Larrydoodle \u2014 a free online doodle drawing creator for kids. With Larrydoodle, children can design custom coloring pages, print them out, and start coloring instantly.\n\nCaption Guidelines\nKeep captions short, playful, and engaging for parents and kids.\nEmphasize the fun, creativity, and ease of using Larrydoodle.\nRotate the call-to-action (CTA) across posts, using one of these variations:\nCreate your own custom coloring pages for free today at larrydoodle.com\nTry it free and start creating now\nComment below what you created and share your creations with us by tagging #larrydoodle or tagging us in your Instagram Stories (make it lively and inviting)\n\nTone: friendly, imaginative, and encouraging.\n\nOutput Rules\nDo not use special characters like {} ! %$&*\nReturn only one final caption per request.\nDo not include explanations or formatting outside of the caption itself."
        },
        "promptType": "define"
      },
      "typeVersion": 2.2
    },
    {
      "id": "45b0d6d7-a4e2-4bb4-ba0c-47a44437ca64",
      "name": "Code",
      "type": "n8n-nodes-base.code",
      "position": [
        1968,
        0
      ],
      "parameters": {
        "jsCode": "// inputData contains all rows from the previous node\nreturn [items[items.length - 1]];"
      },
      "typeVersion": 2
    },
    {
      "id": "b8abfe9e-c12c-4571-8d84-590c1f73c87f",
      "name": "Get row(s) in sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1760,
        0
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "<<<SHEET_ID>>>",
          "cachedResultUrl": "<<<GOOGLE_SHEET_URL>>>",
          "cachedResultName": "<<<SHEET_NAME>>>"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "<<<GOOGLE_SHEET_ID>>>",
          "cachedResultUrl": "<<<GOOGLE_SHEET_URL>>>",
          "cachedResultName": "<<<SHEET_NAME>>>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "b361b439-9d7f-45fe-8354-e31be2ba001e",
      "name": "If",
      "type": "n8n-nodes-base.if",
      "position": [
        880,
        0
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "df5cad6d-dcb6-4f43-b8f6-4a5e97950c46",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.status }}",
              "rightValue": "completed"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "1204ab08-7196-45a1-a235-0bab382627cf",
      "name": "Wait 15 Secs",
      "type": "n8n-nodes-base.wait",
      "position": [
        864,
        224
      ],
      "parameters": {
        "amount": 15
      },
      "typeVersion": 1.1
    },
    {
      "id": "4dde6f5a-ebed-4285-a5ba-eb378ec68293",
      "name": "Wait 15 Secs1",
      "type": "n8n-nodes-base.wait",
      "position": [
        464,
        0
      ],
      "parameters": {
        "amount": 15
      },
      "typeVersion": 1.1
    },
    {
      "id": "f51a5eb7-771f-4cc1-b046-7e208d8a6213",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -112,
        -272
      ],
      "parameters": {
        "color": 5,
        "width": 256,
        "height": 800,
        "content": "Google Drive Trigger"
      },
      "typeVersion": 1
    },
    {
      "id": "57355d6c-4880-43ae-be0d-12728e64eb96",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        160,
        -272
      ],
      "parameters": {
        "color": 7,
        "width": 256,
        "height": 800,
        "content": "Post to Submagic"
      },
      "typeVersion": 1
    },
    {
      "id": "c7de4f8e-7fb8-4d60-933d-1e7ae596d47b",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        432,
        -272
      ],
      "parameters": {
        "color": 3,
        "width": 656,
        "height": 800,
        "content": "Caption with Submagic"
      },
      "typeVersion": 1
    },
    {
      "id": "fcde94bd-9a82-41a4-8e04-b136aec57293",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1104,
        -272
      ],
      "parameters": {
        "color": 4,
        "width": 608,
        "height": 800,
        "content": "Upload to Postiz"
      },
      "typeVersion": 1
    },
    {
      "id": "1366f8ab-0f70-418f-baee-228c764a198c",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1728,
        -272
      ],
      "parameters": {
        "color": 5,
        "width": 688,
        "height": 800,
        "content": "Caption for IG"
      },
      "typeVersion": 1
    },
    {
      "id": "10f05958-6526-4c41-9e1a-428d1841081f",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2432,
        -272
      ],
      "parameters": {
        "color": 2,
        "width": 320,
        "height": 800,
        "content": "Post to IG"
      },
      "typeVersion": 1
    },
    {
      "id": "cc4a6414-b84e-40c9-8675-2f19a0dad2ab",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -864,
        -400
      ],
      "parameters": {
        "width": 672,
        "height": 992,
        "content": "\ud83c\udfa5 Auto-Caption & Autopost Videos to Instagram & TikTok\n\nDescription\nAutomate your short-form content pipeline! This workflow takes any video uploaded to a specific Google Drive folder, generates engaging captions with Submagic, and then auto-posts the finished video (with AI-generated captions) directly to Instagram or TikTok via Postiz. Captions are further refined with OpenAI for brand-ready social text. Finally, each published video is logged into a Google Sheet for tracking.\n\n\ud83d\udc49 Watch step-by-step build of this workflow on: www.youtube.com/@automatewithmarc\n\nHow It Works\n\nGoogle Drive Trigger \u2013 Detects new video uploads.\n\nSubmagic API \u2013 Adds styled captions automatically.\n\nWait + Poll \u2013 Monitors job status until the captioned video is ready.\n\nDownload Video \u2013 Retrieves the finished captioned video.\n\nUpload to Postiz \u2013 Sends the file to Postiz for multi-platform posting.\n\nCaption Agent (OpenAI) \u2013 Generates optimized Instagram/TikTok captions.\n\nPost to Instagram/TikTok \u2013 Publishes the video with caption.\n\nUpdate Log \u2013 Saves video details, captions, and status into Google Sheets.\n\nWhy You\u2019ll Love It\n\n\u26a1 Hands-off publishing \u2014 videos go from raw to posted automatically.\n\n\ud83d\udcdd AI captions + Submagic styling \u2014 engaging text and visual consistency.\n\n\ud83d\udcca Content tracking \u2014 every post logged in Google Sheets.\n\n\ud83c\udfaf Perfect for Reels & TikToks \u2014 optimized for fast workflows and social reach.\n\nRequirements\n\nGoogle Drive account\n\nSubmagic API key\n\nPostiz account (for IG/TikTok posting)\n\nOpenAI API key (for caption generation)\n\nGoogle Sheets account"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "connections": {
    "If": {
      "main": [
        [
          {
            "node": "Download Captioned Video",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait 15 Secs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code": {
      "main": [
        [
          {
            "node": "Caption Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update Log": {
      "main": [
        [
          {
            "node": "Get row(s) in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait 15 Secs": {
      "main": [
        [
          {
            "node": "Get Captioned Video from Submagic",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Caption Agent": {
      "main": [
        [
          {
            "node": "Post to Instagram",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait 15 Secs1": {
      "main": [
        [
          {
            "node": "Get Captioned Video from Submagic",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Post to Submagic": {
      "main": [
        [
          {
            "node": "Wait 15 Secs1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload to Postiz": {
      "main": [
        [
          {
            "node": "Update Log",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Caption Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Get row(s) in sheet": {
      "main": [
        [
          {
            "node": "Code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Drive Trigger": {
      "main": [
        [
          {
            "node": "Post to Submagic",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download Captioned Video": {
      "main": [
        [
          {
            "node": "Upload to Postiz",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Captioned Video from Submagic": {
      "main": [
        [
          {
            "node": "If",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

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

How this works

Effortlessly transform raw videos into captivating Instagram content by automating captioning and posting, saving hours of manual editing and ensuring consistent social media presence. This workflow suits content creators, marketers, or small businesses aiming to boost engagement without technical hassle. It begins with a Google Drive trigger that detects new video uploads, then leverages Submagic to generate dynamic captions and Postiz to schedule seamless Instagram posts, all while logging progress in Google Sheets for easy tracking.

Use this workflow when you regularly upload videos to Google Drive and want automated, AI-enhanced captions for Instagram to maintain a steady posting rhythm. Avoid it for one-off videos or if you require custom caption styles beyond Submagic's defaults, as manual tweaks might be needed. Common variations include swapping Postiz for direct YouTube uploads or integrating additional AI prompts via OpenAI for personalised caption tones.

About this workflow

Submagic + Autopost. Uses googleDriveTrigger, httpRequest, googleSheets, lmChatOpenAi. Event-driven trigger; 21 nodes.

Source: https://github.com/ScraperNode/awesome-n8n-templates/blob/main/templates/ai-and-llm/7992-auto-caption-post-videos-to-instagram-tiktok-with-submagic-postiz-openai/workflow.json — 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

This comprehensive n8n workflow automates the entire Meta (Facebook/Instagram) advertising process, from asset analysis to ad creation. It combines AI-powered content analysis with automated ad deploy

Facebook Graph Api, HTTP Request, Google Drive +5
AI & RAG

Drop an image into Google Drive and let this workflow handle the rest: it auto-cleans and enhances the image with Google’s Nano Banana (via Wavespeed API), generates a catchy caption with GPT-5, and p

Google Drive Trigger, HTTP Request, Google Sheets +2
AI & RAG

Automatically detects when a new receipt is uploaded to Google Drive. Extracts text from the receipt using OCR. Uses an AI Agent to analyze the extracted data and structure it (e.g., vendor, date, tot

Google Drive Trigger, HTTP Request, Mistral Ai +4
AI & RAG

K&S-Media Downloadliste SQL. Uses httpRequest, agent, googleSheets, lmChatOpenAi. Event-driven trigger; 97 nodes.

HTTP Request, Agent, Google Sheets +3
AI & RAG

🎯 Create viral TikToks, Shorts, Reels, podcasts, and ASMR videos in minutes — all on autopilot.

OpenAI, HTTP Request, Form Trigger +7