Gift guide by budget: three short Timeline renders beat one long one

Split a holiday gift guide into under-$25, $50 and $100 brackets, one short Timeline render each, and plan all three free first. Each is $0.10 a started minute.

4 min readSume
All posts

Make one short render per budget bracket (under $25, under $50, under $100) instead of one long guide. Each bracket is a separate Timeline 1.0 job at $0.10 per started output minute, and the free plan endpoint tells you the segment count and billable minutes of all three before you spend anything.

Why brackets, not one long guide

A shopper with a $25 limit does not want to sit through $100 products. A bracket clip answers the query they typed ("gifts under $25") in the first frame. It also gives each clip its own landing page, caption and posting time. The one-long-guide approach, which the blog already covers in the 20-stills guide, is better when you want a single hero asset. Brackets are better for search-led and paid placements.

Plan all three first

POST /v1/timeline-1.0/plan runs the schema and URL checks and the compiler, and returns duration_seconds, segment_count, billable_minutes and estimated_cost_usd_micros. It creates no job, reserves no credits and downloads no media. It cannot predict short-source pad or loop warnings.

The script builds one plan per bracket. Each slot shows a still for 3 seconds with a quarter-second fade. Stills are static holds, so do not expect motion from them. Every URL must be a media.sume.com artifact or asset in your workspace, so import product images first.

import json, os, urllib.request

BRACKETS = {"under-25": ["mug", "socks", "candle"], "under-50": ["scarf", "gloves"],
            "under-100": ["bag", "watch", "speaker"]}

def plan(names):
    video = [{"source_url": f"https://media.sume.com/artifacts/artf_demo/{n}.png",
              "start": i * 3, "duration": 3,
              **({"transition": {"type": "fade", "duration": 0.25}} if i else {})}
             for i, n in enumerate(names)]
    body = {"audio": {"mode": "silence", "duration_seconds": 3 * len(names)}, "video": video}
    req = urllib.request.Request(
        "https://api.sume.com/v1/timeline-1.0/plan", json.dumps(body).encode(),
        {"Authorization": "Bearer " + os.environ["SUME_API_KEY"],
         "Content-Type": "application/json"})
    return json.load(urllib.request.urlopen(req))

for name, items in BRACKETS.items():
    p = plan(items)
    print(name, p["duration_seconds"], p["segment_count"], p["billable_minutes"])

Rules the plan will enforce

Check these before you scale a bracket past a handful of products.

Timeline 1.0 limits relevant to bracket guides, from the docs, read 2026-10-05
LimitValue
Video slots per render1 to 200
Output length1 to 1800 seconds
Transition lengthAt most 1 s and at most 50% of the shorter neighbour
Chained fadesMore than 8 adjacent fades is refused (too_many_chained_transitions); insert a hard cut
Default output1080x1920 MP4

Price cards per bracket

Burn the price after the render, not inside it: one caption job per bracket clip ($0.20 for a clip up to 60 seconds) with cues such as the product name and price. A price change then re-runs only a caption job.

Limits

A bracket promise ("everything under $25") must hold for every product in the clip at the price shown. If a price moves over the line, take it out and re-render, rather than leaving it in the clip. Three renders also mean three reviews. If you do not have the time, one clip is better than three unreviewed ones. Review each bracket on a phone: the price in the first frame must be readable, the order of products should rise in price or in appeal, and no product should appear in two brackets with two different prices. Name the files with the bracket and the date, so the version in the ad account is obvious.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume