# Weekly video ad batches

Open **Ads → Video batches**. A batch creates one campaign and one ad set/ad group on either **Meta (Facebook and Instagram)** or **TikTok**. Up to 100 uploaded videos become separate ads sharing the batch's daily budget. Create separate batches for different networks/accounts. Each new week can reuse the previous batch's settings without reusing its videos.

## Prepare and launch

1. Connect the client's advertising account through Zernio and sync accounts. Publishing access alone does not grant advertising or reporting access.
2. Choose **New video batch**, the platform, connection and advertising account. Set a shared daily budget, destination, countries, goal and end date. Conversion goals need the correct network pixel and conversion event. TikTok can use an explicitly authorized identity ID; otherwise its connected identity settings apply.
3. Set a KPI, separate pause/restart thresholds, minimum per-video spend/impressions, lookback, cooldown and maximum restarts. Cost per conversion and CTR work on both networks. Purchase ROAS requires Meta purchase-value reporting; it is not inferred for TikTok.
4. Upload MP4/MOV files, up to 100 MB each, or select existing workspace videos. Add default copy and optionally edit each video's name, headline and body. Partial successful uploads remain selected if a later upload fails.
5. Save the draft. Review every video and the shared budget. Existing ad approval chains apply to the whole snapshot, including automatic rules. Then explicitly approve and start the batch. This authorizes campaign creation and automatic actions inside those reviewed settings.

The worker prepares videos and creates the first campaign paused. Later videos attach to its existing ad set/ad group and inherit its budget, targeting and schedule. The campaign activates only after every video has a confirmed ad. Meta uses asynchronous video processing; TikTok uses its standalone video-create contract. A processing delay or provider restriction can require attention before activation.

The batch's daily budget is **not multiplied by its video count**. Existing other campaigns and previous weeks still have their own budgets. A new batch does not stop or replace older campaigns. Check the end dates and all account budgets before approving another week.

## How decisions work

Checks run approximately every 15 minutes, subject to queue/provider capacity. Each rule reads the **individual ad's** performance. It never substitutes the campaign average. The 1–30-day window uses UTC calendar dates, including today. Provider attribution and reporting latency apply.

For example, with a cost-per-conversion pause threshold of 40, a restart threshold of 30, a minimum spend of 50 and 1,000 impressions:

- An ad with 80 spend, one conversion and enough impressions qualifies for a pause.
- An ad with 80 spend and zero **confirmed** conversions also qualifies. A missing conversion metric remains unknown and causes no action.
- An ad paused by this workflow may restart after its cooldown when delayed conversions improve its cost per conversion to 30 or less. It does not restart merely because time passed.
- Restart requires remaining allowance. Set maximum restarts to zero for pause-only operation.

CTR uses percent units. Lower cost per conversion is better; higher CTR/ROAS is better. Distinct thresholds and cooldowns avoid immediate oscillation. Missing/partial reports, missing currency, truncated ad details and stale measurements cause no automatic change.

## Human control and recovery

**Hold automation** excludes that video from automatic actions and leaves its current delivery switch unchanged. **Pause batch & stop automation** stops automatic changes and requests a pause of this batch's campaign. A successful response is checked against the provider. The configured native end date also limits the flight.

An ad paused outside this workflow is not automatically restarted. Detected external switch changes put the video on hold. Manual edits through Hyperchat's ordinary Ads screen also put a batch video on hold. Native managers cannot always expose who last changed an already-paused switch; use Hold automation before taking over a video there.

Network failures can happen after a provider accepts a write. Such outcomes are marked unconfirmed and are **not retried automatically**. Check the provider, then link the existing Meta video/ad ID in the recovery controls. Linking a resource invalidates the previous approval. Confirmed failures can be reset for an explicit retry. Definite rate-limit rejections wait before trying again. A new draft does not resolve an uncertain prior write.

Paused or failed preparation does not delete uploaded files, ads or campaigns. Older batches, their creative, approvals and history remain available. Budget changes require a new reviewed batch; these rules do not increase budgets. Monitoring is not a real-time spend cap or a performance guarantee.

## Installation and verification

The additive `videoAdBatches`, `videoAdItems` and `videoAdEvents` tables hold state. Existing `adRules` are unchanged and their legacy 50-rule limit does not apply to the videos within a batch. Workers use the existing Zernio key, Convex scheduler, media storage and approval policy. Deploy the matching backend before the frontend.

`tests/video-ads.spec.ts` covers both network payloads, shared-budget attachment, 100-video batches, individual metrics, missing/zero data, minimum samples, cooldowns, restart limits, approvals, workspace isolation, holds, interrupted writes, recovery and end dates. Provider tests use fixtures; they do not certify a real customer account or spend money. `/demo/video-ads` is an interactive example with clearly fictional metrics and no connected provider.

Before enabling on a real account, verify its permissions, identity, tracking events, currency and observed reporting with a small explicitly approved campaign. In particular, cost-per-conversion meaning depends on that network's goal and attribution setup.

## Provider references checked October 30, 2026

- [Zernio create API](https://docs.zernio.com/ad-campaigns/create-standalone-ad): shared ad-set attachment on Meta and TikTok; PAUSED creation holds the highest newly created object while lower objects remain on.
- [Meta creatives](https://docs.zernio.com/platforms/meta-ads/creatives) and [creative library](https://docs.zernio.com/platforms/meta-ads/creative-library): video IDs, asynchronous upload/processing, existing ad-set attachment.
- [TikTok Ads](https://docs.zernio.com/platforms/tiktok-ads): standalone video, identity and shared ad-group support. The cross-platform `imageUrl` field carries TikTok's video URL.
- [Meta lifecycle](https://docs.zernio.com/platforms/meta-ads/lifecycle) and [OpenAPI](https://docs.zernio.com/api/openapi): campaign vs individual switches, live `configuredStatus`, conversion fields, rate-limit and error contracts. Provider availability can change.
