One Black Friday master, three markets: EU, UK, Australia cards
One clean master, a different price card per market: EU prior price, UK total with delivery, Australian end date. Three $0.20 jobs. Read 2026-10-05.

Do not edit three videos for three markets. Keep one clean master with no burned text, and burn a different price card per market with video captions: the EU card shows the prior price, the UK card shows the total with delivery, and the Australian card shows a real end date. Each is a $0.20 caption job for a clip up to 60 seconds.
What each regulator emphasises (read 2026-10-05)
The table is a creative checklist drawn from three primary pages, not a legal summary, and the ACCC page was only readable as a summary. A card that is fine in one market can fall short in another, which is the reason to generate it from market data.
| Market | Source | Point to build into the card |
|---|---|---|
| EU | Directive 2019/2161 Art. 6a | Price reductions indicate the prior price, the lowest in at least 30 days |
| UK | CMA209 summary | Total price up front, including mandatory delivery fees; drip pricing is illegal |
| Australia | ACCC Black Friday statements | Limited-time claims and countdowns must match the real sale end |
Generate cards from data
One data record per SKU feeds all three. The script below builds the three request bodies offline. Send each to POST /v1/video-captions with its own idempotency key (SKU, market, version). The EU prior price and the end date come from your own records, which is the point of the exercise: nobody types a number into a card.
Currencies are spelled out (EUR, GBP, AUD) to keep the sample free of glyph questions. In production use whichever form your style renders correctly, and check a frame.
import json
sale = {"price": 59.0, "delivery": 4.99, "prior_30d_low": 69.0, "ends": "Mon 30 Nov, 23:59"}
cards = {
"eu": [f"Was EUR {sale['prior_30d_low']:.2f} (30-day low)", f"Now EUR {sale['price']:.2f}"],
"uk": [f"GBP {sale['price'] + sale['delivery']:.2f} delivered", f"Ends {sale['ends']}"],
"au": [f"AUD {sale['price']:.2f}", f"Ends {sale['ends']}"],
}
for market, lines in cards.items():
cues = [{"text": t, "start": 0.5 + i * 3, "end": 3.0 + i * 3} for i, t in enumerate(lines)]
print(market, json.dumps({"video_url": "https://example.com/master.mp4", "cues": cues}))Keep the master clean
A master with no burned text is what makes this cheap. If you bake a price into the footage, every market has its own edit. If a market's rules change, you change one cue template and re-run the jobs for that market only. Add the market to the file name, so the Australian clip is never posted to a UK ad account.
Limits
Three markets means three reviews. Regulation covers more than the price card: spoken claims, small print and the landing page matter too, and local rules (national transposition of the EU directive, for example) differ. Get local advice, and do not use a market's card in another market just because it passed there. Also decide in advance who signs off each market's card, so approval does not bottleneck the whole set on the day before the sale, and keep the three outputs in separate folders named by market and version.
Sources
Related posts
More in Use cases
- One dance, 50 mascots: Kling motion control batch cost and keys
One 12-second reference against 50 stills on Sume motion control: 50 x $1.89 = $94.50. Key each job by still and reference so a retry never double-bills.
- One video for Reels ads, TikTok App Bundle, Shorts: what length
Reels ads allow 0 s to 15 min, TikTok App Bundle 5 to 60 s, Shorts up to 3 min. A 21 to 30 second file satisfies all three. Read from each vendor page.
- One-minute talking photo: five H3 Max lip sync clips, $6 at 768p
H3 Max lip sync takes 5-14.8 s of audio per clip. A 60-second spoken script is five 12 s clips: $3.75 at 480p, $6.00 at 768p, $12.00 at 1080p on Sume.
- One motion clip, six colorways: Kling 3.0 Motion Control, $1.89 each
Kling 3.0 Motion Control bills $0.1575 per second. One 12-second motion clip applied to six product stills costs $11.34. The inputs and limits are inside.
Written by Sume