Read performance without fooling yourself
Treat dashboard read time, provider sync time, snapshot spend, and Reporting clicks as different meters. Request clicks plural. Do not lead with CTR on remnant display.
Published 2026-09-09 · Search job: how to read ad campaign reports
Read a campaign report by separating freshness, delivery clicks, snapshot spend, and conversions. If you collapse those columns, a live test will look like zero activity or like a healthy CTR.
Adprime Zero returns a dashboard or API read time and a provider sync time. Those are different clocks. Snapshot rows used for wallet and cap checks are a third source. Reporting API rows are a fourth.
Freshness first
generated_at is when our API responded. It is not proof that provider reporting is current. Use freshness_status, metric sources, and the Beeswax reporting sync timestamp before you treat zero clicks as final. If impressions or spend exist and clicks are zero, inspect those fields. Then inspect the field name.
CLI: ztdsp campaign performance --json, ztdsp campaign stats <campaign-id>, ztdsp reporting beeswax status --campaign <campaign-id> --json. MCP: query_performance, get_campaign_performance, list_campaign_performance. The portfolio summary exists so an agent does not have to list campaigns and loop.
Clicks are plural
Provider delivery clicks on this seat are clicks, not click. That correction landed June 26, 2026. A parser that requests the singular field can print zeros for a campaign that is being billed clicks. Async report keys also arrive label-cased. campaign_id comes back as Campaign ID. A snake_case-only parser reads every metric as zero.
ad_click_tokens are redirects. Snapshot rows store clicks as zero on purpose. Neither is exchange delivery truth. Zero clicks that were a field name is the incident writeup.
Snapshot versus reporting
Hourly Reporting rows and lifetime snapshot rows cover the same auctions. Summing them doubles spend. A derived hour in the dedupe key has already inserted duplicate hours and paused a ten-campaign fleet when $24.46 was read as $48.92. Product reads use the greater of snapshot lifetime spend and the non-snapshot sum. Reporting that doubled spend is the money incident.
If your own spreadsheet sums every row in impression_log_rollups, stop. If your agent reports CPC from snapshot clicks, it is dividing by zero on purpose.
Do not lead with CTR
Remnant display produces billed clicks readily. The June 2026 learning flight was judged on CTR and later thrown out. The later Supply Bench pull showed 1,073 of 1,149 placements with zero clicks taking 64 percent of observed spend, and seven domains producing 41.3 percent of clicks from 4.7 percent of impressions. CTR is a trap.
Judge on concentration, click-to-page-view once the visit join exists, and strict IVT once a vendor add-on is on the creative. Until the add-on is attached, invalid_impressions at zero means nothing is measuring.
Conversions are a fifth column, and only after the event is installed and linked. Set up conversion events before you ask for CPA.
If the report still looks empty after freshness, field name, and source checks, then look at targeting. Not before.