Case study · anonymizedIn-house performance-marketing teamOutcome · variants on tap

Testing winners shouldn’t wait on an editor’s queue

A performance-marketing team runs a high-velocity creative-testing program: a winning concept has to spin out into many localized, subtitled variants fast enough to feed the next test cycle. They wired variant rendering directly into their creative-ops tooling with the ZapCap API. Names are anonymized; identifying figures are ranged.

1 → N
One winner → many variants
Localized cuts on demand
days → hours
Winner → variants in market
Keeps the test cadence
0
Render workers maintained
No ffmpeg / GPU queue in-house
per-min
Usage-based billing
Attributed per campaign

01The bottleneck

The team's whole edge is iteration speed: ship a batch of creatives, find the winner, then spin that winner into localized variants for the next cycle. The strategy was sound. The variant production was the choke point.

The moment a concept won, the clock started — and stalled. Every localized, subtitled variant was a manual edit. By the time the variants shipped, the test window had often moved on, so winners got tested late or not at all.

How variant production worked before
  • ·Each localized variant edited by hand after a winner emerged
  • ·Subtitle styling re-applied per variant, inconsistently
  • ·Variant batch queued behind the editing team
  • ·Test windows closed before variants were live
What was needed to keep cadence
  • ·Programmatic variant rendering from a single winning source
  • ·Consistent caption styling across every variant
  • ·Async delivery wired into creative-ops tooling
  • ·Per-campaign usage attribution for spend reporting
  • ·No editing queue between a winner and its variants

02The ZapCap workflow

Variant rendering moved into their internal creative-ops tool. When a creative is promoted to "winner," an operator picks the target languages and a campaign caption template, and the tool batches one ZapCap task per variant.

The tool POSTs the winning source URL to /videos, then fires a task per variant with its language and the campaign templateId. Each task returns a taskId; the webhook handler verifies x-signature, dedupes on eventId, and drops the finished renderUrl back into the creative library against the parent winner.

Most variants ship as burned-in .mp4 straight into the ad accounts. For placements that need a clean alpha layer, the same call requests the transparent (prores4444 / vp9 alpha) output instead.

Variant render path
winning creativePOST /videos/urlPOST /videos/:id/task · per variantwebhookback into creative library

03Technical implementation

The integration landed as a batch action inside the existing creative-ops tool, not a new service. "Promote to winner" gained a "generate variants" step that fans out tasks and tracks each one back to the parent creative.

Failure handling. ZapCap is a normal upstream dependency: signed webhooks, eventId-based dedupe so retries never duplicate a variant, and per-variant status so a single failed render re-queues without blocking the batch.

What was actually built
  • "Generate variants" action in the creative-ops tool — fans out one ZapCap task per language variant.
  • Campaign templateId (UUID from GET /templates) per program for consistent caption styling.
  • Webhook handler · x-signature verified, eventId-deduped, renderUrl filed against the parent winner.
  • Dual output — burned-in .mp4 by default, transparent overlay on request for clean-layer placements.
  • Per-campaign usage tag so per-minute spend maps to the campaign that generated the batch.
  • Per-variant retry — one failed render re-queues independently of the rest of the batch.

04What changed

Variant production stopped gating the test cadence. A winner now spins into its variant batch the moment it's promoted, so the next test cycle starts on schedule instead of waiting on an edit queue.

Spend reporting got sharper. Per-minute usage is tagged per campaign, so each program sees its own variant-rendering cost rather than one shared production line.

Before
  • ·Each localized variant hand-edited after a winner emerged
  • ·Variant batches queued behind the editing team
  • ·Test windows often closed before variants went live
  • ·Caption styling drifted between variants
  • ·Variant cost lumped into one production line item
After
  • Programmatic batch — one task per variant on promotion
  • No editing queue between a winner and its variants
  • Winner-to-market moved from days to hours
  • Consistent caption styling via one campaign template
  • Per-minute usage attributed per campaign

05In their words

Our whole model is iteration speed, and variant production was the one part that couldn’t keep up. Now the moment a creative wins, its localized variants render themselves. The editing queue stopped setting our test cadence.

Performance marketing lead
In-house performance-marketing team · anonymized
Anonymization note: name, logo, and product references withheld pending written customer permission. We'll attach the real attribution here once consent is confirmed. — ZapCap content team
API workflow

A winner becomes a variant batch in four calls

Per variant: pass the winning source URL, create a task with the variant language and campaign template, receive the webhook, fetch the rendered MP4. ZapCap handles transcription, styling, and rendering so the creative-ops tool just orchestrates the batch.

  1. 1

    Upload your video

    POST the file to /videos. We stream it to storage and hand you back a videoId.

    POSTPOST /videos
  2. 2

    Create the captioning task

    One POST starts transcription, styling and rendering with your chosen template. Add a notification webhook to skip polling.

    POSTPOST /videos/:id/task
  3. 3

    Receive the webhook

    We POST status updates to your endpoint as the render moves through transcribing → rendering → completed.

    HOOKPOST → your URL
  4. 4

    Download the finished render

    Burned-in subtitles, served from a global CDN. No watermark. MP4 ready for any social platform.

    GETGET renderUrl
Step 1 / 4·~2s
1import { readFileSync } from "node:fs";
2
3const form = new FormData();
4form.append(
5 "file",
6 new Blob([readFileSync("clip.mp4")]),
7 "clip.mp4",
8);
9
10const { id: videoId } = await fetch(
11 "https://api.zapcap.ai/videos",
12 {
13 method: "POST",
14 headers: { "x-api-key": process.env.ZAPCAP_KEY! },
15 body: form,
16 },
17).then(r => r.json());

POST /videos·Upload your video

Illustrative outcomes after wiring variants into creative-ops

1 → N
One winner spins into many variants
days → hours
Winner to variants in market
0
Render workers maintained in-house
per-min
Usage attributed per campaign

Variant workflow questions

The winning source is passed once, then one task is created per language variant. Each task runs independently through pending → transcribing → transcriptionCompleted → rendering → completed, and the webhook reports per-variant status.

Turn winning creatives into variants on demand

Backend-only API, webhook-native, $0.10/min base usage-based billing. Spin one winning creative into localized, subtitled variants without an editing queue in the loop.