TikTok 3-5 creatives per ad group: render five cuts from one Timeline

TikTok's best-practice page suggests 3-5 creatives per ad group. Render five variants from one master by changing one slot, and cost the batch first.

5 min readSume
All posts

TikTok's creative best-practice page suggests 3 to 5 creatives per ad group and 3 to 5 ad groups per campaign. To fill one group, render five variants of a master from one Timeline body, swapping only the opening slot. Each render is its own job with its own idempotency key, so a failed one retries on its own.

What TikTok's page says

On "Creative best practices for performance ads" (read 2026-10-05), the page recommends 3-5 creatives per ad group and 3-5 ad groups per campaign. It also says to refresh creatives when delivery trends decline or daily new users are low, and to add new creatives to an existing ad group instead of creating a new one.

One body, five openings

Timeline 1.0 takes an ordered video[] list. Each slot has a source_url, start, duration and optional source_in, which picks where inside the source the slot begins. Keep the body slots the same in all five requests and change only the first slot's source_in or source_url.

The first slot must start at 0 and later starts must increase. Slots shorter than 0.2 seconds are refused, which keeps fast cuts honest.

for i in 0 1 2 3 4; do
  curl -s -X POST https://api.sume.com/v1/timeline-1.0/render \
    -H "Authorization: Bearer $SUME_API_KEY" \
    -H "Idempotency-Key: ad-group-hook-$i" \
    -H "Content-Type: application/json" \
    -d @"hook-$i.json"
done

Cost the batch first

Timeline is priced at $0.10 per ceil output minute in the docs. A cut of 30 seconds is one billed minute, so five cuts reserve five minutes, or $0.50 at that list rate. POST /v1/timeline-1.0/plan is unbilled and returns the estimate for a body without creating a job; check the live rate in GET /v1/catalog before you commit.

Refreshing later

When TikTok's page says to add creatives to the same ad group, you need new cuts fast. Keep the five JSON bodies in a folder; a refresh is a copy with a new first slot and a new idempotency key.

Poll with GET /v1/jobs/:id/status and fetch /result when done, or use webhook mode if you run many at once.

  • Change one thing per variant.
  • Name files by hook, not by date.
  • Check one frame of each before upload.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume