Two things pacing at once stops delivery
The product-side pacer shrinks lifetime to a slice. Exchange pacing spreads the daily budget. Both at once exhaust the slice mid-day. Exactly one mechanism may pace a campaign.
Published 2026-09-09 · Search job: exchange pacing vs budget slices
Exchange pacing and budget slices do not double-smooth. They stop delivery.
The product-side pacer shrinks spend_budget.lifetime to a slice of the day. Exchange pacing, once the line item uses CPM_PACED and pacing: 'daily', spreads the daily budget inside that day. Both at once means the exchange paces a daily budget inside a lifetime slice our pacer is deliberately keeping small. The line item exhausts that slice mid-day and goes quiet. No error is raised. The dashboard can still say the campaign is running.
Exactly one mechanism
The rule is enforced by campaigns.exchange_paces_delivery, from migration 0038_campaign_exchange_paces_delivery.
- If the exchange is pacing, the product-side pacer must not also shrink lifetime.
- If the product-side pacer is shrinking lifetime, the line item must stay on an unpaced strategy.
The flag is written when production activation creates a paced line item. The candidate loader for the product-side pacer filters on it. The column defaults to false because every pre-existing line item really was created unpaced. Applying the migration changed no delivery.
Do not try to infer this from campaigns.pacing. Every historical row already said even while its line item was unpaced. That stored field was a phantom control for four months. Reading it as "the exchange is pacing" would turn the flag into another lie.
Why both at once fail
The two mechanisms answer the same question with different fields.
The product-side pacer treats Beeswax lifetime as a moving ceiling. It pushes a slice, then a larger slice, so spend cannot dump in one hour. Beeswax will not spend past that lifetime number.
Exchange daily pacing treats the daily budget as the thing to spread. It assumes the lifetime envelope is wide enough to hold the day's work.
If lifetime has already been cut to a thin slice, "spread the daily budget" has nowhere to go. The line item hits the slice, stops, and waits. From the buyer's seat that looks like a campaign that cannot spend its own daily budget.
Resume makes this worse if you forget the flag
Resume re-pushes the full multi-day envelope. The product-side pacer is supposed to replace that envelope with the correct slice on the next tick. If the exchange is also pacing, that replacement is the bug. If the exchange is pacing and you also leave a stale slice in place, you get the mid-day stop. Read Resume day burst, then the slice before you change resume behavior.
Pick one. Write the flag. Do not "also add exchange pacing" to a campaign the pacer still owns.