NotesArticleSeat-verified

The sentence that cost four months

Bidding strategy CPM is not enabled for pacing" is true for strategy CPM. The reach-out line is boilerplate. CPM_PACED exists on this seat and accepts daily even pacing.

Published 2026-09-09 · Search job: CPM not enabled for pacing

"Bidding strategy CPM is not enabled for pacing. Please reach out to your account team." That sentence is true for strategy CPM. It does not mean this seat cannot pace.

From September 3 to September 4, 2026, the evidence looked complete. Setting pacing to daily, lifetime, or flight on a line item that used strategy CPM returned that 400. CPC returned the identical message. We read a strategy rule as a seat entitlement. We built a product-side pacer that shrinks spend_budget.lifetime into slices so a day's budget would not dump in one hour. The work took four months. The missing string was already in the catalog.

What the error actually says

CPM is not enabled for pacing because pacing is not part of that strategy. Every bidding strategy on GET /rest/v2/ref/bidding-strategies carries a paced boolean. This seat's catalog contains dedicated paced variants:

  • CPM id 1, paced=false
  • CPM_PACED id 3, paced=true
  • plus CPC_PACED id 8, VCR_PACED id 7, and CPA_PACED id 9

The trailing "reach out to your account team" is boilerplate. It is the clause that sent a project to build a workaround instead of changing one field. Credit to Rafal at FreeWheel for pointing at the paced variants and for saying the user docs should be read with the API docs.

What we verified on a paused line item

On September 4, 2026 we probed a paused line item and restored the original bidding block after each attempt. CPM_PACED plus pacing: 'daily' plus pacing_behavior: 'even' returns 200. Beeswax auto-sets catchup_behavior: 'even'. ahead plus catchup: 'smooth' and pacing: 'flight' also return 200. pacing: 'lifetime' returns 400 with "Cannot pace unless an end date is set." Plain CPM plus pacing: 'daily' still returns the old sentence.

We use daily pacing, not lifetime. An Adprime Zero campaign may have no lifetime cap. Forcing an exchange-side end date to unlock lifetime pacing would recreate the silent-stop failure that has already halted campaigns when a lifetime field was treated as a one-day envelope.

Why a true error is still a bad seat verdict

The 400 is not a lie. If you send pacing on CPM, the server is right to reject it. The failure mode is treating a strategy-specific error as an entitlement map. That is the same class of mistake as reading /fields 404s as "no schema" and reading a 50-key targeting catalog as "no dayparting." See Four times we said the seat could not do it.

There is a second, independent reason campaigns.pacing did nothing for four months. CreateBeeswaxLineItemArgs had no pacing field. The buyer's even request was stored, echoed in API responses, rendered on the dashboard, and dropped at the adapter boundary. Even after the right strategy was known, the value could not travel until that field existed.

A true error plus boilerplate reach-out is how a team loses a season. Read the catalog that lists paced. Do not call the account team to ask whether a sibling strategy exists.