LabArticleOperator-judged

Freshness is not generated_at

generated_at is when our API responded. It is not provider freshness. Use freshness_status, metric sources, and Beeswax reporting sync timestamps.

Published 2026-09-09 · Search job: campaign report freshness

Campaign report freshness is not the timestamp on our JSON. generated_at is when the Adprime Zero API responded. It is local response time. It is not when Beeswax last produced a reporting row. A dashboard that treats generated_at as "data as of" will show a live clock next to a stale or empty click column and look like the campaign did nothing.

If you searched for why a report looks current and empty, read the sync timestamp and the metric source, not the response time.

What to read instead

Use freshness_status when the endpoint returns one. Use the metric source on each column. Clicks that came from source = beeswax reporting are a different freshness from spend that came from beeswax_snapshot. Snapshot lifetime spend tracks the exchange within about a minute. Hourly reporting rows arrive later. Mixing those clocks under one generated_at is how July 2026 readouts looked like zero activity.

Use Beeswax reporting sync timestamps, not the Worker clock. A sync that has not completed, a task_id still pending, or a parse that dropped label-cased keys will all produce zeros with a fresh generated_at. Label-cased report keys and Why a dashboard can show zero clicks.

Why this is a money-adjacent rule

The daily-cap guard reads spend. If hourly reporting is lagged and you only trust generated_at, you can believe the day is empty while the snapshot already shows spend, or the reverse after a duplicate-hour incident. The product read is greatest(max snapshot, sum non-snapshot). Freshness is what tells you which side of that greatest() is current.

We will not treat a fresh response as proof the provider has no clicks. We will not treat a stale sync as proof the placement failed. Prove freshness, then prove the placement. How to judge display traffic still requires IVT and click-to-page-view once those meters exist. Freshness is the gate in front of both.

What we will not do

We will not rename generated_at in a breaking way in this article. We will not pretend it is unused. Clients can keep it as "we answered now." They cannot keep it as "Beeswax answered now." If a later flight still needs a human to explain a zero, this file failed and we will edit it.