This workflow follows the Executecommand → HTTP Request 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": "CvXjXG4SFnN0ioJQ",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "AutoQoutesV2_template",
"tags": [],
"nodes": [
{
"id": "2ff58bb4-7079-44fe-a2ac-b4af9fa5b30e",
"name": "When clicking \u2018Test workflow\u2019",
"type": "n8n-nodes-base.manualTrigger",
"position": [
300,
0
],
"parameters": {},
"typeVersion": 1
},
{
"id": "ec44d567-dfc8-4561-87df-903724225247",
"name": "Generate Image",
"type": "n8n-nodes-base.httpRequest",
"position": [
660,
0
],
"parameters": {
"url": "https://api.piapi.ai/api/v1/task",
"body": "={\n \"model\": \"Qubico/flux1-dev\",\n \"task_type\": \"txt2img\",\n \"input\": {\n \"prompt\": \"Ultra-realistic vertical nature landscape, {{ $json['Background (EN)'] }}, featuring {{ $json['Prompt (EN)'] }}, high detail, soft atmospheric lighting, cinematic golden hour glow, vertical composition, photorealistic texture, natural depth of field, calm and serene mood, no people, no buildings, HDR, 8k resolution, masterpiece\",\n \"negative_prompt\": \"taking a photo of a room, recording a video of a room, photos app, video recorder, illegible text, blurry text, low quality text, DSLR, unnatural\",\n \"width\": 540,\n \"height\": 960\n }\n}",
"method": "POST",
"options": {},
"sendBody": true,
"contentType": "raw",
"sendHeaders": true,
"rawContentType": "application/json",
"headerParameters": {
"parameters": [
{
"name": "X-API-Key",
"value": "=[Your PiAPI Key]"
}
]
}
},
"retryOnFail": false,
"typeVersion": 4.2
},
{
"id": "ad260a51-e981-47cc-8600-967c1c748814",
"name": "Get image",
"type": "n8n-nodes-base.httpRequest",
"position": [
1020,
0
],
"parameters": {
"url": "=https://api.piapi.ai/api/v1/task/{{ $json.data.task_id }}",
"options": {},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "X-API-Key",
"value": "=[Your PiAPI Key]"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "cddff673-15ce-47ec-a2d3-3d71437bfb1f",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
600,
-80
],
"parameters": {
"width": 820,
"height": 240,
"content": "## Create Image Background\nGenerate an image using prompt from Google Sheet via PiAPI Flux (Txt2img)."
},
"typeVersion": 1
},
{
"id": "64132a39-ad42-4158-9eec-5b6bfdc7bca2",
"name": "Update image background URL",
"type": "n8n-nodes-base.googleSheets",
"position": [
1240,
0
],
"parameters": {
"columns": {
"value": {
"Index": "={{ $('Get data from Google Sheet').item.json.Index }}",
"Background Image": "={{ $json.data.output.image_url }}"
},
"schema": [
{
"id": "Index",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Index",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Quote (Thai)",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Quote (Thai)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Pen Name (Thai)",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Pen Name (Thai)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Background (EN)",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Background (EN)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Prompt (EN)",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Prompt (EN)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Background Image",
"type": "string",
"display": true,
"required": false,
"displayName": "Background Image",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Background Video",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Background Video",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Video Status",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Video Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Index"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1p1iPoiu2uI3qGbHi0diS7QwsMcLuzDIqwo3AeSUVrGQ/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "1p1iPoiu2uI3qGbHi0diS7QwsMcLuzDIqwo3AeSUVrGQ"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "801dd794-4cf8-42f7-8102-a3a4853cae39",
"name": "Image-to-Video",
"type": "n8n-nodes-base.httpRequest",
"position": [
260,
280
],
"parameters": {
"url": "https://api.piapi.ai/api/v1/task",
"body": "={\n \"model\": \"kling\",\n \"task_type\": \"video_generation\",\n \"input\": {\n \"prompt\": \"Cinematic vertical video from image of {{ $('Get data from Google Sheet').item.json['Background (EN)'] }}, with {{ $('Get data from Google Sheet').item.json['Prompt (EN)'] }}, animated subtly from image, with soft light, mist, swaying trees, slow zoom effect, no people or buildings\",\n \"negative_prompt\": \"blurry motion, distorted faces, unnatural lighting, over produced, bad quality\",\n \"cfg_scale\": 0.5,\n \"duration\": 5,\n \"mode\": \"std\",\n \"image_url\": \"{{ $('Get image').item.json.data.output.image_url }}\",\n \"version\": \"1.0\",\n \"camera_control\": {\n \"type\": \"simple\",\n \"config\": {\n \"horizontal\": 0,\n \"vertical\": 0,\n \"pan\": 0,\n \"tilt\": 0,\n \"roll\": 0,\n \"zoom\": 5\n }\n }\n }\n}",
"method": "POST",
"options": {},
"sendBody": true,
"contentType": "raw",
"sendHeaders": true,
"rawContentType": "application/json",
"headerParameters": {
"parameters": [
{
"name": "X-API-Key",
"value": "=[Your PiAPI Key]"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "6f7d755f-73fb-474f-a2c4-4612317c4f5a",
"name": "Wait image 2 min",
"type": "n8n-nodes-base.wait",
"position": [
840,
0
],
"parameters": {
"unit": "minutes",
"amount": 2
},
"typeVersion": 1.1
},
{
"id": "d8de3a95-1a5b-4495-9a1f-8178c1be3d44",
"name": "Wait video 5 min",
"type": "n8n-nodes-base.wait",
"position": [
440,
280
],
"parameters": {
"unit": "minutes"
},
"typeVersion": 1.1
},
{
"id": "c3f97a19-9ea8-4489-8629-767542f0fddb",
"name": "Get Video",
"type": "n8n-nodes-base.httpRequest",
"position": [
620,
280
],
"parameters": {
"url": "=https://api.piapi.ai/api/v1/task/{{ $json.data.task_id }}",
"options": {},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "X-API-Key",
"value": "=[Your PiAPI Key]"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "eefa224d-2e3d-459e-a16d-8e2584b59cf0",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
240,
200
],
"parameters": {
"color": 3,
"width": 1180,
"height": 240,
"content": "## Create Video Background\nCreate a cinematic vertical video from the generated image using PiAPI Kling."
},
"typeVersion": 1
},
{
"id": "8d2035a8-d4a0-4a33-bae3-c18b530487d4",
"name": "Generate Audio",
"type": "n8n-nodes-base.httpRequest",
"position": [
380,
560
],
"parameters": {
"url": "https://api.elevenlabs.io/v1/sound-generation",
"method": "POST",
"options": {},
"sendBody": true,
"sendHeaders": true,
"bodyParameters": {
"parameters": [
{
"name": "text",
"value": "={\n \"text\": \"no voice, A peaceful soundscape unfolds as the sun begins to rise over misty {{ $('Get data from Google Sheet').item.json['Background (EN)'] }}, casting warm light across the scene. The crisp morning air is filled with ambient nature sounds like {{ $('Get data from Google Sheet').item.json['Prompt (EN)'] }} along with soft lofi beats, blending into a calm and immersive atmosphere.\",\n \"duration_seconds\": 5,\n \"model_id\": \"sound-effects-v1\",\n \"output_format\": \"mp3\"\n}\n"
},
{
"name": "duration_seconds",
"value": "20"
}
]
},
"headerParameters": {
"parameters": [
{
"name": "xi-api-key",
"value": "[Your ElevenLab Key]"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "66af781a-2012-426e-a623-e90e21e8b2a1",
"name": "Get data from Google Sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
480,
0
],
"parameters": {
"options": {
"returnFirstMatch": true
},
"filtersUI": {
"values": [
{
"lookupColumn": "Video Status"
}
]
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1p1iPoiu2uI3qGbHi0diS7QwsMcLuzDIqwo3AeSUVrGQ/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "1p1iPoiu2uI3qGbHi0diS7QwsMcLuzDIqwo3AeSUVrGQ"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "04074118-9f30-4648-8aab-9574156a76ba",
"name": "Update Sound background URL",
"type": "n8n-nodes-base.googleSheets",
"position": [
1220,
480
],
"parameters": {
"columns": {
"value": {
"Index": "={{ $('Get data from Google Sheet').item.json.Index }}",
"Music Background": "={{ $json.webContentLink }}"
},
"schema": [
{
"id": "Index",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Index",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Quote (Thai)",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Quote (Thai)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Pen Name (Thai)",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Pen Name (Thai)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Background (EN)",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Background (EN)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Prompt (EN)",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Prompt (EN)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Background Image",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Background Image",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Background Video",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Background Video",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Music Background",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Music Background",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Video Status",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Video Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Index"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1p1iPoiu2uI3qGbHi0diS7QwsMcLuzDIqwo3AeSUVrGQ/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "1p1iPoiu2uI3qGbHi0diS7QwsMcLuzDIqwo3AeSUVrGQ"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "35ca939b-fb27-48cf-8036-f35618ceaee0",
"name": "Update video background URL",
"type": "n8n-nodes-base.googleSheets",
"position": [
1240,
280
],
"parameters": {
"columns": {
"value": {
"Index": "={{ $('Get data from Google Sheet').item.json.Index }}",
"Background Video": "={{ $json.data.output.video_url }}"
},
"schema": [
{
"id": "Index",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Index",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Quote (Thai)",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Quote (Thai)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Pen Name (Thai)",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Pen Name (Thai)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Background (EN)",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Background (EN)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Prompt (EN)",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Prompt (EN)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Background Image",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Background Image",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Background Video",
"type": "string",
"display": true,
"required": false,
"displayName": "Background Video",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Video Status",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Video Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Index"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1p1iPoiu2uI3qGbHi0diS7QwsMcLuzDIqwo3AeSUVrGQ/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "1p1iPoiu2uI3qGbHi0diS7QwsMcLuzDIqwo3AeSUVrGQ"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "54c8badf-a99a-4e5c-ad96-e1d982eb6855",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
240,
480
],
"parameters": {
"color": 4,
"width": 1180,
"height": 240,
"content": "## Create Sound Background\nGenerate ambient sound using ElevenLabs based on the scene prompt."
},
"typeVersion": 1
},
{
"id": "15b9e2b1-72d9-42bf-a8a4-0ad0a01c5e5f",
"name": "Upload Sound to Google Drive",
"type": "n8n-nodes-base.googleDrive",
"position": [
780,
480
],
"parameters": {
"name": "={{ $('Get data from Google Sheet').item.json['Background (EN)'] }}.mp3",
"driveId": {
"__rl": true,
"mode": "id",
"value": "1Sfv2PvIHF0J3-5IOYFdZp2-4LNPOoSX1"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "root",
"cachedResultName": "/ (Root folder)"
}
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3,
"alwaysOutputData": true
},
{
"id": "2a628e8a-077a-4999-9ef7-8d28ac4433ac",
"name": "Save Video Background Locally1",
"type": "n8n-nodes-base.readWriteFile",
"position": [
1040,
280
],
"parameters": {
"options": {},
"fileName": "=VideoBackground.mp4",
"operation": "write"
},
"typeVersion": 1
},
{
"id": "fa5cce8d-4b50-4221-9446-050f497b30a9",
"name": "Get Binary Video Background",
"type": "n8n-nodes-base.httpRequest",
"position": [
820,
280
],
"parameters": {
"url": "={{ $json.data.output.video_url }}",
"options": {
"response": {
"response": {
"responseFormat": "file"
}
}
}
},
"typeVersion": 4.2
},
{
"id": "ea003577-5467-4acb-a33b-b4b30a03a35f",
"name": "Save Music Background Locally1",
"type": "n8n-nodes-base.readWriteFile",
"position": [
980,
560
],
"parameters": {
"options": {
"append": false
},
"fileName": "=SoundBackground.mp3",
"operation": "write"
},
"typeVersion": 1
},
{
"id": "b9332740-c4e0-40f9-bc0d-c550c8f0f96d",
"name": "Prepare Overlay Text (Quote & Author)1",
"type": "n8n-nodes-base.code",
"position": [
300,
860
],
"parameters": {
"jsCode": "// Define separate configuration for the quote and the author\nconst quoteFont = \"Kanit-Italic.ttf\"; \nconst quoteFontSize = 70;\nconst authorFont = \"Kanit-Italic.ttf\"; \nconst authorFontSize = 50;\nconst fontColor = \"white\";\nconst lineHeightMultiplier = 1.1;\nconst videoWidth = 1080;\nconst margin = 40; \n\n// Effective width for the quote text\nconst effectiveVideoWidth = videoWidth - 2 * margin;\n\n// Estimate average character width based on quoteFontSize\nconst avgCharWidth = quoteFontSize * 0.6;\nconst maxCharsPerLine = Math.floor(effectiveVideoWidth / avgCharWidth);\n\n// Retrieve the quote and author from \"Select Random Video, Music & Quote\"\nconst transcript = $('Get data from Google Sheet').first().json['Quote (Thai)'];\nif (!transcript) {\n throw new Error(\"Quote not found\");\n}\n\nconst author = $('Get data from Google Sheet').first().json['Pen Name (Thai)'];\nif (!author) {\n throw new Error(\"Author not found\");\n}\n\n// Split transcript into words and group them into lines\nconst words = transcript.split(' ');\nconst lines = [];\nlet currentLine = \"\";\nlet currentCharCount = 0;\n\nwords.forEach(word => {\n const wordLength = word.length;\n const additionalSpace = currentLine ? 1 : 0;\n const potentialLength = currentCharCount + additionalSpace + wordLength;\n if (potentialLength <= maxCharsPerLine) {\n currentLine += (currentLine ? \" \" : \"\") + word;\n currentCharCount = potentialLength;\n } else {\n lines.push(currentLine);\n currentLine = word;\n currentCharCount = wordLength;\n }\n});\nif (currentLine) {\n lines.push(currentLine);\n}\n\n// Calculate layout for the quote block\nconst lineHeight = quoteFontSize * lineHeightMultiplier;\nconst totalHeight = lines.length * lineHeight;\n\n// Build drawtext commands for quote lines\nconst quoteCommands = lines.map((line, index) => {\n const escapedLine = line.replace(/'/g, \"\\\\'\");\n return `drawtext=fontfile=${quoteFont}:text='${escapedLine}':fontsize=${quoteFontSize}:fontcolor=${fontColor}:x=(w-text_w)/2:y=((h-${totalHeight})/2)+(${index}*${lineHeight})`;\n});\n\n// Build the drawtext command for author\nconst authorY = `((h-${totalHeight})/2)+(${lines.length}*${lineHeight})+20`;\nconst escapedAuthor = author.replace(/'/g, \"\\\\'\");\nconst authorCommand = `drawtext=fontfile=${authorFont}:text='${escapedAuthor}':fontsize=${authorFontSize}:fontcolor=${fontColor}:x=w-text_w-${margin}:y=${authorY}`;\n\n// Combine all commands into one drawtext filter string\nconst fullDrawTextFilter = quoteCommands.concat(authorCommand).join(\", \");\n\n// Return the prepared filter string\nreturn {\n json: {\n drawText: fullDrawTextFilter\n }\n};"
},
"typeVersion": 2
},
{
"id": "79764093-f6ca-459b-a73c-3326fe82fafa",
"name": "Generate Final Video Clip1",
"type": "n8n-nodes-base.executeCommand",
"position": [
480,
860
],
"parameters": {
"command": "=ffmpeg -i {{ $('Save Video Background Locally1').item.json.fileName }} -i {{ $('Save Music Background Locally1').item.json.fileName }} -filter_complex \"[0:v]scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920[vid]; color=black@0.3:size=1080x1920:d=10[bg]; [vid][bg]overlay=shortest=1[bgvid]; [bgvid]{{ $json.drawText }}[outv]; [1:a]volume=0.8[aout]\" -map \"[outv]\" -map \"[aout]\" -aspect 9:16 -c:v libx264 -c:a aac -shortest output.mp4 -y"
},
"typeVersion": 1
},
{
"id": "3c301b6b-d6cb-41af-ac52-5722bed8470d",
"name": "Initiate YouTube Resumable Upload",
"type": "n8n-nodes-base.httpRequest",
"position": [
700,
860
],
"parameters": {
"url": "=https://www.googleapis.com/upload/youtube/v3/videos?part=snippet,status&uploadType=resumable",
"body": "={\n \"snippet\": {\n \"title\": \"{{ $('Get data from Google Sheet').item.json['Quote (Thai)'] }}\",\n \"description\": \"{{ $('Get data from Google Sheet').item.json['Quote (Thai)'] }}\\n{{ $('Get data from Google Sheet').item.json['Pen Name (Thai)'] }}\",\n \"defaultLanguage\": \"en\",\n \"defaultAudioLanguage\": \"en\"\n },\n \"status\": {\n \"privacyStatus\": \"public\",\n \"license\": \"youtube\",\n \"embeddable\": true,\n \"publicStatsViewable\": true,\n \"madeForKids\": false\n }\n}",
"method": "POST",
"options": {
"response": {
"response": {
"fullResponse": true
}
}
},
"sendBody": true,
"contentType": "raw",
"sendHeaders": true,
"authentication": "predefinedCredentialType",
"rawContentType": "RAW/JSON",
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
},
{
"name": "X-Upload-Content-Type",
"value": "video/webm"
}
]
},
"nodeCredentialType": "youTubeOAuth2Api"
},
"credentials": {
"youTubeOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "dbde06b3-e7ba-4b7e-9d58-0a06f88b5176",
"name": "Read output file",
"type": "n8n-nodes-base.readWriteFile",
"position": [
880,
860
],
"parameters": {
"options": {},
"fileSelector": "=output.mp4"
},
"typeVersion": 1
},
{
"id": "0b9b92e0-5500-4dca-a622-f63b3cdf0878",
"name": "Upload Video to YouTube",
"type": "n8n-nodes-base.httpRequest",
"position": [
1080,
860
],
"parameters": {
"url": "={{ $('Initiate YouTube Resumable Upload').item.json.headers.location }}",
"method": "PUT",
"options": {},
"sendBody": true,
"contentType": "binaryData",
"sendHeaders": true,
"authentication": "predefinedCredentialType",
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "video/webm"
}
]
},
"inputDataFieldName": "data",
"nodeCredentialType": "youTubeOAuth2Api"
},
"credentials": {
"youTubeOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "721078b6-b1e2-4077-b1ff-696cb3765675",
"name": "Update Quote Upload Status",
"type": "n8n-nodes-base.googleSheets",
"position": [
1280,
860
],
"parameters": {
"columns": {
"value": {
"Index": "={{ $('Get data from Google Sheet').item.json.Index }}",
"Video Status": "=https://www.youtube.com/watch?v={{ $json.id }}"
},
"schema": [
{
"id": "Index",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Index",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Quote (Thai)",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Quote (Thai)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Pen Name (Thai)",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Pen Name (Thai)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Background (EN)",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Background (EN)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Prompt (EN)",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Prompt (EN)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Background Image",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Background Image",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Background Video",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Background Video",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Music Background",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Music Background",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Video Status",
"type": "string",
"display": true,
"required": false,
"displayName": "Video Status",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Index"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1p1iPoiu2uI3qGbHi0diS7QwsMcLuzDIqwo3AeSUVrGQ/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "1p1iPoiu2uI3qGbHi0diS7QwsMcLuzDIqwo3AeSUVrGQ"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "8900abd9-9f35-46a3-9b59-883ff16b0764",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
660,
760
],
"parameters": {
"color": 5,
"width": 760,
"height": 300,
"content": "## Video Upload & Post-Processing\nUpload the final video to YouTube using the YouTube API and update your Google Sheets with upload statuses and YouTube links."
},
"typeVersion": 1
},
{
"id": "07cdec2c-9677-46f0-8038-641c4c191059",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
240,
-80
],
"parameters": {
"color": 6,
"width": 340,
"height": 240,
"content": "## Get Quote\nRetrieve quote data from Google Sheets including text, author, and background prompts."
},
"typeVersion": 1
},
{
"id": "aeadbc59-13d7-4755-b38d-6d4946ecfa78",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
240,
760
],
"parameters": {
"color": 6,
"width": 400,
"height": 300,
"content": "## Combine All\nMerge video, sound, and quote text into final clip using FFmpeg."
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "2c56841d-3045-4d6d-b643-0f3804bf2c3e",
"connections": {
"Get Video": {
"main": [
[
{
"node": "Get Binary Video Background",
"type": "main",
"index": 0
}
]
]
},
"Get image": {
"main": [
[
{
"node": "Update image background URL",
"type": "main",
"index": 0
}
]
]
},
"Generate Audio": {
"main": [
[
{
"node": "Upload Sound to Google Drive",
"type": "main",
"index": 0
},
{
"node": "Save Music Background Locally1",
"type": "main",
"index": 0
}
]
]
},
"Generate Image": {
"main": [
[
{
"node": "Wait image 2 min",
"type": "main",
"index": 0
}
]
]
},
"Image-to-Video": {
"main": [
[
{
"node": "Wait video 5 min",
"type": "main",
"index": 0
}
]
]
},
"Read output file": {
"main": [
[
{
"node": "Upload Video to YouTube",
"type": "main",
"index": 0
}
]
]
},
"Wait image 2 min": {
"main": [
[
{
"node": "Get image",
"type": "main",
"index": 0
}
]
]
},
"Wait video 5 min": {
"main": [
[
{
"node": "Get Video",
"type": "main",
"index": 0
}
]
]
},
"Upload Video to YouTube": {
"main": [
[
{
"node": "Update Quote Upload Status",
"type": "main",
"index": 0
}
]
]
},
"Generate Final Video Clip1": {
"main": [
[
{
"node": "Initiate YouTube Resumable Upload",
"type": "main",
"index": 0
}
]
]
},
"Get data from Google Sheet": {
"main": [
[
{
"node": "Generate Image",
"type": "main",
"index": 0
}
]
]
},
"Update Quote Upload Status": {
"main": [
[]
]
},
"Get Binary Video Background": {
"main": [
[
{
"node": "Save Video Background Locally1",
"type": "main",
"index": 0
}
]
]
},
"Update Sound background URL": {
"main": [
[]
]
},
"Update image background URL": {
"main": [
[
{
"node": "Image-to-Video",
"type": "main",
"index": 0
}
]
]
},
"Update video background URL": {
"main": [
[
{
"node": "Generate Audio",
"type": "main",
"index": 0
}
]
]
},
"Upload Sound to Google Drive": {
"main": [
[
{
"node": "Update Sound background URL",
"type": "main",
"index": 0
}
]
]
},
"Save Music Background Locally1": {
"main": [
[
{
"node": "Prepare Overlay Text (Quote & Author)1",
"type": "main",
"index": 0
}
]
]
},
"Save Video Background Locally1": {
"main": [
[
{
"node": "Update video background URL",
"type": "main",
"index": 0
}
]
]
},
"Initiate YouTube Resumable Upload": {
"main": [
[
{
"node": "Read output file",
"type": "main",
"index": 0
}
]
]
},
"When clicking \u2018Test workflow\u2019": {
"main": [
[
{
"node": "Get data from Google Sheet",
"type": "main",
"index": 0
}
]
]
},
"Prepare Overlay Text (Quote & Author)1": {
"main": [
[
{
"node": "Generate Final Video Clip1",
"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.
googleDriveOAuth2ApigoogleSheetsOAuth2ApiyouTubeOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
How this works
Generate professional quote graphics and videos effortlessly to enhance your marketing materials, saving hours of manual design work for small business owners and content creators. This workflow automates the creation of custom images from text prompts using HTTP requests to an external API, followed by converting those images into engaging videos. The key step involves updating a Google Sheets document with the resulting image and video URLs, allowing seamless organisation and sharing of assets via Google Drive integration.
Use this workflow when you need quick, on-demand visual content for social media posts or client proposals, especially if you're handling repetitive quote designs. Avoid it for complex animations requiring custom editing, as it focuses on simple templates; opt for manual tools instead. Common variations include adding email notifications for completion or integrating with scheduling apps to automate batch processing.
About this workflow
AutoQoutesV2_template. Uses manualTrigger, httpRequest, stickyNote, googleSheets. Event-driven trigger; 28 nodes.
Source: https://github.com/Zie619/n8n-workflows — 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.
AutoClip – Automatically Generate Video Clips and Upload to YouTube. Uses manualTrigger, googleSheets, googleDrive, stickyNote. Event-driven trigger; 23 nodes.
Credentials Transfer. Uses form, httpRequest, executeCommand, readWriteFile. Event-driven trigger; 22 nodes.
Image-to-3D. Uses manualTrigger, httpRequest, scheduleTrigger, stickyNote. Event-driven trigger; 17 nodes.
Convert image from jpg/png to webp. Uses manualTrigger, googleSheets, httpRequest, googleDrive. Event-driven trigger; 12 nodes.
OCR receipts from Google Drive. Uses manualTrigger, stickyNote, httpRequest, googleDriveTrigger. Event-driven trigger; 10 nodes.