AutomationFlowsAI & RAG › Generate Veo 3 Short-form Videos From a Form Using Groq and Google Sheets

Generate Veo 3 Short-form Videos From a Form Using Groq and Google Sheets

ByMohan Lal Dhanwani @mohanlaldhanwani on n8n.io

This workflow collects a video topic via an n8n form, uses Groq to generate a short-form video idea and Veo 3 prompt, logs the content to Google Sheets, generates the video through Vertex AI (Veo 3), uploads it to Google Drive, and writes the Drive URL to the sheet. Receives a…

Event trigger★★★★☆ complexityAI-powered25 nodesForm TriggerOutput Parser StructuredAgentGoogle SheetsHTTP RequestGoogle DriveGroq ChatTool Think
AI & RAG Trigger: Event Nodes: 25 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #16115 — we link there as the canonical source.

This workflow follows the Agent → Form Trigger 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 →

Download .json
{
  "id": "lJWHbNi5jILFPZY5",
  "name": "AI-Powered Veo 3 Video Creator: Auto-Generate Ideas, Prompts & Videos from a Form\\",
  "tags": [],
  "nodes": [
    {
      "id": "354d84d4-a35b-43d5-8289-dddb2a95ddf4",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2336,
        592
      ],
      "parameters": {
        "color": 7,
        "width": 768,
        "height": 624,
        "content": "## \ud83d\udd01 API Error Checking & Retry Logic\n\nChecks whether the ready response contains an API error, waits before retrying failed submissions, enforces a retry limit, and stops the execution for that video creation if the limit is reached."
      },
      "typeVersion": 1
    },
    {
      "id": "b72dfb87-f3e7-4b8c-bfd9-52116f15e375",
      "name": "When Form Submitted",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        -16,
        672
      ],
      "parameters": {
        "options": {},
        "formTitle": "Veo 3 AI Video Generator",
        "formFields": {
          "values": [
            {
              "fieldLabel": "Topic",
              "placeholder": "Enter the video topic here..."
            },
            {
              "fieldLabel": "Enter the Video Vibe",
              "placeholder": "e.g. fun, playful, serious, emotional"
            },
            {
              "fieldLabel": "Who this Video is for?",
              "placeholder": "e.g. Gen Z, small business owners, fitness enthusiasts"
            }
          ]
        },
        "formDescription": "Fill in the details below to generate a cinematic AI video using Google Veo 3"
      },
      "typeVersion": 2.5
    },
    {
      "id": "f4d49f12-4faf-4ffe-ac15-285d64583470",
      "name": "Parse Structured Output",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        400,
        864
      ],
      "parameters": {
        "jsonSchemaExample": "{\n \"caption\": \"\",\n \"idea\": \"\",\n \"environment\": \"\",\n \"status\": \"\"\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "c81dd410-76c4-43fd-8129-fe0d54a59526",
      "name": "Idea Generation Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        208,
        672
      ],
      "parameters": {
        "text": "=Give me an idea to create the content about {{ $json.Topic }}\n\nVibe: {{ $json['Enter the Video Vibe'] }}\nThis video is to be targeted to : {{ $json['Who this Video is for?'] }}",
        "options": {
          "systemMessage": "** Purpose **\nYou generate viral short-form video ideas for any topic, styled like modern TikTok or Reels content.\nThese should feel personal, emotional, and often humorous.\n\n** Think Tool Prompt (used before generation) **\n\"How can I take this topic and turn it into a relatable, viral, or engaging short-form video idea that feels natural, emotional, or modern?\"\n\n** Output Requirements **\nYour response must include:\n- caption \u2013 Short, punchy, TikTok-style caption. Include emojis and 3\u20135 relevant hashtags.\n- idea \u2013 1\u20132 sentence summary of the action, story, or twist in the video.\n- environment \u2013 Describe what the set looks like: light, textures, mood, setting.\n- status \u2013 Must be \"to create\", without quotation marks\n\n** JSON Output Parser **\nEvery output must strictly follow this format:\n\n{\n \"caption\": \"\",\n \"idea\": \"\",\n \"environment\": \"\",\n \"status\": \"\"\n}\n\n** Sample Output **\n\n{\n \"caption\": \"When your inbox floods but your AI doesn't flinch \ud83e\udd16\ud83d\udcbc #AItools #productivity #automation #contentcreator\",\n \"idea\": \"A stressed founder drowning in notifications suddenly relaxes as an AI assistant calmly handles everything \u2014 split-screen style.\",\n \"environment\": \"Cluttered home office with harsh overhead light transitions to a clean minimal desk with soft natural light. Laptop screen visible throughout.\",\n \"status\": \"to create\"\n}"
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 3.1
    },
    {
      "id": "b25698dc-aa65-4454-98dd-7bbb65b9ad72",
      "name": "Video Prompt Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        560,
        672
      ],
      "parameters": {
        "text": "=Create a prompt for the Veo 3 video based on the following information:\n\nIdea: {{ $json.output.idea }}\nEnvironment: {{ $json.output.environment }}",
        "options": {
          "systemMessage": "** System Message **\n\nYou are a professional cinematic prompt generator for AI video tools.\nYour task is to convert a short-form video idea and its environment description\ninto a highly detailed, camera-aware, emotionally rich prompt suitable for generating a cinematic AI video using Google Veo 3.\n\n** Veo 3 Prompt Structure Guidelines **\n\nEach prompt should be natural, cinematic, and visually immersive, including:\n\n- Scene description \u2013 Describe the overall environment clearly (terrain, buildings, light, movement).\n- Character focus \u2013 If the idea involves a person, include their position, outfit style, mood/expression, and framing (e.g., close-up, wide shot).\n- Camera movement \u2013 Always include one cinematic camera motion (e.g., slow push-in, handheld tracking, drone pan, orbit, dolly backward).\n- Time of day & lighting \u2013 Set the mood with light (e.g., golden hour, harsh daylight, candlelit interior).\n- Atmosphere & texture \u2013 Mention dust, wind, fabric movement, shadows, reflections, or imperfections in the scene to increase realism.\n- Style & quality \u2013 Include cinematic tone, analog warmth, slightly soft vintage film look, GoPro-like closeness if appropriate.\n- Audio \u2013 Describe ambient sound, music tone, or any dialogue if relevant.\n\n** Input **\n- You will receive two fields: idea, environment\n- Return only the complete and detailed Veo 3 prompt, no additional text.\n\n** Example Output **\nA person stands in a cluttered home office, illuminated by harsh overhead fluorescent lighting.\nThe desk is covered in papers and coffee mugs. The laptop screen flickers with dozens of incoming notifications.\nThe person looks stressed \u2014 eyes wide, hand running through their hair.\nA slow push-in shot emphasizes the chaos as they throw their hands up.\nSuddenly the scene cuts to a clean, minimal desk with soft natural light streaming through a window.\nThe same person now sits calmly, watching an AI dashboard handle everything.\nShot in cinematic 24fps with natural tones and slight vintage softness.\nAmbient coffee shop background noise fades in as tension releases."
        },
        "promptType": "define"
      },
      "typeVersion": 3.1
    },
    {
      "id": "421c871c-11fb-462d-9afd-a0dd23ddd47f",
      "name": "Append Content to Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1056,
        688
      ],
      "parameters": {
        "columns": {
          "value": {
            "Idea": "={{ $('Idea Generation Agent').item.json.output.idea }}",
            "Prompt": "={{ $json.output }}",
            "Status": "={{ $('Idea Generation Agent').item.json.output.status }}",
            "Captions": "={{ $('Idea Generation Agent').item.json.output.caption }}",
            "Environment": "={{ $('Idea Generation Agent').item.json.output.environment }}"
          },
          "schema": [
            {
              "id": "Idea",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Idea",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Captions",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Captions",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Environment",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Environment",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Prompt",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Prompt",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Video URL",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Video URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_GOOGLE_SHEET_ID"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "34c21f3d-07af-465e-9138-2f0e0e356e32",
      "name": "Post to Veo 3 API",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1488,
        720
      ],
      "parameters": {
        "url": "=https://us-central1-aiplatform.googleapis.com/v1/projects/YOUR_GCP_PROJECT_ID/locations/us-central1/publishers/google/models/veo-3.1-generate-001:predictLongRunning",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"instances\": [\n    {\n      \"prompt\": {{ JSON.stringify($json.Prompt) }}\n    }\n  ],\n  \"parameters\": {\n    \"sampleCount\": 1,\n    \"aspectRatio\": \"16:9\",\n    \"durationSeconds\": 8,\n    \"generateAudio\": true\n  }\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "googleApi"
      },
      "credentials": {
        "googleApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "87dbc28d-90c7-4bea-bb61-2bd0a5bac9e9",
      "name": "Wait 60 Seconds for Video",
      "type": "n8n-nodes-base.wait",
      "position": [
        1696,
        720
      ],
      "parameters": {
        "unit": "minutes",
        "amount": 1
      },
      "typeVersion": 1.1
    },
    {
      "id": "6341c1cf-0ee4-4315-a72a-b8f2284b10dd",
      "name": "Poll Video Generation Status",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1904,
        720
      ],
      "parameters": {
        "url": "=https://us-central1-aiplatform.googleapis.com/v1/projects/YOUR_GCP_PROJECT_ID/locations/us-central1/publishers/google/models/veo-3.1-generate-001:fetchPredictOperation",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"operationName\": \"{{ $('Post to Veo 3 API').item.json.name }}\"\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "googleApi"
      },
      "credentials": {
        "googleApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "6c7c3b5b-754d-40c4-a870-2b37d4f92d72",
      "name": "Check Video Completion",
      "type": "n8n-nodes-base.if",
      "position": [
        2096,
        720
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "f08061ec-581a-4d20-84d2-2f0511e79ff4",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $json.done }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "cac51c32-b948-4a4e-8b64-9326a854dfb9",
      "name": "Convert Video to File",
      "type": "n8n-nodes-base.convertToFile",
      "position": [
        3200,
        640
      ],
      "parameters": {
        "options": {},
        "operation": "toBinary",
        "sourceProperty": "response.videos[0].bytesBase64Encoded"
      },
      "typeVersion": 1.1
    },
    {
      "id": "dc76a721-f7e8-4520-afa8-b5de2317e035",
      "name": "Upload File to Google Drive",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        3440,
        640
      ],
      "parameters": {
        "name": "={{ \n  ($('Append Content to Sheet').item.json.Idea || 'video')\n    .toLowerCase()\n    .replace(/[\\\\\\/:*?\"<>|.]/g, '')\n    .replace(/\\s+/g, '_')\n    .slice(0, 80)\n  + '_' + $now.toMillis()\n}}",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive",
          "cachedResultName": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_DRIVE_FOLDER_ID"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "1be2d917-b70e-468a-9c7c-03e1334c3ea3",
      "name": "Groq AI Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGroq",
      "position": [
        400,
        1072
      ],
      "parameters": {
        "model": "llama-3.3-70b-versatile",
        "options": {}
      },
      "credentials": {
        "groqApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "6b8358e2-fb38-4c85-b338-ac8a4a31f323",
      "name": "Trigger Thought Process",
      "type": "@n8n/n8n-nodes-langchain.toolThink",
      "position": [
        752,
        944
      ],
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "8e3678d4-eec0-4150-9f8d-6410bb8c7b3e",
      "name": "Update Sheet with URL",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        3936,
        672
      ],
      "parameters": {
        "columns": {
          "value": {
            "Prompt": "={{ $('Video Prompt Agent').first().json.output }}",
            "Video URL": "={{ $json.webViewLink }}"
          },
          "schema": [
            {
              "id": "Idea",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Idea",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Captions",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Captions",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Status",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Environment",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Environment",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Prompt",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Prompt",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Video URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Video URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Prompt"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1JGGPWc6aJa7rPAYTYViW3GZDRVk6pvQJ8erqwXU8ulk/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_GOOGLE_SHEET_ID"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "34bfc9ed-6d07-44e1-9aed-2d044b030db6",
      "name": "Check for API Error",
      "type": "n8n-nodes-base.if",
      "position": [
        2384,
        720
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "d0a7efb0-f6c2-4926-839f-27b87b618d4e",
              "operator": {
                "type": "number",
                "operation": "exists",
                "singleValue": true
              },
              "leftValue": "={{ $json.error.code }}",
              "rightValue": 0
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "b8c3a715-7bed-4dc2-82dc-5d9a3de2eafd",
      "name": "Stop on Max Retries",
      "type": "n8n-nodes-base.noOp",
      "position": [
        2960,
        1040
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "2475eb41-9493-4c01-800a-3d17ffe2d880",
      "name": "Check Retry Limit",
      "type": "n8n-nodes-base.if",
      "position": [
        2736,
        928
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "8ebb9440-968e-4920-991a-30b481d3d943",
              "operator": {
                "type": "number",
                "operation": "lt"
              },
              "leftValue": "={{ $runIndex }}",
              "rightValue": 5
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "978a9ad4-9090-4cc8-8a82-74deb4eb0d71",
      "name": "Wait 60 Seconds for Retry",
      "type": "n8n-nodes-base.wait",
      "position": [
        2576,
        784
      ],
      "parameters": {
        "amount": 60
      },
      "typeVersion": 1.1
    },
    {
      "id": "400e5eb7-3190-496f-8665-f037e1a0d7c4",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -624,
        480
      ],
      "parameters": {
        "width": 480,
        "height": 896,
        "content": "## AI-Powered Veo 3 Video Creator: Auto-Generate Ideas, Prompts & Videos from a Form\\\n\n### How it works\n\nThis workflow starts from a form submission, uses AI agents to generate a video idea and a detailed Veo 3 prompt, then records the generated content in Google Sheets. It submits the prompt to Google Vertex AI/Veo 3, waits and polls until the video is ready, and handles retryable API errors. When generation succeeds, it converts the returned video data to a file, uploads it to Google Drive, and saves the final URL back to the sheet.\n\n### Setup steps\n\n- Configure the form fields that provide the initial topic, audience, style, or other inputs used by the AI agents.\n- Add credentials for the Groq chat model and verify the AI agent prompts and structured output parser match the expected idea/prompt format.\n- Connect Google Sheets credentials and select the spreadsheet/ranges used for saving generated content and final video URLs.\n- Configure Google Vertex AI/Veo 3 HTTP authentication, project/location/model endpoint, and request body fields in the submit and polling HTTP Request nodes.\n- Connect Google Drive credentials and choose the destination folder for uploaded video files.\n\n### Customization\n\nAdjust the AI agent instructions to change the type of ideas and video prompts produced, update the wait durations or retry limit for longer Veo 3 jobs, and change the Google Sheet columns or Drive folder to match your content pipeline."
      },
      "typeVersion": 1
    },
    {
      "id": "160a4278-9d5c-4972-823a-8784d9daecba",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -64,
        544
      ],
      "parameters": {
        "color": 4,
        "width": 944,
        "height": 688,
        "content": "## Generate video prompt\n\nA visually tight starting cluster that receives the form submission, creates a video idea with an AI agent, and turns it into a Veo-ready prompt using the second AI agent."
      },
      "typeVersion": 1
    },
    {
      "id": "08f898c6-68fc-44bf-b49f-896b69d8f53e",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        896,
        432
      ],
      "parameters": {
        "color": 6,
        "width": 416,
        "height": 512,
        "content": "## Log generated idea details\n\nStores the generated idea and prompt content in Google Sheets before the workflow starts video generation.\n\n\u2699\ufe0f **CONFIGURE:**\n- Connect your **Google Sheets OAuth2** credential\n- Create a sheet with these columns: `Idea`, `Captions`, `Environment`, `Status`, `Prompt`, `Video URL`\n- Replace the Sheet ID in this node with your own Google Sheet ID"
      },
      "typeVersion": 1
    },
    {
      "id": "98151d80-ef44-4855-b1ff-8dca63719e85",
      "name": "Sticky Note10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1376,
        480
      ],
      "parameters": {
        "color": 4,
        "width": 912,
        "height": 480,
        "content": "## Veo 3 Video Generation and Polling\n\nSubmits the prompt to Veo 3, waits for processing, polls the generation status, and loops until the video is reported ready.\n\n\u2699\ufe0f **CONFIGURE:**\n- Connect your **Google Service Account** credential (needs Vertex AI User role)\n- Replace `YOUR_GCP_PROJECT_ID` in both HTTP Request node URLs with your Google Cloud project ID\n- Make sure the **Veo 3 API** is enabled in your GCP project (Vertex AI \u2192 Model Garden \u2192 Veo)"
      },
      "typeVersion": 1
    },
    {
      "id": "44e46da5-b8e4-4356-9fff-65f71756341b",
      "name": "Sticky Note11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3152,
        336
      ],
      "parameters": {
        "color": 6,
        "width": 528,
        "height": 544,
        "content": "## Upload final video to Google Drive \n\nConverts the successful Veo output into a file, and uploads it to Google Drive\n\n\u2699\ufe0f **CONFIGURE:**\n- Connect your **Google Drive OAuth2** credential\n- Replace the folder ID in the **Upload to Drive** node with your own Drive folder ID\n- To find your folder ID: open the folder in Google Drive and copy the ID from the URL"
      },
      "typeVersion": 1
    },
    {
      "id": "6b163e18-b5db-4f13-8051-ca7e33505d76",
      "name": "Sticky Note12",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3792,
        432
      ],
      "parameters": {
        "color": 6,
        "width": 512,
        "height": 416,
        "content": "Save Video URL to Sheet\n\nAfter the video uploads to Google Drive, this node writes the Drive `webViewLink` back to the Google Sheet, matched by the `Prompt` column.\n\n\u2699\ufe0f **CONFIGURE:**\n- Uses the same Google Sheet credential and Sheet ID as Save Content to Sheet node\n- Your sheet must include a `Video URL` column\n- Row matching is by `Prompt` value \u2014 prompts should be unique per run"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "callerPolicy": "workflowsFromSameOwner",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "bcaf114c-3110-4e8e-bfd0-3727b77d0b31",
  "connections": {
    "Groq AI Model": {
      "ai_languageModel": [
        [
          {
            "node": "Idea Generation Agent",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "Video Prompt Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Check Retry Limit": {
      "main": [
        [
          {
            "node": "Post to Veo 3 API",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Stop on Max Retries",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Post to Veo 3 API": {
      "main": [
        [
          {
            "node": "Wait 60 Seconds for Video",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Video Prompt Agent": {
      "main": [
        [
          {
            "node": "Append Content to Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check for API Error": {
      "main": [
        [
          {
            "node": "Wait 60 Seconds for Retry",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Convert Video to File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When Form Submitted": {
      "main": [
        [
          {
            "node": "Idea Generation Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Convert Video to File": {
      "main": [
        [
          {
            "node": "Upload File to Google Drive",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Idea Generation Agent": {
      "main": [
        [
          {
            "node": "Video Prompt Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Video Completion": {
      "main": [
        [
          {
            "node": "Check for API Error",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait 60 Seconds for Video",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Append Content to Sheet": {
      "main": [
        [
          {
            "node": "Post to Veo 3 API",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Structured Output": {
      "ai_outputParser": [
        [
          {
            "node": "Idea Generation Agent",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Trigger Thought Process": {
      "ai_tool": [
        [
          {
            "node": "Video Prompt Agent",
            "type": "ai_tool",
            "index": 0
          },
          {
            "node": "Idea Generation Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Wait 60 Seconds for Retry": {
      "main": [
        [
          {
            "node": "Check Retry Limit",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait 60 Seconds for Video": {
      "main": [
        [
          {
            "node": "Poll Video Generation Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload File to Google Drive": {
      "main": [
        [
          {
            "node": "Update Sheet with URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Poll Video Generation Status": {
      "main": [
        [
          {
            "node": "Check Video Completion",
            "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.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow collects a video topic via an n8n form, uses Groq to generate a short-form video idea and Veo 3 prompt, logs the content to Google Sheets, generates the video through Vertex AI (Veo 3), uploads it to Google Drive, and writes the Drive URL to the sheet. Receives a…

Source: https://n8n.io/workflows/16115/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

🎯 Create viral TikToks, Shorts, Reels, podcasts, and ASMR videos in minutes — all on autopilot.

OpenAI, HTTP Request, Form Trigger +7
AI & RAG

Generate AI viral videos with NanoBanana & VEO3, shared on socials via Blotato 2. Uses @blotato/n8n-nodes-blotato, googleSheets, lmChatOpenAi, toolThink. Event-driven trigger; 94 nodes.

@Blotato/N8N Nodes Blotato, Google Sheets, OpenAI Chat +9
AI & RAG

This template is designed for marketers, content creators, and e-commerce brands who want to automate the creation of professional ad videos at scale. It’s ideal for teams looking to generate consiste

Telegram, Telegram Trigger, Google Drive +8
AI & RAG

💥 Automate video ads with NanoBanana, Seedream 4, ChatGPT Image and Veo 3 - VIDE. Uses telegram, telegramTrigger, googleDrive, agent. Event-driven trigger; 63 nodes.

Telegram, Telegram Trigger, Google Drive +8
AI & RAG

This workflow contains community nodes that are only compatible with the self-hosted version of n8n.

Output Parser Structured, Telegram, N8N Nodes Tesseractjs +14