Generate AI viral videos with VEO 3 and upload to TikTok
Automate the creation and distribution of viral video content for TikTok using AI. This workflow connects Google Sheets for idea management, OpenAI for script generation, VEO 3 for video rendering, and Blotato for TikTok uploads. Content creators and marketers can rapidly produce daily video content without manual video editing or scheduling. This saves significant time and effort in content production and social media management.
Workflow JSON
{"id":"AtyhZTTVbhFDWFhM","meta":{"instanceId":"a2b23892dd6989fda7c1209b381f5850373a7d2b85609624d7c2b7a092671d44"},"name":"💥 Generate AI Viral Videos with VEO 3 and Upload to TikTok ","tags":[],"nodes":[{"id":"958b1b16-4eb0-436a-ac87-b5d529e414bc","name":"Trigger: Start Daily Content Generation","type":"n8n-nodes-base.scheduleTrigger","position":[-240,112],"parameters":{"rule":{"interval":[{}]}},"typeVersion":1.2},{"id":"3d6bbc87-c411-434a-aa74-7e8e9893acc7","name":"Tool: Inject Creative Perspective (Idea)","type":"@n8n/n8n-nodes-langchain.toolThink","position":[240,384],"parameters":{},"typeVersion":1},{"id":"824f3d5a-c7c2-42b4-ba28-24ba4cbc972b","name":"Parse AI Output (Idea, Environment, Sound)","type":"@n8n/n8n-nodes-langchain.outputParserStructured","position":[416,384],"parameters":{"jsonSchemaExample":"[\n {\n \"Caption\": \"Diver Removes Nets Off Whale 🐋 #whalerescue #marinelife #oceanrescue #seahelpers #love #nature #instagood #explore #viral #savenature #oceanguardians #cleanoceans\",\n \"Idea\": \"Diver carefully cuts tangled net from distressed whale in open sea\",\n \"Environment\": \"Open ocean, sunlight beams through water, diver and whale, cinematic realism\",\n \"Sound\": \"Primary sound description under 15 words\",\n \"Status\": \"for production\"\n }\n]\n"},"typeVersion":1.2},{"id":"4fc884ca-3611-4148-9f22-e6f6543363d0","name":"Save Idea & Metadata to Google Sheets","type":"n8n-nodes-base.googleSheets","position":[592,112],"parameters":{"columns":{"value":{"id":"==ROW()-1","idea":"={{ $json.output[0].Idea }}","caption":"={{ $json.output[0].Caption }}","production":"={{ $json.output[0].Status }}","sound_prompt":"={{ $json.output[0].Sound }}","environment_prompt":"={{ $json.output[0].Environment }}"},"schema":[{"id":"id","type":"string","display":true,"removed":false,"required":false,"displayName":"id","defaultMatch":true,"canBeUsedToMatch":true},{"id":"idea","type":"string","display":true,"required":false,"displayName":"idea","defaultMatch":false,"canBeUsedToMatch":true},{"id":"caption","type":"string","display":true,"required":false,"displayName":"caption","defaultMatch":false,"canBeUsedToMatch":true},{"id":"production","type":"string","display":true,"required":false,"displayName":"production","defaultMatch":false,"canBeUsedToMatch":true},{"id":"environment_prompt","type":"string","display":true,"required":false,"displayName":"environment_prompt","defaultMatch":false,"canBeUsedToMatch":true},{"id":"sound_prompt","type":"string","display":true,"required":false,"displayName":"sound_prompt","defaultMatch":false,"canBeUsedToMatch":true},{"id":"final_output","type":"string","display":true,"removed":true,"required":false,"displayName":"final_output","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":["id"],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"id","value":"="},"documentId":{"__rl":true,"mode":"id","value":"="}},"credentials":{"googleSheetsOAuth2Api":{"id":"credential-id","name":"googleSheetsOAuth2Api Credential"}},"typeVersion":4.5},{"id":"5017f6ed-03cb-408c-bd47-97008e2d7352","name":"Generate Creative Video Idea","type":"@n8n/n8n-nodes-langchain.agent","position":[160,112],"parameters":{"text":"=Generate a creative concept involving:\n\n[[\nA striking BEFORE/AFTER transformation of a single non-human subject (object, environment, or natural phenomenon). The concept must specify:\n- BEFORE state: clear, visually distinct\n- AFTER state: contrasting outcome\n- TRANSITION: one word (e.g., morph, hard cut, timelapse, glitch, wipe, burst)\n- STYLE tags: 2–3 visual adjectives (e.g., cinematic, macro, neon, minimalist)\n- PALETTE: 2–3 color keywords\n- CAMERA: one movement (e.g., slow push-in, top-down, dolly-in)\n- LIGHTING: one descriptor (e.g., soft backlight, moody rim light)\n\nAvoid humans, brands, and clichés (messy→clean room, burger→salad, generic glow-up). Ensure novelty and immediate visual clarity suitable for vertical 9:16.\n\nYour response must follow this exact one-line structure:\n\n\"BEFORE: [short phrase] → AFTER: [short phrase] | TRANSITION: [style] | STYLE: [tag1, tag2] | PALETTE: [color1, color2] | CAMERA: [movement] | LIGHTING: [descriptor]\"\n]]\n\nReflect carefully before answering to ensure originality and visual appeal.\n\nUse the Think tool to review your output\n","options":{"systemMessage":"=**Role:** \nYou are an AI designed to generate **one original BEFORE/AFTER transformation video concept** optimized for TikTok and the VEO 3 API. Your output must be formatted as a **single-line JSON array** and follow the rules below exactly.\n\n---\n\n### RULES\n\n1. **Number of ideas** \n - Return **only one idea**.\n\n2. **Theme** \n - The user will always provide the theme: “Before/After transformation.” \n - Every idea must clearly show a striking **contrast** between the BEFORE and AFTER states.\n\n3. **Idea** \n - Maximum 15 words. \n - Describe the transformation in a cinematic, visually appealing way.\n\n4. **Caption** \n - Short, punchy, viral-friendly. \n - Include **one emoji**. \n - Exactly **12 hashtags** in this order: \n 1. 4 transformation-relevant hashtags \n 2. 4 all-time most popular hashtags \n 3. 4 currently trending hashtags (based on live research) \n - All in lowercase.\n\n5. **Environment** \n - Maximum 20 words. \n - Must match the action in the Idea exactly. \n - Specify setting (room, landscape, lab…), visual details (lighting, textures, transitions…), and style (cinematic, stylized, timelapse, slow-motion…).\n\n6. **Sound** \n - Maximum 15 words. \n - Describe the sound design (e.g., “beat drop at transition,” “soft rain before, energetic music after”).\n\n7. **Status** \n - Always set to `\"for production\"`.\n\n---\n\n### OUTPUT FORMAT (single-line JSON array)\n\n```json\n[\n {\n \"Caption\": \"Your short viral title with emoji #4_topic_hashtags #4_all_time_popular_hashtags #4_trending_hashtags\",\n \"Idea\": \"Your before/after transformation idea under 15 words\",\n \"Environment\": \"Your vivid setting under 20 words matching the action\",\n \"Sound\": \"Your primary sound description under 15 words\",\n \"Status\": \"for production\"\n }\n]\n"},"promptType":"define","hasOutputParser":true},"typeVersion":1.9},{"id":"d167d2b8-320e-4ea8-9f83-fae9840db585","name":"LLM: Generate Raw Idea (GPT-5)","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[64,384],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-5-mini","cachedResultName":"gpt-5-mini"},"options":{}},"credentials":{"openAiApi":{"id":"credential-id","name":"openAiApi Credential"}},"typeVersion":1.2},{"id":"9c487748-bee0-40b8-b8d4-0deff7294f60","name":"OpenAI Chat Model","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[-224,816],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-4.1-mini"},"options":{}},"credentials":{"openAiApi":{"id":"credential-id","name":"openAiApi Credential"}},"typeVersion":1.2},{"id":"6434e3ed-7f71-467c-9a7c-625feb9024c9","name":"Think","type":"@n8n/n8n-nodes-langchain.toolThink","position":[-80,816],"parameters":{},"typeVersion":1},{"id":"854036f1-bca7-4252-be3a-1095526ee614","name":"Structured Output Parser","type":"@n8n/n8n-nodes-langchain.outputParserStructured","position":[48,816],"parameters":{"jsonSchemaExample":"{\n \"title\": \"string\",\n \"final_prompt\": \"string\"\n}\n"},"typeVersion":1.3},{"id":"be8ad1f9-2de7-4c61-810a-fa3ab483835d","name":"Set Master Prompt","type":"n8n-nodes-base.set","position":[592,352],"parameters":{"options":{},"assignments":{"assignments":[{"id":"cc2e0500-57b1-4615-82cb-1c950e5f2ec4","name":"json_master","type":"string","value":"={\n \"description\": \"Brief narrative description of the scene, focusing on key visual storytelling and product transformation.\",\n \"style\": \"cinematic | photorealistic | stylized | gritty | elegant\",\n \"camera\": {\n \"type\": \"fixed | dolly | Steadicam | crane combo\",\n \"movement\": \"describe any camera moves like slow push-in, pan, orbit\",\n \"lens\": \"optional lens type or focal length for cinematic effect\"\n },\n \"lighting\": {\n \"type\": \"natural | dramatic | high-contrast\",\n \"sources\": \"key lighting sources (sunset, halogen, ambient glow...)\",\n \"FX\": \"optional VFX elements like fog, reflections, flares\"\n },\n \"environment\": {\n \"location\": \"describe location or room (kitchen, desert, basketball court...)\",\n \"set_pieces\": [\n \"list of key background or prop elements\",\n \"e.g. hardwood floors, chain-link fence, velvet surface\"\n ],\n \"mood\": \"describe the ambient atmosphere (moody, clean, epic...)\"\n },\n \"elements\": [\n \"main physical items involved (product box, accessories, vehicles...)\",\n \"include brand visibility (logos, packaging, texture...)\"\n ],\n \"subject\": {\n \"character\": {\n \"description\": \"optional – physical description, outfit\",\n \"pose\": \"optional – position or gesture\",\n \"lip_sync_line\": \"optional – spoken line if there’s a voiceover\"\n },\n \"product\": {\n \"brand\": \"Brand name\",\n \"model\": \"Product model or name\",\n \"action\": \"description of product transformation or assembly\"\n }\n },\n \"motion\": {\n \"type\": \"e.g. transformation, explosion, vortex\",\n \"details\": \"step-by-step visual flow of how elements move or evolve\"\n },\n \"VFX\": {\n \"transformation\": \"optional – describe style (neon trails, motion blur...)\",\n \"impact\": \"optional – e.g. shockwave, glow, distortion\",\n \"particles\": \"optional – embers, sparks, thread strands...\",\n \"environment\": \"optional – VFX affecting the scene (ripples, wind...)\"\n },\n \"audio\": {\n \"music\": \"optional – cinematic score, trap beat, ambient tone\",\n \"sfx\": [\n \"list of sound effects (zip, pop, woosh...)\"\n ],\n \"ambience\": \"optional – background soundscape (traffic, wind...)\",\n \"voiceover\": {\n \"delivery\": \"tone and style (confident, whisper, deep...)\",\n \"line\": \"text spoken if applicable\"\n }\n },\n \"ending\": \"Final shot description – what is seen or felt at the end (freeze frame, logo pulse, glow...)\",\n \"text\": \"none | overlay | tagline | logo pulse at end only\",\n \"format\": \"16:9 | 4k | vertical\",\n \"keywords\": [\n \"brand\",\n \"scene style\",\n \"motion type\",\n \"camera style\",\n \"sound mood\",\n \"target theme\"\n ]\n}\n"},{"id":"3c6ea609-e426-46d3-8617-2e289a833a64","name":"model","type":"string","value":"veo3_fast"},{"id":"f15acf81-840c-4e09-9ff3-1647b634875f","name":"aspectRatio","type":"string","value":"9:16"}]}},"typeVersion":3.4},{"id":"d823f8e0-f1fe-48d3-bcd8-d312c23c06dc","name":"AI Agent: Generate Video Script","type":"@n8n/n8n-nodes-langchain.agent","position":[-176,592],"parameters":{"text":"=Create a BEFORE/AFTER transformation video prompt using the provided idea.\n\n**Inputs**\n\n- idea : {{ $('Save Idea & Metadata to Google Sheets').item.json.idea }}\n- environment : {{ $('Save Idea & Metadata to Google Sheets').item.json.environment_prompt }}\n- sound : {{ $('Save Idea & Metadata to Google Sheets').item.json.sound_prompt }}\n\n**Rules**\n- The style must be cinematic, visually striking, and optimized for vertical 9:16 TikTok content.\n- Explicitly include: BEFORE scene, AFTER scene, TRANSITION style, CAMERA movement, LIGHTING, COLOR PALETTE, and MOOD.\n- Default model: `veo3_fast` (unless otherwise specified).\n- Output only **one JSON object** with the keys: `title` and `final_prompt`.\n- Use the Think tool to review your output\n","options":{"systemMessage":"=\"system_prompt:\n ## SYSTEM PROMPT: Structured Transformation Video Prompt Generator\n A - Ask:\n Generate a structured BEFORE/AFTER transformation video prompt for VEO 3 cinematic generation, strictly based on the master schema provided in: {{ $json.json_master }}.\n The final result must be a JSON object with exactly two top-level keys: `title` and `final_prompt`.\n\n G - Guidance:\n role: Creative Director\n output_count: 1\n character_limit: None\n constraints:\n - The output must be valid JSON.\n - The `title` field should contain a short, descriptive and unique title (max 15 words).\n - The `final_prompt` field must contain a **single-line JSON string** that follows the exact structure of {{ $json.json_master }} with all fields preserved.\n - The `final_prompt` string must clearly describe: BEFORE scene, AFTER scene, TRANSITION, CAMERA, LIGHTING, PALETTE, STYLE, and SOUND.\n - Do not include any explanations, markdown, or extra text — only the JSON object.\n - Escape all inner quotes in the `final_prompt` string so it is valid as a stringified JSON inside another JSON.\n tool_usage:\n - Ensure consistent alignment across all fields (camera, lighting, transition, palette, etc.).\n - Maintain full structure even for optional fields (use \"none\", \"\", or [] as needed).\n\n N - Notation:\n format: JSON\n expected_output:\n {\n \"title\": \"A unique short title for the transformation\",\n \"final_prompt\": \"{...stringified JSON of the full prompt...}\"\n }\n\"\n"},"promptType":"define","hasOutputParser":true},"typeVersion":2},{"id":"ca35eeb6-ad4a-43a4-932d-982ea8c5b34c","name":"Generate Video with VEO3","type":"n8n-nodes-base.httpRequest","position":[592,592],"parameters":{"url":"https://api.kie.ai/api/v1/veo/generate","body":"={\n \"prompt\": {{ $json.prompt }},\n \"model\": \"{{ $('Set Master Prompt').item.json.model }}\",\n \"aspectRatio\": \"{{ $('Set Master Prompt').item.json.aspectRatio }}\"\n}","method":"POST","options":{},"sendBody":true,"contentType":"raw","authentication":"genericCredentialType","rawContentType":"application/json","genericAuthType":"httpHeaderAuth"},"credentials":{"httpHeaderAuth":{"id":"credential-id","name":"httpHeaderAuth Credential"}},"typeVersion":4.2},{"id":"58b989a8-21a0-41a3-b6b0-1962720e0440","name":"Wait for VEO3 Rendering","type":"n8n-nodes-base.wait","position":[320,784],"webhookId":"f8f1a8a7-0870-4f09-b732-425a8937f229","parameters":{"unit":"minutes","amount":3},"typeVersion":1.1},{"id":"e7a619a0-035f-4506-a92e-c501a7e63786","name":"Download Video from VEO3","type":"n8n-nodes-base.httpRequest","position":[-256,1024],"parameters":{"url":"https://api.kie.ai/api/v1/veo/record-info","options":{},"sendQuery":true,"authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth","queryParameters":{"parameters":[{"name":"taskId","value":"={{ $('Generate Video with VEO3').item.json.data.taskId }}"}]}},"credentials":{"httpHeaderAuth":{"id":"credential-id","name":"httpHeaderAuth Credential"}},"typeVersion":4.2},{"id":"4fdbd573-2ff1-48e5-8a60-0138900ca4ab","name":"Format Prompt","type":"n8n-nodes-base.code","position":[320,592],"parameters":{"jsCode":"const structuredPrompt = $input.first().json.output.final_prompt;\nreturn {\n json: {\n prompt: JSON.stringify(structuredPrompt), // this escapes it correctly!\n model: \"veo3_fast\",\n aspectRatio: \"9:16\"\n }\n};\n"},"typeVersion":2},{"id":"b2090577-e3e8-46e2-861d-5ad595335324","name":"URL Final Video","type":"n8n-nodes-base.googleSheets","position":[-48,1024],"parameters":{"columns":{"value":{"idea":"={{ $('Save Idea & Metadata to Google Sheets').item.json.idea }}","production":"done","final_output":"={{ $json.data.response.resultUrls[0] }}"},"schema":[{"id":"id","type":"string","display":true,"removed":true,"required":false,"displayName":"id","defaultMatch":true,"canBeUsedToMatch":true},{"id":"idea","type":"string","display":true,"removed":false,"required":false,"displayName":"idea","defaultMatch":false,"canBeUsedToMatch":true},{"id":"caption","type":"string","display":true,"removed":true,"required":false,"displayName":"caption","defaultMatch":false,"canBeUsedToMatch":true},{"id":"production","type":"string","display":true,"required":false,"displayName":"production","defaultMatch":false,"canBeUsedToMatch":true},{"id":"environment_prompt","type":"string","display":true,"removed":true,"required":false,"displayName":"environment_prompt","defaultMatch":false,"canBeUsedToMatch":true},{"id":"sound_prompt","type":"string","display":true,"removed":true,"required":false,"displayName":"sound_prompt","defaultMatch":false,"canBeUsedToMatch":true},{"id":"final_output","type":"string","display":true,"required":false,"displayName":"final_output","defaultMatch":false,"canBeUsedToMatch":true},{"id":"row_number","type":"number","display":true,"removed":true,"readOnly":true,"required":false,"displayName":"row_number","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":["idea"],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"update","sheetName":{"__rl":true,"mode":"id","value":"="},"documentId":{"__rl":true,"mode":"id","value":"="}},"credentials":{"googleSheetsOAuth2Api":{"id":"credential-id","name":"googleSheetsOAuth2Api Credential"}},"typeVersion":4.5},{"id":"5133195b-ccd0-4749-a871-26c56c68b019","name":"Upload Video to BLOTATO","type":"@blotato/n8n-nodes-blotato.blotato","position":[160,1024],"parameters":{"mediaUrl":"={{ $json.final_output }}","resource":"media"},"credentials":{"blotatoApi":{"id":"credential-id","name":"blotatoApi Credential"}},"typeVersion":2},{"id":"2f892860-6576-4c64-89a7-213162a623c2","name":"Update Status to \"DONE\"","type":"n8n-nodes-base.googleSheets","position":[592,1024],"parameters":{"columns":{"value":{"idea":"={{ $('Save Idea & Metadata to Google Sheets').first().json.idea }}","production":"Publish"},"schema":[{"id":"id","type":"string","display":true,"removed":true,"required":false,"displayName":"id","defaultMatch":true,"canBeUsedToMatch":true},{"id":"idea","type":"string","display":true,"removed":false,"required":false,"displayName":"idea","defaultMatch":false,"canBeUsedToMatch":true},{"id":"caption","type":"string","display":true,"removed":true,"required":false,"displayName":"caption","defaultMatch":false,"canBeUsedToMatch":true},{"id":"production","type":"string","display":true,"required":false,"displayName":"production","defaultMatch":false,"canBeUsedToMatch":true},{"id":"environment_prompt","type":"string","display":true,"removed":true,"required":false,"displayName":"environment_prompt","defaultMatch":false,"canBeUsedToMatch":true},{"id":"sound_prompt","type":"string","display":true,"removed":true,"required":false,"displayName":"sound_prompt","defaultMatch":false,"canBeUsedToMatch":true},{"id":"final_output","type":"string","display":true,"removed":true,"required":false,"displayName":"final_output","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":["idea"],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"appendOrUpdate","sheetName":{"__rl":true,"mode":"id","value":"="},"documentId":{"__rl":true,"mode":"id","value":"="}},"credentials":{"googleSheetsOAuth2Api":{"id":"credential-id","name":"googleSheetsOAuth2Api Credential"}},"typeVersion":4.5},{"id":"1825853b-1c3e-479b-acff-4d2804cf10d9","name":"TikTok","type":"@blotato/n8n-nodes-blotato.blotato","position":[368,1024],"parameters":{"options":{},"platform":"tiktok","accountId":{"__rl":true,"mode":"id","value":"="},"postContentText":"={{ $('Save Idea & Metadata to Google Sheets').first().json.caption }}","postContentMediaUrls":"={{ $json.url }}","postCreateTiktokOptionIsAiGenerated":true},"credentials":{"blotatoApi":{"id":"credential-id","name":"blotatoApi Credential"}},"typeVersion":2},{"id":"007b1c04-31b3-4b5d-aceb-a5a650908dee","name":"Sticky Note8","type":"n8n-nodes-base.stickyNote","position":[-864,-80],"parameters":{"width":528,"height":1328,"content":"## 🎥 Watch This Tutorial\n\n@[youtube](E-_8KZ_FSeY)\n\n\n### 📥 [Open full documentation on Notion](https://automatisation.notion.site/Generate-AI-Viral-Videos-with-VEO-3-and-Upload-to-TikTok-2703d6550fd980aa9ea1dd7867c1cccf?source=copy_link)\n\n---\n### 1. Set Up OpenAI Connection\n#### Get Your API Key\n1. Visit the [OpenAI API Keys](https://platform.openai.com/api-keys) page.\n2. Go to [OpenAI Billing](https://platform.openai.com/settings/organization/billing/overview).\n3. Add funds to your billing account.\n4. Copy your API key into your **OpenAI credentials** in n8n (or your chosen platform).\n\n---\n### 2. Setup\n1. Import this workflow into your n8n instance. \n2. Connect your Google Sheets, Gmail, and Google Calendar credentials. Tutorial: Configure Your Google Sheets, Gmail, Calendar [Credentials](https://youtu.be/fDzVmdw7bNU)\n3. Connect Your Data in Google Sheets. Data must follow this format: [Sample Sheets Data](https://docs.google.com/spreadsheets/d/1pdMs3jWqiYQn3BNdmPhFYhbelQD3jRVtm72ECoCxo0o/copy)\n4. Test the workflow using the **Connected Chat Trigger** node to start conversations with the AI Agent. \n\n---\n### 3. Integrate VEO 3 (Kie) into n8n\n1. Sign up or log in to the **Kie (VEO 3)** dashboard. \n2. Go to **API Keys** → **Create new key** → copy the key (keep it secret). \n3. Base API URL: `https://api.kie.ai/api/v1/veo/generate`.\n\n---\n### 4. Install the Blotato node in n8n (Community Nodes)\n1. In n8n, open **Settings → Community Nodes**.\n2. Click **Install**, then add: `@blotato/n8n-nodes-blotato`. \n3. Log in to **Blotato**.\n4. Go to **Settings → API Keys**.\n5. Go to **Credentials → New**.\n6. Choose **Blotato API** (provided by the community node you installed).\n\n\n---\n## 📬 Need Help or Want to Customize This?\n**Contact me for consulting and support:** [LinkedIn](https://www.linkedin.com/in/dr-firas/) / [YouTube](https://www.youtube.com/@DRFIRASS) \n\n"},"typeVersion":1},{"id":"98797c5f-7a99-4f61-ab61-47772925ed0b","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-336,-80],"parameters":{"color":7,"width":1152,"height":1328,"content":"## Generate AI Viral Videos with VEO3 and Upload to TikTok (By Dr. Firas)\n### What problem is this workflow solving? / Use case\nCreating short-form video content that stands out takes time: ideation, scriptwriting, video generation, and publishing. This workflow automates the entire pipeline — from idea generation to TikTok upload — enabling you to scale your content strategy and focus on creativity rather than repetitive tasks.\n"},"typeVersion":1},{"id":"c13b5356-80d0-4d62-a3e8-a65a32f730f9","name":"Sticky Note7","type":"n8n-nodes-base.stickyNote","position":[-304,48],"parameters":{"color":7,"width":1104,"height":480,"content":"## | INPUT: Starting Idea Section\n\n"},"typeVersion":1},{"id":"f7433a4a-89e0-41c7-a0b2-55fcdeeac374","name":"Sticky Note9","type":"n8n-nodes-base.stickyNote","position":[-304,960],"parameters":{"color":3,"width":1104,"height":256,"content":"## | Step 2 — Publish Video to TikTok\n"},"typeVersion":1},{"id":"7412d83f-e434-4e72-ae12-fd2d97ba05e6","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-304,528],"parameters":{"color":7,"width":1104,"height":432,"content":"## | Step 1 — Generate Video with VEO3"},"typeVersion":1}],"active":false,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"b1fa6d8c-9f83-4ae1-8c99-952ef3e97229","connections":{"Think":{"ai_tool":[[{"node":"AI Agent: Generate Video Script","type":"ai_tool","index":0}]]},"TikTok":{"main":[[{"node":"Update Status to \"DONE\"","type":"main","index":0}]]},"Format Prompt":{"main":[[{"node":"Generate Video with VEO3","type":"main","index":0}]]},"URL Final Video":{"main":[[{"node":"Upload Video to BLOTATO","type":"main","index":0}]]},"OpenAI Chat Model":{"ai_languageModel":[[{"node":"AI Agent: Generate Video Script","type":"ai_languageModel","index":0}]]},"Set Master Prompt":{"main":[[{"node":"AI Agent: Generate Video Script","type":"main","index":0}]]},"Upload Video to BLOTATO":{"main":[[{"node":"TikTok","type":"main","index":0}]]},"Wait for VEO3 Rendering":{"main":[[{"node":"Download Video from VEO3","type":"main","index":0}]]},"Download Video from VEO3":{"main":[[{"node":"URL Final Video","type":"main","index":0}]]},"Generate Video with VEO3":{"main":[[{"node":"Wait for VEO3 Rendering","type":"main","index":0}]]},"Structured Output Parser":{"ai_outputParser":[[{"node":"AI Agent: Generate Video Script","type":"ai_outputParser","index":0}]]},"Generate Creative Video Idea":{"main":[[{"node":"Save Idea & Metadata to Google Sheets","type":"main","index":0}]]},"LLM: Generate Raw Idea (GPT-5)":{"ai_languageModel":[[{"node":"Generate Creative Video Idea","type":"ai_languageModel","index":0}]]},"AI Agent: Generate Video Script":{"main":[[{"node":"Format Prompt","type":"main","index":0}]]},"Save Idea & Metadata to Google Sheets":{"main":[[{"node":"Set Master Prompt","type":"main","index":0}]]},"Trigger: Start Daily Content Generation":{"main":[[{"node":"Generate Creative Video Idea","type":"main","index":0}]]},"Tool: Inject Creative Perspective (Idea)":{"ai_tool":[[{"node":"Generate Creative Video Idea","type":"ai_tool","index":0}]]},"Parse AI Output (Idea, Environment, Sound)":{"ai_outputParser":[[{"node":"Generate Creative Video Idea","type":"ai_outputParser","index":0}]]}}}How to Import This Workflow
- 1Copy the workflow JSON above using the Copy Workflow JSON button.
- 2Open your n8n instance and go to Workflows.
- 3Click Import from JSON and paste the copied workflow.
Don't have an n8n instance? Start your free trial at n8nautomation.cloud
Related Templates
Auto-create TikTok videos with VEED.io AI avatars, ElevenLabs & GPT-4
Automate the creation and distribution of trending TikTok videos using AI avatars. This workflow connects Telegram, Perplexity, OpenAI, ElevenLabs, VEED.io, and BLOTATO to generate scripts, synthesize voice, create video, and publish across multiple social platforms. Content creators and marketers can rapidly produce engaging short-form video content without manual editing.
Summarize Google Sheets form feedback via OpenAI's GPT-4
Efficiently summarize Google Sheets form feedback using OpenAI's GPT-4. This productivity workflow connects Google Sheets to retrieve form submissions, aggregates the responses into arrays, and then leverages OpenAI's advanced GPT-4 model to generate concise summaries. The generated summaries, initially in Markdown, are then converted to HTML for easy readability before being sent directly to your inbox via Gmail. This automation is ideal for product managers, marketing teams, or customer support departments who regularly collect feedback through Google Forms and need a quick, intelligent overview of responses without manually sifting through every entry. It dramatically reduces the time and effort spent analyzing feedback, allowing for faster insights and more informed decision-making.
Use skills In n8n agent node
This template gives you a framework to use skills in any n8n agent. You can use this as a starting point and add any other tools or patterns needed for your use case. What are “skills”? Skills are a context management standard created by Anthropic for use in Claude code. Basically, instead of having a HUGE system prompt, skills split that into lots of small, structured instruction files that tell an agent how to do a specific kind of task. Instead of stuffing a massive prompt full of rules, the agent: finds the relevant skill file reads it and follows the steps inside It’s a simple pattern that makes managing system prompts for general purpose agents much more straightforward. See an example of a skills repo here. What this workflow does Responds to messages in n8n Chat (or Chat Hub) Builds an “available skills” index from one or more GitHub repos Lets the agent browse folders + fetch skill files (Markdown) as needed Uses the skill content to guide how it completes tasks How it (roughly) works A chat message comes in. The workflow lists directories in the configured skills repos (root + if present), filters out noise, and merges everything into one directory map. That directory map gets injected into the agent’s system prompt so it knows what skill files exist. When it needs instructions, it uses tools: List Files by Path Name to explore folders * Get a File From GitHub to pull the skill file as raw text (no base64) Same “skills” pattern as the CLI tools The flow is: find a skill → open it → follow the steps, the same way it works in the CLI tools, but running inside n8n, so you don’t need to download or install anything locally. How to set it up (Required) Add your GitHub credentials to each node that needs it (Required) Add your OpenRouter credentials to the chat node or replace with the provider of your choosing (Optional) Add more repos to (any skills GitHub repo works as long as your credentials have access to it, such as any public repo) (Optional) Add more tools and turn it into whatever agent you actually need