Daily pacing, not lifetime pacing
Lifetime pacing on this seat requires an end date. Adprime Zero campaigns may have no lifetime cap. Daily pacing does not need an end date and is the setting that returned 200.
Published 2026-09-09 · Search job: how daily pacing works
Daily pacing is how even delivery works on this seat. Lifetime pacing is the setting that looks similar and then refuses the write unless you invent an end date the product does not require.
An Adprime Zero campaign may have no lifetime cap. total_budget_cents is optional. Forcing an exchange-side end date just to unlock lifetime pacing would recreate the silent-stop failure that already halted campaigns three times: a campaign that is supposed to run until paused would stop because we manufactured a flight end.
Lifetime pacing returns 400 with Cannot pace unless an end date is set. That is seat-verified against a paused line item on September 4, 2026. Daily pacing needs no end date. It matches what a buyer choosing even delivery means: spread today's budget across today.
The payload that returned 200
Verified live, then restored byte-identically after each attempt:
- Strategy
CPM_PACED pacing: 'daily'pacing_behavior: 'even'
Beeswax accepted that block and auto-set catchup_behavior: 'even'. ahead plus catchup: 'smooth' also returned 200. pacing: 'flight' returned 200. pacing: 'lifetime' returned the end-date 400. Plain CPM plus pacing: 'daily' still returned the old "Bidding strategy CPM is not enabled for pacing" message, which is a different mistake: we built a pacer because we misread one error.
The mapper that emits this payload is beeswax-paced-bidding-strategy.ts. It is the single source for create and for later bid updates. Beeswax replaces the whole bidding object on PATCH. If the update path hardcodes strategy: 'CPM', pacing: 'none', the next optimizer touch silently unpaces a campaign that the buyer asked to keep even.
Daily is not lifetime, and neither is dayparting
Daily pacing answers when our money goes out on our clock, inside one UTC day. It does not need a campaign end date.
Lifetime pacing answers the same question across a flight, and this API will not accept it without an end date.
Dayparting answers a different question: what local time a viewer sees the ad. That lives on bid modifiers, not on bidding.pacing. See Dayparting uses the viewer's clock.
Use daily. Keep the selection in one place. Do not invent an end date so you can type lifetime.
If a campaign has no lifetime cap, daily pacing plus the 30-day open-ended envelope is the combination that does not require a flight end. Lifetime pacing would force that end date. Forcing the date so the enum looks nicer is how a campaign that should run until paused grows a silent stop. The September 4 write-and-restore is the proof you need: daily returned 200, lifetime returned 400, and the object was put back the way it started.