Automated YouTube Shorts Factory: Sheet row to script to voiceover to video to YouTube upload

Sharing a workflow I built for fully automating YouTube Shorts production. It runs on a schedule (default hourly), reads a Google Sheet you control, and turns the next “ready” row into a produced, uploaded Short with zero manual steps.

Pipeline: an hourly trigger reads the Google Sheet, filters to rows where Production Status equals productionready, picks the oldest eligible row and immediately locks it so a second run can’t grab the same row, generates a narration script via OpenAI driven entirely by the row’s Niche/Idea/Caption/Description (works for any topic), generates a voiceover via ElevenLabs and uploads it to Google Drive for a public URL, renders a 1080x1920 video via Creatomate with visuals, animated captions and the voiceover, uploads the result to YouTube as a Short, and finally writes the script, video URL, and YouTube link back to the row.

Reliability features: row locking prevents duplicate processing, every external API call has retryOnFail enabled, a TEST_MODE flag forces private YouTube uploads until you’re ready to go public, and failed steps write a specific error message back to the sheet instead of silently stopping.

Template plus a full setup guide (covering every credential you’ll need: Google Sheets/Drive OAuth, OpenAI, ElevenLabs, Creatomate, YouTube) is available here: Automated YouTube Shorts Factory — n8n Workflow (Script → Voiceover → Video → Upload)

Happy to answer questions about any of the nodes or the error-handling design.

The script validation step is where these factory workflows usually make or break.

If you generate the audio directly from raw LLM output without validating pacing and sentence boundaries, the voiceover timing gets desynced from the video background clips very quickly. Adding a quick regex validation pass before the TTS node helped stabilize our rendering runs significantly.