Even pacing that never reached the exchange
campaigns.pacing was stored, echoed in the API, and rendered on the dashboard. CreateBeeswaxLineItemArgs had no pacing field. The buyer's even request never reached Beeswax for four months.
Published 2026-09-09 · Search job: campaign pacing not working
Campaign pacing is not working if the value you stored never became a field on the line item. For four months, campaigns.pacing was a phantom control.
The buyer's request was persisted. It was echoed in API responses. It was rendered on the dashboard. CreateBeeswaxLineItemArgs had no pacing field at all. Even after the right strategy name was known, the value could not travel. Every historical row already said even while its line item was created unpaced. That is an independent bug from misreading the CPM pacing 400. You can know the correct strategy and still drop the field at the adapter boundary.
Two lies that look like settings
The first lie is a stored enum that reaches nothing. Health checks that asserted campaigns.pacing === 'even' printed "pacing is even so spend spreads across the day" while the fleet burned a whole day's budget in one hour. The field was present, well-formed, and inert.
The second lie is inferring exchange behavior from that stored enum. campaigns.exchange_paces_delivery exists because the stored pacing string cannot tell you whether Beeswax is pacing. New paced line items write the flag at activation. Old line items stay false. Read the flag, or read the live line item. Do not read campaigns.pacing and conclude the exchange is spreading spend.
What a buyer-facing control has to survive
When you add a control, check that it reaches the provider payload, not only that it is persisted and displayed. The checklist that would have caught this:
- Is the field on the create-args type that the adapter serializes?
- Does
OPTIONSon the line item show the nestedbidding.pacingenum? - Does a paused write-and-restore return 200 with the value you sent?
- Does the PATCH path send the whole
biddingobject so a later bid update cannot strip pacing?
Item 4 is load-bearing. Beeswax replaces the bidding block on PATCH. The old updateLineItemCpmBid hardcoded strategy: 'CPM', pacing: 'none'. After the strategy correction, that update would have silently unpaced the next campaign an optimizer touched.
If your dashboard says even and the line item says CPM plus pacing: none, the product is showing a preference. It is not pacing. Use Daily pacing, not lifetime pacing for the payload that actually returned 200. Read the live line item before you change targeting to "fix pacing." The setting you already stored may never have left the database.