Skip to main content
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. 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 with period 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:
For an NPS split, use match value {"kind":"npsBucket","bucket":"detractors"}; the other buckets are promoters and passives.

Common Queries

How did our February newsletter perform?

Without time filters, you get lifetime metrics for the campaign.

How many opens in the first 24 hours after send?

Useful to gauge initial engagement before the campaign matures.

Compare campaign performance over a specific week

Who opened or clicked in this campaign?

Use the Get Recipients endpoint with a campaignId filter to see individual recipient engagement:

Responses