New: AI voiceover + auto-captions - script to captioned video in one API call. Read the announcement

How-to

Faceless YouTube Shorts Automation: Render a Month of Uploads

Run a faceless Shorts channel from a spreadsheet. Lock one format, write a batch of facts, and render 30 identical-looking uploads in a single pass.

Faceless YouTube Shorts Automation: Render a Month of Uploads

A faceless Shorts channel is a format plus a content queue. Lock the format in a template, keep the queue in a spreadsheet, and one request per row renders the whole month. A daily channel costs about 15 credits a month. Setup takes an afternoon; refills take minutes.

The finished video

This guide renders Science Fact of the Day — a 24-second 9:16 short built to loop: a full-bleed hook question, the fact, a white break card holding the big number, a payoff, and a channel sign-off that dissolves back toward the opening frame. A cyan progress rail fills across the top so the viewer always sees how much is left.

Eighteen fields change per row. Watch the output on the template page before you write anything.

What you need

  • A Renderly API key. Create one in the dashboard under Settings → API keys.
  • A spreadsheet with one row per upload.
  • Two landscape photographs per short, at URLs that serve the file directly.

Step 1 - Lock the format before the content

This is the decision the rest of the page depends on, and it is the one most people get backwards. A faceless channel is not thirty videos. It is one video played thirty times with different words in it.

Pick a template and stop editing it. Every upload then shares the same colour, type, pacing and progress rail, so the fourth short a viewer sees is recognisable as yours. That recognition is the entire asset, and it is the thing a per-video editing session destroys without anyone noticing.

The practical consequence: you are never designing again. You are only writing rows.

Step 2 - Write a batch of facts, one row per short

One column per template variable, one row per upload:

hook_questionfact_headlinestat_valuestat_unitfact_numberimage_1
Which came first: sharks or trees?Sharks are older than trees.450Myears of sharks.047https://cdn.example.com/shark.jpg
How deep does sound travel?Whale song crosses oceans.1,600kilometres, in the deep channel.048https://cdn.example.com/whale.jpg

channel_name and source_label stay the same on every row — write them once and fill down. fact_number increments, which is what makes the run feel like a series rather than a pile.

Line breaks matter here. hook_question, fact_headline and payoff_line sit in fixed boxes at display sizes, so put a real newline where you want the line to wrap rather than letting a long value find its own break.

Step 3 - Split each narration line into a lead and an accent

The narration burned onto each footage frame is not one variable. It is two:

{
  "caption_1_lead": "You have this",
  "caption_1_accent": " backwards.",
  "caption_2_lead": "Wood is the",
  "caption_2_accent": "newer invention."
}

The lead half sets in white and the accent half in cyan, so the pair puts the emphasis exactly where the sentence lands rather than colouring a whole line. There are four pairs — scenes 1, 2, 4 and 5.

Write the accent as the shortest phrase that carries the surprise, usually the last two or three words. Mind the leading space: " backwards." keeps the gap after the white half, and dropping it joins the two words together on screen.

Step 4 - Render the batch with one request per row

One row becomes one POST:

curl -X POST https://renderly.video/api/v1/renders \
  -H "Authorization: Bearer $RENDERLY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "templateId": "science-fact-of-the-day",
    "replacements": {
      "hook_question": "Which came first:\nsharks or trees?",
      "fact_headline": "Sharks are older\nthan trees.",
      "stat_value": "450M",
      "stat_unit": "years of sharks. The first tree\ngrew 60 million years later.",
      "payoff_line": "Every forest is\nyounger than a\nshark.",
      "caption_1_lead": "You have this",
      "caption_1_accent": " backwards.",
      "source_label": "Fossil record · Devonian",
      "fact_number": "047",
      "channel_name": "Strange But True",
      "image_1": "https://cdn.example.com/shark.jpg",
      "image_2": "https://cdn.example.com/forest.jpg"
    },
    "webhookUrl": "https://your-app.com/hooks/renderly"
  }'

Any field you leave out keeps the template's default, so a row with a missing photograph still renders. That is convenient and it hides mistakes, so check the batch before the run rather than in the finished videos.

Loop the spreadsheet and send thirty of these. The request returns a job ID immediately, because rendering is asynchronous. The Google Sheets guide has the loop as an Apps Script, and the CSV guide has it as a resumable script for a file on disk.

Step 5 - Collect the finished shorts and queue the uploads

Because webhookUrl was included, Renderly posts back per job:

{
  "event": "render.completed",
  "data": {
    "jobId": "cm9x2k4p10001qw8r7a3b2c1d",
    "status": "COMPLETED",
    "outputUrl": "https://cdn.renderly.video/renders/cm9x2k4p10001qw8r7a3b2c1d.mp4",
    "creditsUsed": 0.5,
    "durationInFrames": 720,
    "fps": 30
  },
  "timestamp": "2026-08-14T09:12:44.110Z"
}

Write outputUrl back to the row. Uploading is a separate job — the YouTube Data API, or a scheduler that takes a file and a publish time — and separating the two is the point. Render the month in one pass, then release one a day.

Payloads are signed with HMAC-SHA256. Verify the signature before you trust the body — the webhooks guide covers the check.

What this costs at scale

Renderly bills 1 credit per minute of 1080p output, rounded up to the nearest half credit. This short runs 24 seconds, so each upload costs half a credit.

Shorts per monthCreditsPlanCost
30 — one channel, daily15Creator, $29/moincluded
300 — ten channels, daily150Creator, $29/moincluded
3,0001,500Business, $99/moincluded

A daily channel uses 5% of the Creator plan, which is the number worth sitting with: the cost of running a faceless channel is not the rendering. It is finding thirty facts worth watching.

Where to go next

The queue is the hard part, and it lives in a spreadsheet. Wire that up with the Google Sheets guide for a list you keep editing, or the CSV guide for a batch you export once.

For why a fixed template beats generating each video from scratch — brand consistency, unit cost, and identical output every run — read template-based vs AI-generated video.