This workflow corresponds to n8n.io template #12755 — we link there as the canonical source.
This workflow follows the Gmail → Google Drive 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 →
{
"id": "BlsAiz7wRMow8Bgt",
"name": "Social Media Post & Caption Generator with Approval Loop",
"tags": [],
"nodes": [
{
"id": "a3b97c74-633e-4b41-aff8-31d5b982934e",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-112,
0
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 10
}
]
}
},
"typeVersion": 1.3
},
{
"id": "cdbbf945-5a65-43b6-9523-300010ddcafa",
"name": "Search files and folders",
"type": "n8n-nodes-base.googleDrive",
"position": [
208,
0
],
"parameters": {
"filter": {
"folderId": {
"__rl": true,
"mode": "list",
"value": "1Xs6aYQZwB4uBO9Fxxjf0bM6fx_9OYWXi",
"cachedResultUrl": "https://drive.google.com/drive/folders/REPLACE_WITH_YOUR_FOLDER_ID",
"cachedResultName": "n8n Folder 2"
}
},
"options": {},
"resource": "fileFolder",
"returnAll": true
},
"typeVersion": 3
},
{
"id": "ebf94bd1-95c1-47d0-9bda-e452a248d42d",
"name": "If",
"type": "n8n-nodes-base.if",
"position": [
1184,
0
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "19235ed8-1738-4c56-bec2-10da3c5c91b3",
"operator": {
"type": "boolean",
"operation": "equals"
},
"leftValue": "={{ $json.data.approved }}",
"rightValue": true
}
]
}
},
"typeVersion": 2.3
},
{
"id": "f9312cb6-0b30-4ae3-a6de-9dbbb0744abc",
"name": "Upload media",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
1680,
-16
],
"parameters": {
"resource": "media",
"useBinaryData": true
},
"typeVersion": 2
},
{
"id": "2c47ed7a-bf26-4818-aee1-a38812c40ade",
"name": "Create post",
"type": "@blotato/n8n-nodes-blotato.blotato",
"position": [
1888,
-16
],
"parameters": {
"options": {},
"accountId": {
"__rl": true,
"mode": "list",
"value": "ID",
"cachedResultUrl": "Redacted",
"cachedResultName": "Redacted"
},
"postContentText": "={{ $('Caption Generator AI').item.json.output[0].content[0].text }}",
"postContentMediaUrls": "={{ $json.url }}"
},
"typeVersion": 2
},
{
"id": "ac0a4ffd-8a3b-47c5-ab7a-18d2d7cb0576",
"name": "Randomizer",
"type": "n8n-nodes-base.code",
"position": [
416,
0
],
"parameters": {
"jsCode": "// Get all input items\nconst items = $input.all();\n\n// Check if there are any items\nif (items.length === 0) {\n return [];\n}\n\n// Select a random item\nconst randomIndex = Math.floor(Math.random() * items.length);\nconst randomItem = items[randomIndex];\n\n// Return the random file with its data\nreturn [randomItem];"
},
"typeVersion": 2
},
{
"id": "4f57cc2e-11ca-4b1a-acb0-134ce6963b7a",
"name": "Caption Generator AI",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
624,
0
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini",
"cachedResultName": "GPT-4.1-MINI"
},
"options": {},
"responses": {
"values": [
{
"content": "=File name:{{ $json.name }}\nCreate an effective caption for a social media post (Instagram) that goes along with the post."
},
{
"role": "system",
"content": "=You are a social media (Instagram) Caption specialist. Your job is to come up with an effective caption based on the title/file name which will be descriptive of the photo."
}
]
},
"builtInTools": {}
},
"typeVersion": 2.1
},
{
"id": "2f5c7a16-e9ef-48e8-b69a-69fd21ccaf3b",
"name": "Send For Approval and Wait",
"type": "n8n-nodes-base.gmail",
"position": [
976,
0
],
"parameters": {
"sendTo": "REPLACE_WITH_YOUR_EMAIL",
"message": "=Content File: https://drive.google.com/file/d/{{ $('Randomizer').item.json.id }}/view\nCaption: {{ $json.output[0].content[0].text }}",
"options": {},
"subject": "Social Media Post for Approval",
"operation": "sendAndWait",
"approvalOptions": {
"values": {
"approvalType": "double"
}
}
},
"typeVersion": 2.2
},
{
"id": "7e2a7fdd-2736-421a-98fc-93808db70a78",
"name": "Download Content File",
"type": "n8n-nodes-base.googleDrive",
"position": [
1472,
-16
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Randomizer').item.json.id }}"
},
"options": {},
"operation": "download"
},
"typeVersion": 3
},
{
"id": "e446bba8-96b8-4d91-b456-613c0dc783d4",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-320,
-272
],
"parameters": {
"width": 416,
"height": 768,
"content": "Scheduled Event Trigger"
},
"typeVersion": 1
},
{
"id": "69c44474-74c6-43c7-9c21-5251b82c1de1",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
112,
-272
],
"parameters": {
"color": 4,
"width": 464,
"height": 768,
"content": "Search File + Randomizer"
},
"typeVersion": 1
},
{
"id": "0368ea52-6234-4357-8821-acf725128960",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
592,
-272
],
"parameters": {
"color": 2,
"width": 784,
"height": 768,
"content": "Caption Generator & Email Approval"
},
"typeVersion": 1
},
{
"id": "9ce986d8-793f-4a7d-8e2a-1eac979ccb31",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1392,
-272
],
"parameters": {
"color": 5,
"width": 704,
"height": 768,
"content": "Upload to Social MEdia"
},
"typeVersion": 1
},
{
"id": "5815be84-0b6a-411e-b407-25e3cd3f9c80",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1408,
-432
],
"parameters": {
"width": 976,
"height": 1488,
"content": "Social Media Post & Caption Generator (Google Drive \u2192 AI Caption \u2192 Approval \u2192 Auto-Post)\n\nAutomatically turn your existing content library into approved, AI-written social media posts.\nThis workflow selects a random file from Google Drive, generates an Instagram caption using AI, sends it to you for approval, and\u2014once approved\u2014uploads and publishes the post via Blotato.\n\n\ud83c\udfa5 Watch Step-By-Step Guide:\nhttps://youtu.be/9XU9ECcj9dg\n\nWhat this template does\n\nOn a scheduled basis (default: 10:00 AM), this workflow:\nSearches a specified Google Drive folder for content files\nRandomly selects one file to avoid repetitive posting\nUses AI to generate an Instagram-ready caption based on the file name\nSends the caption + file link to you via email for approval\n\nIf approved:\nDownloads the file from Drive\nUploads the media to Blotato\nCreates and publishes the social media post\n\nIf rejected:\nAutomatically loops back and selects a different random file\n\nWhy it\u2019s useful\nKeeps your social media consistent with minimal manual effort\nAdds a human-in-the-loop approval step for quality control\nEliminates the need to manually write captions or pick content\nIdeal for creators, solo marketers, and small teams managing content at scale\n\nRequirements\nBefore using this template, connect the following credentials in n8n:\nGoogle Drive OAuth (searching & downloading files)\nOpenAI API (caption generation)\nGmail OAuth (approval email workflow)\nBlotato API (media upload & social posting)\n\nAll credentials must be added manually after importing the template.\nNo sensitive data is included in the template.\nHow it works (Node overview)\nSchedule Trigger\nRuns the workflow at a fixed time each day.\nGoogle Drive \u2013 Search Files and Folders\nFetches all files from a specified Drive folder.\nRandomizer (Code Node)\nSelects a random file from the available list to ensure content variety.\nCaption Generator AI\nUses an AI model to generate a descriptive Instagram caption based on the file name.\nGmail \u2013 Send for Approval and Wait\nEmails the generated caption and file link to you and pauses execution until approval or rejection.\nIF (Approved)\nYes: proceeds to download, upload, and publish\nNo: loops back to select another random file\nGoogle Drive \u2013 Download File\nDownloads the approved content file.\nBlotato \u2013 Upload Media & Create Post\nUploads the media and publishes the post to the connected social account.\n\nSetup instructions\n\nImport the template into your n8n workspace\nOpen the Google Drive nodes and connect your Drive OAuth credential\nReplace the Folder ID with your own content folder\nConnect your OpenAI credential in the Caption Generator node\nConnect Gmail OAuth and set your approval email address\nConnect your Blotato account and select the target social profile\nRun the workflow once to test the approval loop\nActivate the workflow to start automated posting\n\nTroubleshooting\n\nNo files found: confirm the Google Drive folder ID and permissions\nApproval email not received: check Gmail OAuth scopes and spam folder\nCaption quality not ideal: refine the AI system prompt\nUpload fails: confirm Blotato account permissions and social account connection"
},
"typeVersion": 1
},
{
"id": "0cf30e12-68f8-4f78-a253-3483a6445a40",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-320,
-848
],
"parameters": {
"width": 720,
"height": 544,
"content": "@[youtube](9XU9ECcj9dg)"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"availableInMCP": false,
"executionOrder": "v1"
},
"versionId": "c1b6212a-1317-435d-865a-0aa2821aa38b",
"connections": {
"If": {
"main": [
[
{
"node": "Download Content File",
"type": "main",
"index": 0
}
],
[
{
"node": "Search files and folders",
"type": "main",
"index": 0
}
]
]
},
"Randomizer": {
"main": [
[
{
"node": "Caption Generator AI",
"type": "main",
"index": 0
}
]
]
},
"Upload media": {
"main": [
[
{
"node": "Create post",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "Search files and folders",
"type": "main",
"index": 0
}
]
]
},
"Caption Generator AI": {
"main": [
[
{
"node": "Send For Approval and Wait",
"type": "main",
"index": 0
}
]
]
},
"Download Content File": {
"main": [
[
{
"node": "Upload media",
"type": "main",
"index": 0
}
]
]
},
"Search files and folders": {
"main": [
[
{
"node": "Randomizer",
"type": "main",
"index": 0
}
]
]
},
"Send For Approval and Wait": {
"main": [
[
{
"node": "If",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Automatically turn your existing content library into approved, AI-written social media posts. This workflow selects a random file from Google Drive, generates an Instagram caption using AI, sends it to you for approval, and—once approved—uploads and publishes the post via…
Source: https://n8n.io/workflows/12755/ — 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.
Google Drive → AI Video Generation → Captions → Approval → Instagram & TikTok
💥 Automate YouTube thumbnail creation from video links -vide. Uses telegramTrigger, httpRequest, googleDrive, gmail. Event-driven trigger; 25 nodes.
💥 Automate YouTube thumbnail creation from video links -vide. Uses telegramTrigger, httpRequest, googleDrive, gmail. Event-driven trigger; 25 nodes.
This n8n automation turns any RSS feed into a spoken podcast episode, using OpenAI for summarization and ElevenLabs for voice generation. The final audio is then sent straight to your Telegram for ins
Personalized Outreach & Follow-Up - Phase 2. Uses googleSheets, openAi, gmail, gmailTrigger. Scheduled trigger; 59 nodes.