Two kinds of numbers
The fields in an analytics response are not all the same kind of metric. This is the single most important thing to understand, and it’s the usual cause of “the numbers don’t add up”.- Raw event counts —
sent,opened,replied,bounced,unsubscribed. These count events. They are additive: the value for a date range equals the sum of the per-day values. - Unique counts —
unique_lead_count,unique_open_count,positive_replied. These count distinct leads over the requested range (COUNT(DISTINCT lead), deduplicated per campaign by email address). They are not additive.
Date range behaviour
start_date and end_date are inclusive on both ends. Internally the window runs from start_date 00:00:00 to end_date 23:59:59:
- Passing the same date for start and end returns that one full day (
00:00:00–23:59:59), not an empty result. - When a
timezoneis supplied, the day boundaries are calculated in that timezone; otherwise UTC is used.
Time axes: send date vs reply date
Every record is anchored to a point in time. Endpoints differ in which timestamp they filter and group by:- Send date (
sent_time) — the day the email went out. This is the axis forsent,opened,replied, andbounced. The*-by-sent-timeendpoints make this explicit, including for positive replies. - Reply date (
reply_time) — the day the reply came in. This is the default axis for positive replies on theoverall-stats-v2tile andday-wise-positive-reply-stats(see How positive replies are counted below). - Event date — some day-wise breakdowns bucket opens by open time and replies by reply time, so each metric lands on the day the event happened.
Rate formulas
All rates are percentages computed against the unique counts, not raw sends:bounce_rate is calculated per unique lead (bounced / unique_lead_count), not per email sent. If you want the deliverability-style figure (bounced / sent), the raw bounced and sent counts are both in the response and you can compute it yourself.How positive replies are counted
A positive reply is a lead whose lead-category sentiment is positive (lead_categories.sentiment_type = 'positive'), tied to a genuine reply — one that actually replied, is not marked ignored, and did not bounce.
Three things vary by endpoint, and getting them mixed up is the usual reason two positive-reply numbers don’t agree:
- Reply-date vs send-date attribution. Most surfaces (the
overall-stats-v2tile andday-wise-positive-reply-stats) attribute a positive to the date the reply was received. The*-by-sent-timevariant instead attributes it to the date the email was sent. A reply that arrives days after the send lands on a different day depending on which you use. - Unique leads vs response events. Most positive counts are distinct leads (a lead is counted once no matter how many times it replied).
campaign/response-statsis the exception — it counts response events, so a lead replying twice counts twice. This is why itstotal_positive_responsecan be higher than the tile’spositive_replied. - Deduplication across the range. Distinct-lead counts are deduplicated over the whole requested range, so they are not additive — summing single-day calls over-counts. Always query the exact date range you want.
The lead category is mutable: re-categorising a lead (marking it positive, or changing it later) changes historical counts, because the number reflects each lead’s current category, not what it was on the reply date.
