Black Friday teaser video for a Shopify store: a batch plan
Shopify's BFCM checklist says to send warm-up emails with hints and teasers. Make one teaser per product from a sheet with a Sume Format bulk run.

A Black Friday teaser is a short video that hints at the offer without stating it, and one product row in a sheet can become one teaser. Sume's Format bulk runs queue up to 100 such runs at once, each item shaped like a single run, so a whole catalog's warm-up clips go out as one request.
The timing comes from Shopify's BFCM checklist, read 2026-09-30: it tells merchants to "Send 'warm-up' emails with hints and teasers" and to start teasing the offer early. The build steps come from Sume's Bulk runs docs.
What should a teaser say and not say?
Shopify's wording is hints and teasers, so the clip names the product and the date, and leaves the price and discount out. That is also a good fit for a batch: no price field means no per-row price to get wrong. Put the rule in the instruction of every item, for example "no price, no discount percentage, end on the sale date".
For the later phase, when the sale is live and the clip needs days-left cues, use the burned-in countdown approach instead.
How does a sheet become a batch?
The Format cookbook has a sheet-driven recipe where each item carries a row key and a product URL, as in "input": { "sheet_no": 45, "product_url": "…" }. Skip rows with no finished copy on your side; the docs say there is no empty item.
{
"concurrency": 2,
"items": [
{
"instruction": "9:16 teaser, no price, end on the sale date",
"input": { "sheet_no": 45, "product_url": "https://shop.example.com/p/45" },
"generation_spend_cap_usd": 20
},
{
"instruction": "9:16 teaser, no price, end on the sale date",
"input": { "sheet_no": 46, "product_url": "https://shop.example.com/p/46" },
"generation_spend_cap_usd": 20
}
]
}How do I send it safely?
POST the body to /v1/formats/{handle}/{slug}/bulk-runs with a key that has formats:write, and set an Idempotency-Key such as teaser-2026-bfcm-v1 so a retry does not enqueue twice. The response is a queue id; poll GET /v1/format-run-queues/{queue_id} and keep your own map of sheet row to items[i].index.
| Item | Rule in the docs |
|---|---|
| Queue size | Up to 100 items per request |
concurrency | Integer 1 to 16, otherwise 400 invalid_request |
| Each item | The body of a single Format run |
| Retry safety | Idempotency-Key header; a different payload under the same key is 409 idempotency_conflict |
| Cancel | Per child run; there is no cancel-queue endpoint |
What do I check before the emails go out?
Open each finished child at GET /v1/format-runs/{run_id}, watch every teaser once, and confirm none shows a price. Re-run only the failed rows with a new key. Details on caps are in the spend cap post.
Sources
Related posts
More in Use cases
- Shopify image max 4472 x 4472 px: what Sume's image API outputs
Shopify.dev caps product images at 20 MB and 4472 x 4472 px. gpt-image-2.5 on Sume stops at a 3840 edge and 8,294,400 pixels, so it sits under the pixel cap.
- Shopify product video at 3840x2160: which Sume model lists 4K?
Shopify.dev caps product video at 3840x2160 (UHD/4K). Sume lists a 4K tier on gemini-omni-flash-1.1 for 3 to 10 seconds in 16:9 or 9:16. Request and checks.
- Shopify product video limit: 1 GB, 10 minutes, and Sume clip lengths
Shopify.dev lists 1 GB and 10 minutes as the product video maximum. Sume clips run 2 to 30 seconds per request; Timeline can join up to 1800 seconds.
- Shopify product video formats MP4, MOV, WEBM: what Sume returns
Shopify.dev lists MP4, MOV and WEBM for product videos. Sume Timeline, video filter and video trim return an MP4, which is one of the three formats listed.
Written by Sume