Analytics
Get Campaign Metrics
Retrieve engagement metrics for a specific campaign.
GET
Get Campaign Metrics
Returns engagement metrics (sends, deliveries, bounces, opens, clicks, replies, unsubscribes) plus attributed conversions, revenue, a per-link click breakdown, and any Poll or NPS survey summaries for a single campaign. Optionally filter engagement metrics by time period. Test sends are excluded from these performance metrics, attributed revenue, and poll results by default so previews do not skew results, but they still count toward send usage and quota. Open and click metrics also exclude detected email-security scanners and tracked brand assets by default.
For an NPS split, use
Without time filters, you get lifetime metrics for the campaign.
Useful to gauge initial engagement before the campaign matures.
GET /api/v1/campaigns/{campaignId}/stats is kept as a backward-compatible alias for this endpoint.
Path Parameters
string
required
The ID of the campaign.
Query Parameters
string
Sliding time window. One of:
1h, 24h, 7d, 30d, 90d. Ignored when
start and end are provided.string
Start of custom time range (ISO 8601). Must be used with
end.string
End of custom time range (ISO 8601). Must be used with
start. Max range: 90
days.string
Optional recipient mailbox provider filter, e.g.
gmail, microsoft,
yahoo, icloud, orange. Scopes engagement metrics and the clicked-link
breakdown to recipients whose address is classified to that provider.
Provider-filtered responses report replies, conversions, and
revenueCents as 0 because those metrics cannot be segmented per provider.boolean
default:"false"
Set to
true to include detected scanner, preview, and tracked asset
open/click events in engagement metrics.How a period is applied
When you filter withperiod or start/end, the response is a funnel over
the sends made inside that window, not a log of events that happened inside it.
sent counts those sends, and every delivery, engagement, and reply count is
attributed to one of them - including a reply or an open that arrives after the
window closes. Activity on sends that predate the window is excluded, so
opened <= delivered <= sent always holds and no rate can exceed 100%.
conversions and revenueCents are the exception: they use the goal’s own
last-touch attribution window rather than the send cohort.
opened and clicked are unique counts deduplicated by email send: one
recipient opening the same email five times counts once. Rates divide by
rateDenominator (delivered, falling back to sent), which is returned
alongside rateDenominatorBasis so you can reproduce the arithmetic.
Response Fields
Each
clickedLinks item includes the destination url, the number of clicks on it, and percentage - that link’s share of every recorded link click. Links are ordered by click count and capped at the top 20. Like polls, the breakdown covers the campaign’s lifetime clicks even when engagement metrics are filtered with period, start, or end. Scanner and asset clicks are excluded unless includeMachineEngagement=true.
Each polls item includes blockId, variant, question, attributeKey, totalResponses, and an answers distribution. Every answer includes its human-readable answer label and stable stored value; use value as the identifier when labels can change. NPS items also include nps.score, nps.average, and promoter/passive/detractor counts. Single-answer polls count each subscriber once per block using their latest answer. Multi-select polls additionally set allowMultiple: true, count each subscriber once under every option in their latest saved selection, and use the number of respondents as totalResponses, so answer percentages can add up past 100%. Poll summaries are lifetime results for the campaign even when engagement metrics are filtered with period, start, or end.
attributeKey is where each subscriber’s current/latest response is stored. A later poll can overwrite it when the same key is reused, so it is not a historical respondent identifier. To find the exact subscribers behind a campaign count, create a segment with field pollResponse, operator is, and a JSON value scoped to this campaign and the summary’s blockId:
match value {"kind":"npsBucket","bucket":"detractors"}; the other buckets are promoters and passives.
Common Queries
How did our February newsletter perform?
How many opens in the first 24 hours after send?
Compare campaign performance over a specific week
Who opened or clicked in this campaign?
Use the Get Recipients endpoint with acampaignId filter to see individual recipient engagement:
Responses
Get Campaign Metrics