Google Sheets + ElevenLabs: Shorts ready to post
Posting Shorts “consistently” sounds simple until you’re stuck rewriting scripts, chasing voiceovers, fixing captions, and hunting down files in Drive. The ideas are there. The production grind is what kills momentum.
Sheets Shorts automation hits hardest for content managers trying to keep a weekly pipeline full. Solo creators feel it too. And honestly, agencies producing batches for clients get buried in versioning and approvals fast.
This workflow turns a row in Google Sheets into a finished, vertical video with voice, captions, and final rendering handled for you. You’ll see how it works, what you need, and where the common setup traps are.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets + ElevenLabs: Shorts ready to post
flowchart LR
subgraph sg0["Manual Execution Start Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Manual Execution Start", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-vertical", form: "rounded", label: "Assign Runtime Fields", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Distribute Entries", pos: "b", h: 48 }
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/code.svg' width='40' height='40' /></div><br/>Assemble Clip Array"]
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Segment Records", pos: "b", h: 48 }
n5["<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/code.svg' width='40' height='40' /></div><br/>Compile Video List"]
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/>Render Clip"]
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/code.svg' width='40' height='40' /></div><br/>Construct Faceless List"]
n8["<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/>Stitch Video Segments"]
n9["<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/>Trim Footage"]
n10["<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/>Fetch Audio Metadata"]
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/>Add Captions"]
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/>Fuse Audio and Video"]
n13@{ icon: "mdi:robot", form: "rounded", label: "Core LLM Pipeline", pos: "b", h: 48 }
n14@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Reader", pos: "b", h: 48 }
n15["<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/>Generate Image"]
n16["<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/>Synthesize Voice"]
n17["<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/>Retrieve Voice Output"]
n18@{ icon: "mdi:database", form: "rounded", label: "Retrieve Sheet Rows", pos: "b", h: 48 }
n19@{ icon: "mdi:swap-vertical", form: "rounded", label: "Prepare Image Scripts", pos: "b", h: 48 }
n20@{ icon: "mdi:swap-vertical", form: "rounded", label: "Prepare Audio Scripts", pos: "b", h: 48 }
n21["<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/code.svg' width='40' height='40' /></div><br/>Audio Script Logic"]
n22["<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/code.svg' width='40' height='40' /></div><br/>Image Script Logic"]
n23["<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/>Fetch Image Asset"]
n24["<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/code.svg' width='40' height='40' /></div><br/>Image Processing Logic"]
n25["<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/code.svg' width='40' height='40' /></div><br/>Voice Post Process"]
n26["<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/merge.svg' width='40' height='40' /></div><br/>Combine Branch Results"]
n27@{ icon: "mdi:brain", form: "rounded", label: "Ollama Chat Engine", pos: "b", h: 48 }
n24 --> n26
n25 --> n26
n21 --> n16
n22 --> n15
n26 --> n1
n17 --> n25
n15 --> n23
n23 --> n24
n2 --> n6
n9 --> n12
n16 --> n17
n4 --> n10
n20 --> n21
n19 --> n22
n1 --> n7
n6 --> n3
n13 --> n19
n13 --> n20
n5 --> n8
n8 --> n11
n27 -.-> n13
n10 --> n9
n18 --> n13
n7 --> n2
n12 --> n5
n3 --> n4
n14 -.-> n13
n0 --> n18
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 n0 trigger
class n13,n14 ai
class n27 aiModel
class n18 database
class n6,n8,n9,n10,n11,n12,n15,n16,n17,n23 api
class n3,n5,n7,n21,n22,n24,n25 code
classDef customIcon fill:none,stroke:none
class n3,n5,n6,n7,n8,n9,n10,n11,n12,n15,n16,n17,n21,n22,n23,n24,n25,n26 customIcon
The Problem: Turning Ideas Into Shorts Takes Too Many Tools
A motivational Short looks “easy” from the outside. But the real work is hidden. You draft a script, tweak it to fit under 60 seconds, generate an image that actually matches the message, record (or regenerate) voice until it sounds right, then try to sync captions that don’t look cheap. Now multiply that by 10 videos. It’s not just time. It’s context switching, repetitive exports, and little errors that show up after you’ve already posted.
None of these alone is the problem. Together, they are.
- You end up rewriting the same style of script over and over because there’s no repeatable pipeline.
- Voiceovers become a bottleneck, especially when you need consistency across a series.
- Caption styling and timing steals “creative” hours even though it is mostly mechanical work.
- File handling gets messy fast, so you lose track of what is final, what is draft, and what already shipped.
The Solution: Google Sheets Rows In, Posted-Ready Shorts Out
This n8n workflow treats Google Sheets like your content backlog and production queue. You write (or paste) simple motivational ideas into rows, then run the workflow to generate scripts using a local Ollama model, create matching black-and-white visuals through fal.ai, and synthesize a voiceover with ElevenLabs. From there, it calls a self-hosted video processing API to build clips with zoom effects, stitch segments into a finished vertical video, and burn in styled captions that look intentional instead of auto-generated. The result lands as a social-ready video (9:16, under 60 seconds), so you are not stuck assembling parts by hand.
The workflow starts when you trigger it in n8n and it pulls rows from Google Sheets. AI generates the script plus structured fields for both image prompts and audio lines, then separate branches create the image and voice. Finally, the workflow renders, trims, captions, merges audio, and compiles the final video list for export and storage.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you want 10 motivational Shorts ready for the week. Manually, you might spend about 20 minutes writing and tightening each script, another 10 minutes generating visuals, then 20 minutes on voice, captions, and exporting. That’s roughly 8 hours for 10 videos, and it’s easy to blow past that if you redo audio. With this workflow, you spend about 30 minutes preparing 10 rows in Google Sheets, then let the automation render in the background. You still review outputs, but you are no longer assembling them from scratch.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for storing ideas and tracking status.
- ElevenLabs to synthesize voiceovers.
- Ollama for local script generation (free).
- fal.ai to generate black & white images.
- Self-hosted video processing API for rendering, captions, and merging.
- API keys (get them from your ElevenLabs and fal.ai dashboards).
Skill level: Intermediate. You’ll connect accounts, add API keys, and may tweak a few fields to match your Sheet columns.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
You trigger a run and n8n pulls rows from Google Sheets. The workflow starts with a manual run (great for batches) and reads the sheet rows you want to turn into videos.
Ollama turns each idea into a structured “video plan.” Instead of dumping plain text, the LLM chain produces structured outputs that separate what belongs in the voiceover, what belongs in the image prompt, and what belongs in captions.
Two branches build assets at the same time. One branch generates an image via fal.ai, fetches the image file, and processes it for video. The other branch sends the audio script to ElevenLabs, retrieves the voice output, and post-processes metadata so downstream nodes can sync correctly.
The video API renders, stitches, trims, captions, then fuses audio. n8n loops through clips in batches, renders segments, combines them, applies caption styling, and produces a final vertical video that’s ready for TikTok, Reels, or Shorts.
You can easily modify the caption style and the script tone to match your brand. 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 test the full media assembly pipeline on demand.
- Add and open Manual Execution Start.
- Leave all fields at their defaults since this is a manual trigger.
- Connect Manual Execution Start to Retrieve Sheet Rows.
Step 2: Connect Google Sheets
Pull source rows from Google Sheets to feed the AI script generation and media assembly stages.
- Open Retrieve Sheet Rows and configure the spreadsheet and sheet range you want to read.
- Ensure the output fields include everything needed for the scripts and asset generation downstream.
- Connect Retrieve Sheet Rows to Core LLM Pipeline.
Step 3: Set Up the LLM Pipeline and Parallel Script Preparation
Generate structured instructions for images and audio, then split into parallel processing branches for image and voice creation.
- Open Core LLM Pipeline and confirm that Ollama Chat Engine is connected as its language model.
- Ensure Structured Output Reader is attached to Core LLM Pipeline as the output parser; add credentials to Core LLM Pipeline if your LLM provider requires them.
- Verify the parallel split: Core LLM Pipeline outputs to both Prepare Image Scripts and Prepare Audio Scripts in parallel.
- Connect Prepare Image Scripts to Image Script Logic, then to Generate Image.
- Connect Prepare Audio Scripts to Audio Script Logic, then to Synthesize Voice.
Step 4: Configure Image and Voice Processing Branches
Process image and voice outputs independently, then merge them for unified assembly.
- For the image branch, connect Generate Image → Fetch Image Asset → Image Processing Logic → Combine Branch Results.
- For the audio branch, connect Synthesize Voice → Retrieve Voice Output → Voice Post Process → Combine Branch Results.
- Verify that Combine Branch Results feeds into Assign Runtime Fields.
Step 5: Configure the Media Assembly Pipeline
Build clips, apply audio processing, and stitch final video segments with captions.
- Connect Assign Runtime Fields → Construct Faceless List → Distribute Entries → Render Clip → Assemble Clip Array → Segment Records.
- From Segment Records, connect Fetch Audio Metadata → Trim Footage → Fuse Audio and Video.
- Finalize with Compile Video List → Stitch Video Segments → Add Captions.
- Group configuration for the 10+ httpRequest nodes (e.g., Render Clip, Trim Footage, Stitch Video Segments) to ensure endpoint URLs, headers, and payloads are consistent with your media API.
- Group configuration for the 7 code nodes (e.g., Assemble Clip Array, Compile Video List) to align expected input/output formats across the pipeline.
Step 6: Test and Activate Your Workflow
Run a manual test to verify each branch, then activate the workflow for production use.
- Click Execute Workflow from Manual Execution Start to run the full pipeline.
- Confirm that Core LLM Pipeline successfully populates both script branches and that Combine Branch Results contains merged output.
- Verify final outputs after Add Captions to ensure the stitched video includes audio, visuals, and captions.
- When satisfied, toggle the workflow to Active for production use.
Common Gotchas
- Google Sheets credentials can expire or need specific permissions. If things break, check the n8n Credentials screen and your Google account’s connected apps first.
- 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 an hour if your API keys and Sheet are ready.
No coding required. You’ll mostly connect services and map your Google Sheets columns to the workflow fields.
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 usage costs for ElevenLabs and fal.ai, plus whatever your video processing server costs to run.
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 usually just prompt and field changes. Update the tone and structure in the Ollama LLM chain so the script matches your niche, then tweak the caption styling in the caption step used by the video API. Common customizations include changing the hook format, switching from black-and-white to a branded look, and adding a call-to-action line at the end of every voiceover.
Usually it’s expired OAuth credentials or the Google account doesn’t have access to the target spreadsheet. Reconnect the Google Sheets credential in n8n, then confirm the Sheet is shared with that same Google account. If it still fails, double-check you’re pointing at the right spreadsheet ID and worksheet tab name, because a renamed tab can quietly break lookups.
Practically, as many as your n8n execution limits and your rendering server can handle.
Often, yes, because this workflow needs branching, looping, and multiple HTTP rendering steps that get awkward (and expensive) in simpler builders. n8n handles complex logic without turning every conditional into a premium add-on. You can also self-host, which matters when you start running big batches. Zapier or Make can still be fine for lightweight two-step publishing tasks. Talk to an automation expert if you want help choosing the simplest option for your volume.
Set this up once and your Google Sheet turns into a simple production machine. The workflow handles the repetitive parts so you can focus on ideas, packaging, and posting.
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.