Google Sheets to File.AI, multi scene videos in one MP4
You finally get a solid starting clip… then turning it into a full multi-scene video becomes a mess of copying links, waiting on renders, and trying to keep scenes consistent.
Content marketers feel it when they’re asked for “three more scenes by lunch.” Agency owners feel it when clients want revisions, but your scene handoffs are scattered. And founders doing their own content feel it most because there’s no time. This sheets video chaining workflow keeps the story coherent and produces one finished MP4 without you babysitting every step.
Below you’ll see exactly what the automation does, what you need to run it, and what outcomes you can expect once it’s set up.
The Problem: Multi-Scene Video Chaining Is Too Manual
Making “Scene 2” match “Scene 1” sounds simple until you try it at scale. Someone has to analyze the last frame, write a new prompt that continues the narrative, extract a reference image, generate the next clip, and track the output link somewhere sane. Then you repeat it. If you’re doing this in tabs and DMs, mistakes creep in fast: wrong aspect ratio, a prompt that forgets the theme, or a lost clip URL right when you need to merge. The time cost is obvious. The mental load is worse.
It adds up fast. Here’s where it usually breaks down.
- You end up rewatching the last few seconds of a clip just to describe what happened, again and again.
- Clip URLs get pasted into the wrong doc, so merging later turns into detective work.
- Scene prompts drift over time, which means the character, lighting, or setting subtly changes.
- Even “quick” multi-scene requests can steal a whole afternoon because each generation has to be checked and queued manually.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets to File.AI, multi scene videos in one MP4
flowchart LR
subgraph sg0["Execute Flow"]
direction LR
n0@{ icon: "mdi:wrench", form: "rounded", label: "Think", pos: "b", h: 48 }
n1@{ icon: "mdi:brain", form: "rounded", label: "GPT", pos: "b", h: 48 }
n2["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Analyze Video"]
n3["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Get Analysis"]
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Looper", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If ", pos: "b", h: 48 }
n6["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Combine Clips"]
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Get Final Video"]
n8@{ icon: "mdi:cog", form: "rounded", label: "Aggregate", pos: "b", h: 48 }
n9@{ icon: "mdi:database", form: "rounded", label: "Get input", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-vertical", form: "rounded", label: "Initial Values", pos: "b", h: 48 }
n11["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Request last"]
n12["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Get last"]
n13["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Get Video"]
n14["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Create Video"]
n15@{ icon: "mdi:database", form: "rounded", label: "Add scene", pos: "b", h: 48 }
n16@{ icon: "mdi:swap-vertical", form: "rounded", label: "Increment step", pos: "b", h: 48 }
n17@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If complete", pos: "b", h: 48 }
n18@{ icon: "mdi:cog", form: "rounded", label: "Wait 2", pos: "b", h: 48 }
n19@{ icon: "mdi:cog", form: "rounded", label: "Wait 1", pos: "b", h: 48 }
n20@{ icon: "mdi:cog", form: "rounded", label: "Wait ", pos: "b", h: 48 }
n21@{ icon: "mdi:database", form: "rounded", label: "Get scenes", pos: "b", h: 48 }
n22@{ icon: "mdi:cog", form: "rounded", label: "Wait 3", pos: "b", h: 48 }
n23@{ icon: "mdi:database", form: "rounded", label: "Update log", pos: "b", h: 48 }
n24@{ icon: "mdi:robot", form: "rounded", label: "Structured Output", pos: "b", h: 48 }
n25@{ icon: "mdi:play-circle", form: "rounded", label: "Execute", pos: "b", h: 48 }
n26@{ icon: "mdi:database", form: "rounded", label: "Clear scenes", pos: "b", h: 48 }
n27@{ icon: "mdi:robot", form: "rounded", label: "Extend AI Agent", pos: "b", h: 48 }
n1 -.-> n27
n1 -.-> n24
n5 --> n15
n5 --> n18
n0 -.-> n27
n20 --> n3
n4 --> n2
n19 --> n12
n18 --> n13
n22 --> n7
n25 --> n9
n12 --> n14
n15 --> n16
n8 --> n6
n13 --> n5
n9 --> n26
n21 --> n8
n17 --> n21
n17 --> n4
n26 --> n10
n14 --> n18
n3 --> n27
n11 --> n19
n2 --> n20
n6 --> n22
n16 --> n17
n10 --> n4
n27 --> n11
n7 --> n23
n24 -.-> n27
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n25 trigger
class n24,n27 ai
class n1 aiModel
class n0 ai
class n5,n17 decision
class n9,n15,n21,n23,n26 database
class n2,n3,n6,n7,n11,n12,n13,n14 api
classDef customIcon fill:none,stroke:none
class n2,n3,n6,n7,n11,n12,n13,n14 customIcon
The Solution: Google Sheets Controls, File.AI Chains, One Final MP4
This workflow turns a Google Sheet into a simple “production queue” for multi-scene videos. You mark a row as For Production with a starting MP4 URL, how many extra scenes you want, your aspect ratio, your model choice, and a narrative theme (plus any special scene-by-scene requests). n8n picks up the next row, clears a second sheet used for tracking scene outputs, and starts chaining. For each scene, it sends the current clip to File.AI to understand what’s happening at the end (last frame, audio, and scene details), then uses an AI agent to write the next prompt so the story continues naturally. It extracts the last frame as a JPG for continuity, generates the next clip through Key.AI, logs the new clip URL, and loops until the requested number of scenes is done. Finally, File.AI merges the original plus all generated clips into one MP4 and writes the final link back to your original Google Sheet row with status set to Done.
The workflow starts with a manual launch trigger and a “next row” pull from Google Sheets. It then loops scene-by-scene: analyze clip, build the next prompt, extract the last frame, generate the next MP4, and log the result. Once the loop finishes, it stitches everything into a single file and updates your tracking sheet so nobody has to hunt for links.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you start with a single 8-second MP4 and you want 3 extra scenes (so 4 clips total) for a short narrative. Manually, you’d typically do four repeats of “watch, describe, prompt, generate, copy the URL,” and you still have to merge at the end, which can easily be about 20 minutes per scene once context-switching is included (so roughly an hour or more). With this workflow, you update one Google Sheet row, launch it, and wait for generation and merging. You’ll spend maybe 5 minutes on inputs, then review the final MP4 link when the status flips to Done.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for the production queue and logging.
- File.AI to analyze clips, extract frames, and merge videos.
- Key.AI API key (get it from your Key.AI dashboard).
Skill level: Intermediate. You’ll connect APIs, map a few fields, and verify your Sheet columns match the workflow.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
Google Sheets kicks it off. You keep a simple control row with the starting MP4 URL, number of scenes, aspect ratio, model, theme, and a status like “For Production.” A manual launch trigger starts the run, then n8n grabs the next eligible row.
The workflow builds a loop state. n8n seeds values like “Step = 1” and “Complete = total scenes,” then clears the second sheet so your scene log is clean for this run. Each loop pass updates the current video URL to the newest generated clip.
File.AI provides continuity context. The workflow sends the current clip to File.AI for video understanding, then waits and retrieves the analysis text. That analysis becomes the grounding context for the next scene prompt, so you’re not guessing what the last frame looked like.
Prompt, frame, generate. An AI agent combines your narrative theme and special requests with the analysis, then File.AI extracts the last frame JPG. Key.AI generates the next MP4 using that frame as reference, n8n waits for completion, and a success check decides whether to log and continue or retry.
Everything gets merged and logged. Once the loop hits the requested scene count, n8n loads every clip URL from Sheet 2, asks File.AI to merge them (original plus generated scenes), and writes the final MP4 URL back to Sheet 1 with status set to Done.
You can easily modify the Sheet columns to support extra metadata like “voiceover style” or “camera motion,” then map those fields into the prompt and generation requests based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Manual Trigger
Start the workflow with a manual trigger so you can run the video narrative build on demand while configuring and testing.
- Add the Manual Launch Trigger node as the workflow trigger.
- Connect Manual Launch Trigger to Retrieve Sheet Inputs to begin pulling user inputs.
Step 2: Connect Google Sheets
Configure Google Sheets as the primary data source and log destination for scene tracking and final output updates.
- Open Retrieve Sheet Inputs and set Document to
[YOUR_ID], and Sheet toSheet1. - Set the filter in Retrieve Sheet Inputs to Status equals
for production. - Open Reset Scene Sheet and set Operation to
clearwith RangeB2:C20. - Open Log Scene Entry and confirm the update mapping uses
scene,prompt, andsceneURLwith expressions like{{ $('Loop State Builder').item.json.step }}and{{ $json.data.response.resultUrls[0] }}. - Open Load Scene Records and set the data range to
C:Cfor the Scene Sheet. - Open Update Output Log and map id to
{{ $('Retrieve Sheet Inputs').item.json.id }}and outputURL to{{ $json.video.url }}. - Credential Required: Connect your googleSheetsOAuth2Api credentials to all Google Sheets nodes (Retrieve Sheet Inputs, Reset Scene Sheet, Log Scene Entry, Load Scene Records, Update Output Log).
Step 3: Set Up AI Prompting and Parsing
Configure the AI agent that turns video analysis into a structured video generation prompt and ensures format consistency.
- Open Narrative Prompt Agent and confirm the Text field includes the expressions for scene counts and user preferences such as
{{ $('Loop State Builder').first().json.step }}and{{ $('Retrieve Sheet Inputs').first().json['narrative theme'] }}. - Verify Narrative Prompt Agent has hasOutputParser enabled so the output is structured.
- Open Structured Response Parser and keep Auto Fix enabled with the JSON schema example shown in the node.
- Ensure Chat Model Engine is connected as the language model for Narrative Prompt Agent and Structured Response Parser.
- Ensure Reflection Tool is connected to Narrative Prompt Agent as the Think tool.
- Credential Required: Connect your OpenAI credentials in Chat Model Engine. This is where credentials should be added for the AI system; Structured Response Parser and Reflection Tool inherit from the parent.
Step 4: Configure Video Processing and Loop Logic
Set up the iterative processing loop that analyzes video, generates prompts, creates scenes, and updates step counts.
- Open Seed Starting Values and set step to
1, complete to{{ $json['clips to add'] }}, and videoURL to{{ $json.videoURL }}. - In Loop State Builder, keep assignments for step, complete, and mediaURL using
{{ $json.step }},{{ $json.complete }}, and{{ $json.videoURL }}. - Configure the HTTP Request sequence for analysis and frame extraction: Inspect Video Clip → Pause After Analyze → Retrieve Analysis Result → Narrative Prompt Agent → Request Last Frame → Pause After Frame → Fetch Last Frame.
- In Inspect Video Clip, set URL to
https://queue.fal.run/fal-ai/video-understandingand keep JSON Body as shown with{{ $json.mediaURL }}. - In Request Last Frame, set URL to
https://queue.fal.run/fal-ai/ffmpeg-api/extract-frameand keep the JSON Body referencing{{ $('Loop State Builder').item.json.mediaURL }}. - Configure generation and polling: Generate Video Clip → Pause After Create → Fetch Generation Status → Success Branch Check → Log Scene Entry → Advance Step Count → Completion Decision → Loop State Builder (until complete).
- In Generate Video Clip, keep the Body with expressions like
{{ $('Narrative Prompt Agent').item.json.output.video_prompt.replace(/\n/g, '\\n').replace(/"/g, '\\"') }}and{{ $json.images[0].url }}. - In Success Branch Check, retain the condition where
{{ $json.data.successFlag }}equals1. - Set all wait nodes to their current values: Pause After Analyze
60, Pause After Frame30, Pause After Create60. - Credential Required: Connect your httpHeaderAuth credentials to all HTTP nodes (Inspect Video Clip, Retrieve Analysis Result, Request Last Frame, Fetch Last Frame, Generate Video Clip, Fetch Generation Status, Merge Video Segments, Fetch Final Render).
{{ $json.complete }} is less than {{ $json.step }}. Ensure your sheet’s clips to add value is accurate.Step 4: Configure Output and Final Merge
After scene generation completes, merge all scene URLs and fetch the final render before logging it back to your sheet.
- Ensure Completion Decision routes to Load Scene Records once all scenes are created.
- In Compile Scene Links, keep the aggregation field set to
sceneURL. - Configure Merge Video Segments with URL
https://queue.fal.run/fal-ai/ffmpeg-api/merge-videosand the JSON Body combining{{ $('Seed Starting Values').item.json.videoURL }}and the aggregated scene URLs. - Set Pause Before Final to
60seconds before the final render fetch. - In Fetch Final Render, set URL to
{{ $('Merge Video Segments').first().json.response_url }}. - Update the main sheet in Update Output Log with status set to
doneand outputURL set to{{ $json.video.url }}.
Step 5: Test and Activate Your Workflow
Run a manual test to confirm video analysis, AI prompt generation, scene creation, and final render logging work end-to-end.
- Click Execute Workflow starting from Manual Launch Trigger.
- Verify Retrieve Sheet Inputs pulls a row with
status = for productionand that Reset Scene Sheet clearsB2:C20. - Confirm Log Scene Entry writes each generated scene prompt and URL, and Update Output Log writes the final
outputURLwithstatus = done. - Once successful, toggle the workflow to Active for production use.
Common Gotchas
- Google Sheets credentials can expire or lack access to the right spreadsheet. If rows aren’t updating, check the Google connection in n8n and confirm the Sheet is shared with that account.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
About 30–60 minutes if your APIs and Sheets are ready.
No coding required. You’ll mainly connect accounts and map Google Sheet columns into the HTTP requests.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in File.AI and Key.AI usage (video analysis around $0.015 per 8-second clip, and V3 Fast generation around $0.30 per 8-second clip).
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and it’s one of the easiest changes. Update the “Aspect ratio” value in your Google Sheet row and make sure that field is mapped into the Generate Video Clip request. Common customizations include forcing 9:16 for Shorts, switching the model between V3 and V3 Fast, and adding a stricter “special requests” template so every scene follows the same structure.
Usually it’s expired OAuth access or the spreadsheet isn’t shared with the connected Google account. Reconnect Google Sheets in n8n, then confirm the exact spreadsheet ID and worksheet names match what the nodes expect. If only writes fail, check edit permissions and make sure the status column isn’t protected. Also, watch for renamed columns, because mapped fields can silently go empty.
Practically, as many as your n8n plan and API budgets allow.
For multi-scene chaining, yes, most of the time. You need looping, waits, branching “success checks,” and clean state management, and n8n handles that without forcing awkward workarounds. Self-hosting also matters here because you might run long jobs and don’t want to stress about task limits. Zapier or Make can be fine for a simple “send request, log response,” but once you add analysis + generation + merge, the flow gets heavy. If you’re unsure, Talk to an automation expert and you’ll get a straight recommendation.
Once this is running, multi-scene video production stops being a juggling act. The workflow handles the repetitive parts so you can focus on the creative calls that actually move the video forward.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.