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": "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
}
]
]
}
}
}
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 →