This workflow corresponds to n8n.io template #15440 — we link there as the canonical source.
This workflow follows the Agent → 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 →
{
"meta": {
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "4495b943-04f0-4479-a760-733b8ae5e70a",
"name": "Overview",
"type": "n8n-nodes-base.stickyNote",
"position": [
-4320,
-352
],
"parameters": {
"color": 4,
"width": 588,
"height": 1216,
"content": "## YouTube Content Recycler \u2014 Weekly Auto-Pipeline \u2014 WayinVideo Summarization + AI Clipping + GPT-4o-mini + Drive + Sheets\n\nFor content creators, social media managers, and agencies who have a library of old YouTube videos and want to automatically repurpose them into short-form content every week. Every Monday at 9AM this workflow reads pending video URLs from your Google Sheet, runs each through two WayinVideo APIs sequentially \u2014 first Summarization for structured highlights and tags, then AI Clipping for the top 3 viral clips with 9:16 reframe and animated captions \u2014 then uses GPT-4o-mini to write platform-specific captions for TikTok, Facebook, and LinkedIn. Each clip is downloaded from WayinVideo and uploaded to Google Drive before the export link expires. All captions and Drive links are saved to a Content Calendar sheet. The Video List row is marked as Processed.\n\n## How it works\n- **1. Schedule \u2014 Every Monday 9AM** triggers the pipeline automatically each week\n- **2. Google Sheets \u2014 Read Pending Videos** reads all rows from the Video List tab\n- **3\u20136. WayinVideo Summarization** submits the URL, waits 90 seconds, polls until SUCCEEDED, extracts summary, highlights, and tags\n- **7\u20138. Summary Retry Loop** retries every 30 seconds if not ready\n- **8. Code \u2014 Store Summary Data** saves summary data and passes the video URL forward\n- **9\u201312. WayinVideo AI Clipping** submits the same URL for AI clipping with 9:16 reframe, animated captions, 30\u201360 second clips, HD 720, limit 3\n- **12\u201313. Clips Retry Loop** retries every 30 seconds if clips not ready\n- **14. Code \u2014 Extract Clips Array** splits the clips into one item per clip with timestamps and export link\n- **15. AI Agent \u2014 Write Platform Captions** uses GPT-4o-mini to write TikTok (max 150 chars), Facebook (100\u2013200 words), and LinkedIn (150\u2013250 words) captions\n- **17. Code \u2014 Parse Caption Output** extracts all 4 caption sections via regex\n- **18. HTTP \u2014 Download Clip File** downloads the .mp4 before the WayinVideo export link expires\n- **19. Google Drive \u2014 Upload Clip** uploads each clip to your Drive folder with structured filename\n- **20. Google Sheets \u2014 Save to Content Calendar** appends 16 columns including Drive link and all captions\n- **21. Google Sheets \u2014 Mark Video as Processed** updates the Video List row with Processed status\n\n## Set up steps\n1. In **3**, **5**, **9**, and **11** \u2014 replace YOUR_WAYINVIDEO_API_KEY\n2. In **16. OpenAI \u2014 GPT-4o-mini Model** \u2014 connect your OpenAI credential\n3. In **2** and **21** \u2014 connect Google Sheets OAuth2 and replace YOUR_VIDEO_LIST_SHEET_ID\n4. In **20** \u2014 connect Google Sheets OAuth2 and replace YOUR_CONTENT_CALENDAR_SHEET_ID\n5. In **19** \u2014 connect Google Drive OAuth2 and replace YOUR_GOOGLE_DRIVE_FOLDER_ID\n6. Create Video List sheet tab with columns: Video URL, Video Title, Niche / Category, Status, Last Processed Date\n7. Create Content Calendar sheet tab with columns: Video URL, Video Title, Niche, Video Summary, Clip Number, Clip Title, Clip Score, Clip Timestamp, WayinVideo Export Link, Google Drive Link, TikTok Caption, Facebook Caption, LinkedIn Caption, Hashtags, Processed On, Status"
},
"typeVersion": 1
},
{
"id": "94bd05cf-4426-43d9-bddc-b259a219fd6b",
"name": "Section \u2014 Schedule and Sheet Read",
"type": "n8n-nodes-base.stickyNote",
"position": [
-3648,
0
],
"parameters": {
"color": 5,
"width": 500,
"height": 404,
"content": "## Schedule and Sheet Read\nTriggers every Monday at 9AM. Reads all unprocessed video URLs from the Video List tab in Google Sheets."
},
"typeVersion": 1
},
{
"id": "d50d9d88-b80d-4815-8d70-67959d7c4664",
"name": "Section \u2014 WayinVideo Summarization Submit, Poll, and Retry Loop",
"type": "n8n-nodes-base.stickyNote",
"position": [
-3088,
-32
],
"parameters": {
"color": 6,
"width": 1172,
"height": 580,
"content": "## WayinVideo Summarization \u2014 Submit, Poll, and Retry Loop\nSubmits the video URL to the Summarization API. Waits 90 seconds. Polls until SUCCEEDED. Retries every 30 seconds. Extracts summary text, highlights joined with pipe separator, and comma-separated tags."
},
"typeVersion": 1
},
{
"id": "9931c538-2238-4866-bc50-5ad5cd58d096",
"name": "Section \u2014 WayinVideo AI Clipping Submit, Poll, and Retry Loop",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1888,
-16
],
"parameters": {
"color": 6,
"width": 948,
"height": 548,
"content": "## WayinVideo AI Clipping \u2014 Submit, Poll, and Retry Loop\nSubmits the same video URL to the AI Clipping API \u2014 30\u201360 second clips, 9:16 reframe, animated captions, HD 720, limit 3. Waits 90 seconds. Polls until SUCCEEDED. Retries every 30 seconds."
},
"typeVersion": 1
},
{
"id": "38d7ce39-ebac-4c60-a660-96bbd75af86a",
"name": "Section \u2014 Clip Extraction and AI Platform Caption Writing",
"type": "n8n-nodes-base.stickyNote",
"position": [
-896,
-64
],
"parameters": {
"color": 6,
"width": 596,
"height": 596,
"content": "## Clip Extraction and AI Platform Caption Writing\nSplits clips into one item each. GPT-4o-mini writes TikTok (max 150 chars), Facebook (100\u2013200 words), and LinkedIn (150\u2013250 words) captions with platform-specific rules per clip."
},
"typeVersion": 1
},
{
"id": "38774283-2c7e-40c8-9c04-0c37d10e2e6c",
"name": "Section \u2014 Caption Parse, Download, Drive Upload, Calendar Log, and Mark Processed",
"type": "n8n-nodes-base.stickyNote",
"position": [
-256,
-16
],
"parameters": {
"color": 4,
"width": 1188,
"height": 372,
"content": "## Caption Parse, Download, Drive Upload, Calendar Log, and Mark Processed\nExtracts captions via regex. Downloads .mp4 before export link expires. Uploads to Google Drive. Logs 16 fields to Content Calendar. Marks video as Processed in Video List."
},
"typeVersion": 1
},
{
"id": "55578516-e34b-441a-8e01-9afa2d683376",
"name": "1. Schedule \u2014 Every Monday 9AM",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-3600,
112
],
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 9 * * 1"
}
]
}
},
"typeVersion": 1.2
},
{
"id": "bb0bd4bd-452d-481f-bff6-d7dcf271d28f",
"name": "2. Google Sheets \u2014 Read Pending Videos",
"type": "n8n-nodes-base.googleSheets",
"position": [
-3312,
112
],
"parameters": {
"operation": "getAll",
"documentId": {
"__rl": true,
"mode": "id",
"value": "YOUR_VIDEO_LIST_SHEET_ID"
}
},
"typeVersion": 4.5
},
{
"id": "0f3bcd5e-bdbb-4041-a79c-e4091bcee2ea",
"name": "3. WayinVideo \u2014 Submit Summarization",
"type": "n8n-nodes-base.httpRequest",
"position": [
-3040,
112
],
"parameters": {
"url": "https://wayinvideo-api.wayin.ai/api/v2/summaries",
"method": "POST",
"options": {},
"jsonBody": "={\n \"video_url\": \"{{ $json['Video URL'] }}\",\n \"target_lang\": \"en\"\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer YOUR_TOKEN_HERE"
},
{
"name": "x-wayinvideo-api-version",
"value": "v2"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "a563f4d9-d7bf-4592-833f-5c6a87cfca76",
"name": "4. Wait \u2014 90 Seconds Summary",
"type": "n8n-nodes-base.wait",
"position": [
-2800,
112
],
"parameters": {
"amount": 90
},
"typeVersion": 1.1
},
{
"id": "c4ef2fb6-dfe4-4910-94c3-39a60417f7df",
"name": "5. WayinVideo \u2014 Get Summary Results",
"type": "n8n-nodes-base.httpRequest",
"position": [
-2560,
112
],
"parameters": {
"url": "=https://wayinvideo-api.wayin.ai/api/v2/summaries/results/{{ $('3. WayinVideo \u2014 Submit Summarization').item.json.data.id }}",
"options": {},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer YOUR_TOKEN_HERE"
},
{
"name": "x-wayinvideo-api-version",
"value": "v2"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "2795ceb1-4f35-4b78-92e1-3a3f87a5e6f1",
"name": "6. IF \u2014 Summary Complete?",
"type": "n8n-nodes-base.if",
"position": [
-2320,
112
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "summary-status",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.data.status }}",
"rightValue": "SUCCEEDED"
}
]
}
},
"typeVersion": 2.3
},
{
"id": "15a97da7-5008-444e-ab5f-502547f53859",
"name": "7. Wait \u2014 30 Seconds Summary Retry",
"type": "n8n-nodes-base.wait",
"position": [
-2320,
320
],
"parameters": {
"amount": 30
},
"typeVersion": 1.1
},
{
"id": "212192dd-51bc-4d71-897e-09a4e5f3da43",
"name": "8. Code \u2014 Store Summary Data",
"type": "n8n-nodes-base.code",
"position": [
-2080,
96
],
"parameters": {
"jsCode": "// Extract and store summary data + pass video URL forward\nconst summaryData = $('5. WayinVideo \u2014 Get Summary Results').item.json.data;\nconst videoUrl = $('2. Google Sheets \u2014 Read Pending Videos').item.json['Video URL'];\nconst videoTitle = $('2. Google Sheets \u2014 Read Pending Videos').item.json['Video Title'];\nconst niche = $('2. Google Sheets \u2014 Read Pending Videos').item.json['Niche / Category'] || 'General';\n\n// Extract summary fields\nconst summary = summaryData.summary || '';\nconst highlights = Array.isArray(summaryData.highlights)\n ? summaryData.highlights.map(h => h.desc).join(' | ')\n : '';\nconst tags = Array.isArray(summaryData.tags)\n ? summaryData.tags.join(', ')\n : '';\n\nreturn [{\n json: {\n videoUrl,\n videoTitle,\n niche,\n summary,\n highlights,\n tags\n }\n}];"
},
"typeVersion": 2
},
{
"id": "8797febb-e661-41e1-a8ba-f8f7df61c8c4",
"name": "9. WayinVideo \u2014 Submit AI Clipping",
"type": "n8n-nodes-base.httpRequest",
"position": [
-1840,
112
],
"parameters": {
"url": "https://wayinvideo-api.wayin.ai/api/v2/clips",
"method": "POST",
"options": {},
"jsonBody": "={\n \"video_url\": \"{{ $json.videoUrl }}\",\n \"project_name\": \"Recycler \u2014 {{ $json.videoTitle }}\",\n \"target_duration\": \"DURATION_30_60\",\n \"limit\": 3,\n \"enable_export\": true,\n \"resolution\": \"HD_720\",\n \"enable_caption\": true,\n \"caption_display\": \"original\",\n \"cc_style_tpl\": \"temp-7\",\n \"enable_ai_reframe\": true,\n \"ratio\": \"RATIO_9_16\",\n \"target_lang\": \"en\"\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer YOUR_TOKEN_HERE"
},
{
"name": "x-wayinvideo-api-version",
"value": "v2"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "98378204-9985-4f08-9f78-48b54a73483d",
"name": "10. Wait \u2014 90 Seconds Clips",
"type": "n8n-nodes-base.wait",
"position": [
-1600,
112
],
"parameters": {
"amount": 90
},
"typeVersion": 1.1
},
{
"id": "be370126-3c4d-447e-8eda-505ecec61cd5",
"name": "11. WayinVideo \u2014 Get Clip Results",
"type": "n8n-nodes-base.httpRequest",
"position": [
-1360,
112
],
"parameters": {
"url": "=https://wayinvideo-api.wayin.ai/api/v2/clips/results/{{ $('9. WayinVideo \u2014 Submit AI Clipping').item.json.data.id }}",
"options": {},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer YOUR_TOKEN_HERE"
},
{
"name": "x-wayinvideo-api-version",
"value": "v2"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "58b1d6a2-bb6c-4df6-a420-85883ec94756",
"name": "12. IF \u2014 Clips Complete?",
"type": "n8n-nodes-base.if",
"position": [
-1120,
112
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "clips-status",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.data.status }}",
"rightValue": "SUCCEEDED"
}
]
}
},
"typeVersion": 2.3
},
{
"id": "7afa1124-cbf0-42e8-9a12-3fa146d82a34",
"name": "13. Wait \u2014 30 Seconds Clips Retry",
"type": "n8n-nodes-base.wait",
"position": [
-1120,
320
],
"parameters": {
"amount": 30
},
"typeVersion": 1.1
},
{
"id": "3e143531-8df8-45ed-96d1-dd201b12cb5c",
"name": "14. Code \u2014 Extract Clips Array",
"type": "n8n-nodes-base.code",
"position": [
-848,
96
],
"parameters": {
"jsCode": "// Extract clips array \u2014 split into individual items\nconst clips = $('11. WayinVideo \u2014 Get Clip Results').item.json.data?.clips || [];\n\nif (clips.length === 0) {\n throw new Error('No clips returned from WayinVideo \u2014 check if the video URL is valid.');\n}\n\n// Get stored data from summary step\nconst videoUrl = $('8. Code \u2014 Store Summary Data').item.json.videoUrl;\nconst videoTitle = $('8. Code \u2014 Store Summary Data').item.json.videoTitle;\nconst niche = $('8. Code \u2014 Store Summary Data').item.json.niche;\nconst summary = $('8. Code \u2014 Store Summary Data').item.json.summary;\nconst highlights = $('8. Code \u2014 Store Summary Data').item.json.highlights;\nconst tags = $('8. Code \u2014 Store Summary Data').item.json.tags;\n\n// Return one item per clip\nreturn clips.map((clip, index) => ({\n json: {\n clipIndex: index + 1,\n clipTitle: clip.title || `Clip ${index + 1}`,\n clipDescription: clip.desc || '',\n clipScore: clip.score || 0,\n clipTags: Array.isArray(clip.tags) ? clip.tags.join(', ') : '',\n exportLink: clip.export_link || '',\n beginMs: clip.begin_ms || 0,\n endMs: clip.end_ms || 0,\n timestampStart: `${Math.floor((clip.begin_ms || 0) / 60000)}:${String(Math.floor(((clip.begin_ms || 0) % 60000) / 1000)).padStart(2, '0')}`,\n timestampEnd: `${Math.floor((clip.end_ms || 0) / 60000)}:${String(Math.floor(((clip.end_ms || 0) % 60000) / 1000)).padStart(2, '0')}`,\n videoUrl,\n videoTitle,\n niche,\n summary,\n highlights,\n tags\n }\n}));"
},
"typeVersion": 2
},
{
"id": "6eaa1dc4-1e59-4d36-b0fc-f9d61a350c08",
"name": "15. AI Agent \u2014 Write Platform Captions",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-608,
96
],
"parameters": {
"text": "={{ $json.clipDescription }}",
"options": {
"systemMessage": "=You are an expert social media content writer who specializes in writing platform-specific captions for short-form video clips.\n\nA video has been automatically clipped from a YouTube video. Your job is to write three different captions \u2014 one for TikTok, one for Facebook, and one for LinkedIn \u2014 based on the clip information provided.\n\n---\n\n## VIDEO CONTEXT\n- Original Video Title: {{ $json.videoTitle }}\n- Niche / Category: {{ $json.niche }}\n- Video Summary: {{ $json.summary }}\n- Key Highlights: {{ $json.highlights }}\n- Video Tags: {{ $json.tags }}\n\n## THIS SPECIFIC CLIP\n- Clip Title: {{ $json.clipTitle }}\n- Clip Description: {{ $json.clipDescription }}\n- Viral Score: {{ $json.clipScore }}/100\n- Clip Tags: {{ $json.clipTags }}\n- Timestamp: {{ $json.timestampStart }} \u2014 {{ $json.timestampEnd }}\n\n---\n\n## CAPTION WRITING RULES\n\n### TikTok Caption Rules:\n- Max 150 characters \u2014 very short and punchy\n- Hook in first 3 words \u2014 make it scroll-stopping\n- Casual, fun, energetic tone\n- End with a question or statement that invites comments\n- 3-5 hashtags only \u2014 trending style\n\n### Facebook Caption Rules:\n- 100-200 words \u2014 more detailed and storytelling\n- Start with a relatable hook or question\n- Build context around why this matters\n- End with a clear CTA \u2014 ask for comments, shares, or opinions\n- 3-5 relevant hashtags at the end\n\n### LinkedIn Caption Rules:\n- 150-250 words \u2014 professional and insightful\n- Start with a bold insight or lesson from the clip\n- Share 2-3 specific takeaways in short paragraphs\n- Sound like a thought leader \u2014 not promotional\n- End with a question that sparks professional discussion\n- 3-5 professional hashtags\n\n---\n\n## OUTPUT FORMAT\nReturn in this exact structure:\n\nTIKTOK_CAPTION:\n[Write TikTok caption here \u2014 max 150 chars including hashtags]\n\nFACEBOOK_CAPTION:\n[Write Facebook caption here \u2014 100-200 words with hashtags]\n\nLINKEDIN_CAPTION:\n[Write LinkedIn caption here \u2014 150-250 words with hashtags]\n\nHASHTAGS:\n[List 5-8 universal hashtags that work across all platforms \u2014 lowercase]\n\n---\n\nNow write all three captions for this clip:"
},
"promptType": "define"
},
"typeVersion": 3.1
},
{
"id": "5624af83-5c2c-4e72-825d-70bb735b3e6f",
"name": "16. OpenAI \u2014 GPT-4o-mini Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
-608,
304
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini"
},
"options": {},
"builtInTools": {}
},
"typeVersion": 1.3
},
{
"id": "1ab9f9fc-d194-48b6-ac3f-9507fc5e1fea",
"name": "17. Code \u2014 Parse Caption Output",
"type": "n8n-nodes-base.code",
"position": [
-208,
96
],
"parameters": {
"jsCode": "// Parse AI caption output into structured fields\nconst output = $input.first().json.output || '';\n\n// Extract each platform caption\nconst tiktokMatch = output.match(/TIKTOK_CAPTION:\\s*([\\s\\S]*?)(?=\\nFACEBOOK_CAPTION:|$)/);\nconst facebookMatch = output.match(/FACEBOOK_CAPTION:\\s*([\\s\\S]*?)(?=\\nLINKEDIN_CAPTION:|$)/);\nconst linkedinMatch = output.match(/LINKEDIN_CAPTION:\\s*([\\s\\S]*?)(?=\\nHASHTAGS:|$)/);\nconst hashtagsMatch = output.match(/HASHTAGS:\\s*([\\s\\S]*)$/);\n\nconst tiktokCaption = tiktokMatch ? tiktokMatch[1].trim() : '';\nconst facebookCaption = facebookMatch ? facebookMatch[1].trim() : '';\nconst linkedinCaption = linkedinMatch ? linkedinMatch[1].trim() : '';\nconst hashtags = hashtagsMatch ? hashtagsMatch[1].trim() : '';\n\n// Get clip data\nconst clipData = $('14. Code \u2014 Extract Clips Array').item.json;\n\nreturn [{\n json: {\n tiktokCaption,\n facebookCaption,\n linkedinCaption,\n hashtags,\n clipTitle: clipData.clipTitle,\n clipDescription: clipData.clipDescription,\n clipScore: clipData.clipScore,\n exportLink: clipData.exportLink,\n timestamp: `${clipData.timestampStart} \u2014 ${clipData.timestampEnd}`,\n clipIndex: clipData.clipIndex,\n videoUrl: clipData.videoUrl,\n videoTitle: clipData.videoTitle,\n niche: clipData.niche,\n summary: clipData.summary,\n tags: clipData.tags\n }\n}];"
},
"typeVersion": 2
},
{
"id": "52adf66b-de2b-4aee-9692-7e305c9eabae",
"name": "18. HTTP \u2014 Download Clip File",
"type": "n8n-nodes-base.httpRequest",
"position": [
32,
96
],
"parameters": {
"url": "={{ $json.exportLink }}",
"options": {
"response": {
"response": {
"responseFormat": "file"
}
}
}
},
"typeVersion": 4.4
},
{
"id": "d13724b8-6503-441f-97c2-61600957a072",
"name": "19. Google Drive \u2014 Upload Clip",
"type": "n8n-nodes-base.googleDrive",
"position": [
272,
96
],
"parameters": {
"name": "={{ $('17. Code \u2014 Parse Caption Output').item.json.videoTitle }} \u2014 Clip {{ $('17. Code \u2014 Parse Caption Output').item.json.clipIndex }} \u2014 {{ $('17. Code \u2014 Parse Caption Output').item.json.clipTitle }}.mp4",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "YOUR_GOOGLE_DRIVE_FOLDER_ID",
"cachedResultName": "Content Recycler Clips"
},
"inputDataFieldName": "=data"
},
"typeVersion": 3
},
{
"id": "ea952275-3726-4ef3-81e5-1904cd6a670e",
"name": "20. Google Sheets \u2014 Save to Content Calendar",
"type": "n8n-nodes-base.googleSheets",
"position": [
512,
96
],
"parameters": {
"columns": {
"value": {
"Niche": "={{ $('17. Code \u2014 Parse Caption Output').item.json.niche }}",
"Status": "Ready to Post",
"Hashtags": "={{ $('17. Code \u2014 Parse Caption Output').item.json.hashtags }}",
"Video URL": "={{ $('17. Code \u2014 Parse Caption Output').item.json.videoUrl }}",
"Clip Score": "={{ $('17. Code \u2014 Parse Caption Output').item.json.clipScore }}",
"Clip Title": "={{ $('17. Code \u2014 Parse Caption Output').item.json.clipTitle }}",
"Clip Number": "={{ $('17. Code \u2014 Parse Caption Output').item.json.clipIndex }}",
"Video Title": "={{ $('17. Code \u2014 Parse Caption Output').item.json.videoTitle }}",
"Processed On": "={{ $now.toFormat('dd MMMM yyyy HH:mm') }}",
"Video Summary": "={{ $('17. Code \u2014 Parse Caption Output').item.json.summary }}",
"Clip Timestamp": "={{ $('17. Code \u2014 Parse Caption Output').item.json.timestamp }}",
"TikTok Caption": "={{ $('17. Code \u2014 Parse Caption Output').item.json.tiktokCaption }}",
"Facebook Caption": "={{ $('17. Code \u2014 Parse Caption Output').item.json.facebookCaption }}",
"LinkedIn Caption": "={{ $('17. Code \u2014 Parse Caption Output').item.json.linkedinCaption }}",
"Google Drive Link": "={{ $json.webViewLink }}",
"WayinVideo Export Link": "={{ $('17. Code \u2014 Parse Caption Output').item.json.exportLink }}"
},
"schema": [],
"mappingMode": "defineBelow",
"matchingColumns": []
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "Content Calendar"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "YOUR_CONTENT_CALENDAR_SHEET_ID"
}
},
"typeVersion": 4.5
},
{
"id": "273dac58-fa93-4583-aac2-eb3dab7d492c",
"name": "21. Google Sheets \u2014 Mark Video as Processed",
"type": "n8n-nodes-base.googleSheets",
"position": [
752,
96
],
"parameters": {
"columns": {
"value": {
"Status": "Processed",
"Video URL": "={{ $('17. Code \u2014 Parse Caption Output').item.json.videoUrl }}",
"Last Processed Date": "={{ $now.toFormat('dd MMMM yyyy') }}"
},
"schema": [],
"mappingMode": "defineBelow",
"matchingColumns": [
"Video URL"
]
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "Video List"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "YOUR_VIDEO_LIST_SHEET_ID"
}
},
"typeVersion": 4.5
}
],
"connections": {
"12. IF \u2014 Clips Complete?": {
"main": [
[
{
"node": "14. Code \u2014 Extract Clips Array",
"type": "main",
"index": 0
}
],
[
{
"node": "13. Wait \u2014 30 Seconds Clips Retry",
"type": "main",
"index": 0
}
]
]
},
"6. IF \u2014 Summary Complete?": {
"main": [
[
{
"node": "8. Code \u2014 Store Summary Data",
"type": "main",
"index": 0
}
],
[
{
"node": "7. Wait \u2014 30 Seconds Summary Retry",
"type": "main",
"index": 0
}
]
]
},
"10. Wait \u2014 90 Seconds Clips": {
"main": [
[
{
"node": "11. WayinVideo \u2014 Get Clip Results",
"type": "main",
"index": 0
}
]
]
},
"4. Wait \u2014 90 Seconds Summary": {
"main": [
[
{
"node": "5. WayinVideo \u2014 Get Summary Results",
"type": "main",
"index": 0
}
]
]
},
"8. Code \u2014 Store Summary Data": {
"main": [
[
{
"node": "9. WayinVideo \u2014 Submit AI Clipping",
"type": "main",
"index": 0
}
]
]
},
"18. HTTP \u2014 Download Clip File": {
"main": [
[
{
"node": "19. Google Drive \u2014 Upload Clip",
"type": "main",
"index": 0
}
]
]
},
"1. Schedule \u2014 Every Monday 9AM": {
"main": [
[
{
"node": "2. Google Sheets \u2014 Read Pending Videos",
"type": "main",
"index": 0
}
]
]
},
"14. Code \u2014 Extract Clips Array": {
"main": [
[
{
"node": "15. AI Agent \u2014 Write Platform Captions",
"type": "main",
"index": 0
}
]
]
},
"16. OpenAI \u2014 GPT-4o-mini Model": {
"ai_languageModel": [
[
{
"node": "15. AI Agent \u2014 Write Platform Captions",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"19. Google Drive \u2014 Upload Clip": {
"main": [
[
{
"node": "20. Google Sheets \u2014 Save to Content Calendar",
"type": "main",
"index": 0
}
]
]
},
"17. Code \u2014 Parse Caption Output": {
"main": [
[
{
"node": "18. HTTP \u2014 Download Clip File",
"type": "main",
"index": 0
}
]
]
},
"11. WayinVideo \u2014 Get Clip Results": {
"main": [
[
{
"node": "12. IF \u2014 Clips Complete?",
"type": "main",
"index": 0
}
]
]
},
"13. Wait \u2014 30 Seconds Clips Retry": {
"main": [
[
{
"node": "11. WayinVideo \u2014 Get Clip Results",
"type": "main",
"index": 0
}
]
]
},
"7. Wait \u2014 30 Seconds Summary Retry": {
"main": [
[
{
"node": "5. WayinVideo \u2014 Get Summary Results",
"type": "main",
"index": 0
}
]
]
},
"9. WayinVideo \u2014 Submit AI Clipping": {
"main": [
[
{
"node": "10. Wait \u2014 90 Seconds Clips",
"type": "main",
"index": 0
}
]
]
},
"5. WayinVideo \u2014 Get Summary Results": {
"main": [
[
{
"node": "6. IF \u2014 Summary Complete?",
"type": "main",
"index": 0
}
]
]
},
"3. WayinVideo \u2014 Submit Summarization": {
"main": [
[
{
"node": "4. Wait \u2014 90 Seconds Summary",
"type": "main",
"index": 0
}
]
]
},
"15. AI Agent \u2014 Write Platform Captions": {
"main": [
[
{
"node": "17. Code \u2014 Parse Caption Output",
"type": "main",
"index": 0
}
]
]
},
"2. Google Sheets \u2014 Read Pending Videos": {
"main": [
[
{
"node": "3. WayinVideo \u2014 Submit Summarization",
"type": "main",
"index": 0
}
]
]
},
"20. Google Sheets \u2014 Save to Content Calendar": {
"main": [
[
{
"node": "21. Google Sheets \u2014 Mark Video as Processed",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Add your old YouTube video URLs to a Google Sheet once and every Monday at 9AM the workflow automatically processes each one end to end. WayinVideo runs two sequential APIs — first Summarization to extract structured highlights and tags, then AI Clipping to produce up to 3 viral…
Source: https://n8n.io/workflows/15440/ — 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.
This n8n automation workflow automates the creation, scripting, production, and posting of YouTube videos. It leverages AI (OpenAI), image generation (PIAPI), video rendering (Shotstack), and platform
This workflow is designed for: Content creators and marketers E-commerce and product-based businesses Agencies producing social media visuals and videos Automation builders looking for AI-powered crea
Generate product images with NanoBanana Pro to Veo videos and Blotato - vide 2 ok. Uses httpRequest, editImage, googleDrive, googleSheets. Scheduled trigger; 76 nodes.
The Multi-Model Agency Content Engine is a high-performance editorial system designed for agencies. It solves the "blank page" problem by alternating between real-world social proof and strategic expe
This workflow automates the creation, rendering, approval, and posting of TikTok-style POV (Point of View) videos to Instagram, with cross-posting to Facebook and YouTube. It eliminates manual video p