Ad buying tests
Trafficking, pacing, budgets, dayparting, and the settings that silently stop a campaign.
A lifetime cap that silently became one day
An optional lifetime budget was coalesced to the daily budget on every Beeswax write path. The campaign looked uncapped in our database and stopped after day one.
Budget fields have to move together
Beeswax rejects any line item with daily greater than lifetime. The first pacer moved only lifetime. Five campaigns succeeded because their windows had closed. Five still inside the window were rejected. The job still read succeeded.
CPM now, CPA when the payload is honest
Beeswax CPA on this seat requires cpa_target, cpa_event, and max_bid. Live tests run as CPM with conversion measurement attached. CPA pacing exists in the catalog. It has not been write-verified on a live line item.
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.
Dayparting is not on the targeting catalog
Targeting-keys returns 50 keys and no clock. Bid modifiers have 66 keys, including time_of_week and user_time_of_week. Checking one catalog was how we said dayparting did not exist.
Dayparting uses the viewer's clock
user_time_of_week is evaluated in the viewer's local timezone. It cannot deterministically spread fleet spend across the UTC day. time_of_week's zone is unresolved between UTC and EST/EDT docs.
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.
How to traffic a campaign you can actually judge
Attach HUMAN FraudSensor Banner tag add-on 44 at $0.05 CPM, request IVT and viewability fields, and judge on IVT and click-to-page-view. Never judge remnant display on CTR.
One trafficking change per day
About 5,000 impressions and 20 clicks a day is too little signal if two things moved. Write the revert command before you apply the change. REVERT is a normal outcome.
Prepaid runway vs a paused portfolio
auto_paused_daily_cap is a healthy enrolled state for a fixed-daily fleet. Zero running campaigns after the cap is correct. Prepaid runway without reading auto-reload is a countdown you may be inventing.
Resume day burst, then the slice
Resume re-pushes the full lifetime envelope. The pacer must null paced_lifetime_budget_cents so the next tick writes the slice. Leave the stale value in place and the campaign can burn the day in one hour.
Segment targeting from a real catalog
LiveRamp and Data Marketplace segments on this product resolve against 43,175 real third-party rows across 13 provider IDs. Unknown keys are rejected. The inactive write probe created expression 23441 and attached no line item.
Time of week is counted in minutes
user_time_of_week runs from Sunday midnight as minutes, 0 to 10079. A range of [9, 12] is three minutes, not a 9 to 12 morning window. An hours implementation would compile and never deliver.
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.
We built a pacer because we misread one error
Setting pacing on CPM returns 400 because that strategy is not paced. The seat has CPM_PACED. The trailing reach-out sentence is boilerplate. The misread cost four months and a product-side pacer.