Campaign Analytics
Track delivery, engagement, and conversions across every campaign you send.
Metrics
The campaign detail page surfaces real-time stats:
- Sent / delivered - provider-confirmed delivery
- Opened / clicked - engagement events. Opens exist on email (the tracking pixel) and on WhatsApp and Viber, where they read as "Read"; an in-app message has no separate open, because the impression is the open
- Conversion rate and revenue - the campaign's own conversion goal, counted with its window and attribution model. See What counts as a conversion
- Per-variant breakdown for A/B tests
- Statistical significance badges showing whether variant differences are real or random - see Statistical Significance for the math
- Channel-aware metrics - a metric the channel cannot emit reads "Not measured", never 0.0%. Nothing observes an open on SMS, push, in-app, webhook or wallet passes, and nothing observes a click on a webhook, which has no recipient at all
Not sent
A campaign's sent count can be lower than its audience, and the Not sent card says why. It lists the people the send deliberately did not message, once each, by the reason recorded for them at send time, with a count and share per reason. Select a reason to see who is behind it (names follow the personal-data rules: without the pii:view permission, name attributes marked as personal data are masked).
| Reason | What it means |
|---|---|
| Held out as control group | Held out on purpose to measure the campaign's impact - not a failure. See Control groups |
| Held out by the workspace control group | In the workspace-wide holdout. See Global control group |
| Frequency cap reached | A touching rule would have been exceeded |
| On a suppression list / Unsubscribed from this list / Unsubscribed from this channel / Unsubscribed from this sending number | The person opted out, or is suppressed |
| Email address suppressed | The address unsubscribed or hard-bounced, possibly under another profile |
| Quiet hours | Quiet hours were set to skip. When they are set to delay, the message waits and is sent later, so it does not appear here |
| Send volume cap reached | The campaign's maximum number of sends was reached |
| Missing email address / Missing phone number | The profile has no address for this channel |
| Shares an address with another recipient | One copy per address - the other profile already got it |
| Opted out just before the send / No coupon code available | Checked by the channel worker at the moment of sending |
On a repeating campaign a person counts once, by their latest skip, even if a later send reached them.
No uplift for small sends
The Versus control group panel compares the people who received a campaign with its control group. A send with fewer than 20 eligible people runs without a control group (see Under 20 people - no control group), so there is nobody to compare against. Instead of an uplift figure the panel says:
Control group skipped: audience of 2 is too small to measure.
An uplift computed against an empty or one-person control group would be a number without meaning, so none is shown. On a recurring campaign where some sends had a control group and others did not, the uplift is measured on the sends that had one, and the panel says how many sends are not included. The What worked ranking counts such campaigns separately instead of listing them. The workspace control group still applied to these sends, so it can still appear in the Not sent card.
How open and click rates are calculated
Every open and click rate is unique people over messages delivered - on the campaign page, the verdict and the channel average it compares with, the variant table and preview, campaign lists, the dashboard, A/B results, the API and the AI connector. One campaign shows one number everywhere.
| Channel | A rate is a share of |
|---|---|
| Email, SMS, WhatsApp, Viber | delivered - the provider confirms delivery, and a message that bounced was never there to open |
| Push | sent - delivery is reported by the device, and iOS cannot report it while the app is in the background, so delivered undercounts |
| In-app | displayed - the impression is the open |
When nothing has been reported delivered yet (for example a provider webhook that is not reaching us), the rate falls back to sent and is labelled "of sent". The click rate is clickers over delivered, not over openers; the share of openers who clicked is shown under it as click-to-open. Delivered itself stays a share of sent. Bots are excluded unless you switch to Incl. bots.
Open and click rates on recurring campaigns
A campaign that sends more than once - recurring, triggered, or resent - puts every occurrence under the same campaign id. Counting unique openers against every delivery ever made under that id gave the whole campaign a rate a tenth of the one each individual send showed.
So a multi-send campaign reports a send-weighted per-message rate: for each send, its own unique openers over its own deliveries, summed. That is the weighted average of the rows in the By send panel below it, and the percentages are labelled "of messages delivered" rather than "of delivered" so the denominator is on screen. A campaign that sent once is unchanged and still reads as a share of recipients.
What counts as a conversion
A conversion is always the campaign's (or journey's) own conversion goal - the event picked under conversion tracking, with its conditions, its conversion window and its attribution model. Every figure called "conversions" uses that one rule:
| Where | What it counts |
|---|---|
| Conversion rate on the campaign page | Conversions credited to the campaign by its attribution model, within its window |
| A/B table, per variant | The same conversions, split by the variant whose message got the credit, so the variants add up to the campaign's total. The control group received nothing, so no model can credit it: it counts the people who reached the goal within the window after the moment they would have been sent |
| Versus control group (uplift) | Both groups answer the same question: did the person reach the goal within the window after they were sent (or would have been). There is no attribution model here, because the control group has no message to credit, so a group's figure can differ from the attributed count above |
| What worked ranking, dashboard "Extra goal conversions" | The same uplift as the campaign page, each campaign on its own goal. A campaign with a control group but no goal is counted, not ranked |
| Content performance "Converted" | The goal of the campaign or journey each message belongs to, credited to the variant or journey message; a message with no goal shows a dash |
Orders and revenue are a separate view. A purchase can be credited to a campaign whose goal is a click: it then shows as an order of that campaign, never as one of its conversions. Order and revenue figures are labelled as orders or revenue - the orders line in the headline, "Incremental revenue (orders)" on What worked, "Bought" on Content performance, and "Bought something" on Message frequency, which counts purchases because it covers the whole workspace and has no campaign goal.
Before 2026-10-14 some of these counted something else, so their numbers change: the A/B table counted everyone who reached the goal after their send (including people another campaign had the credit for), What worked and the dashboard widget counted buyers for every campaign whatever its goal, and Content performance showed purchases as its only conversion figure.
Headline
The card at the top of the page states the result in one line, for example "1,240 reached, 6.0% clicked", followed by what the campaign drove. That sentence always starts with the campaign's goal:
- The campaign has a conversion goal: the conversions and the conversion rate, with the conversion revenue when there is any.
- No goal yet: "Set a conversion goal to see what this campaign drove.", with a link to the campaign's conversion settings. A workspace that does not sell online is never asked to connect a store.
Orders follow as their own labelled line: "Orders: 3 orders, $120." when orders were attributed to the campaign, or, when a store is connected (Shopify, WooCommerce or Magento) and none were attributed yet, "No store orders have been attributed to this campaign yet." Until 2026-10-14 a connected store's orders replaced the goal in this sentence.
Engagement over time
One bar per day (or per hour for a window of a day or less): opens, or reads on WhatsApp and Viber, stacked over clicks. For a one-time send the days are counted from the send ("Day 1" is the day it went out); days with no activity are shown as empty bars, so "Day 3" is always the third day.
With Unique on (the default), each person counts once - in the hour or day of their first open, and of their first click - so the bars add up to the opened and clicked figures above the chart. With Total, every open and click counts, repeat ones included, so one person can appear many times. The bars also follow the bots switch, like the rest of the page. A line under the title says which count you are looking at.
When the campaign has a conversion goal, Conversions appear in their own strip under the bars, on the same days and with their own scale, because conversions are usually far fewer than opens and would not be visible on the same scale. They are the same attributed conversions as the conversion rate on the page: the same goal, conditions, window and attribution model, for the same date range, so the strip adds up to the conversion count. Each conversion sits on the day it happened. The footer says how soon most people converted, measured per person from the message the conversion is credited to, for example "Most conversions arrived within 2 days of the message."
Without a conversion goal the chart shows opens and clicks only, and the footer links to the conversion settings.
Bot exclusion
The campaign detail page excludes bot-flagged events by default - opens and clicks fired by mailbox-provider link prefetchers (Apple Mail Privacy Protection, Gmail's image proxy, Outlook safelink scanners) and security scanners no longer inflate engagement metrics. Per-user event timelines and compliance exports still include all events. See Event Explorer → Bot exclusion for details.
Machine opens. An open is a machine open, and does not count as the person opening, when it comes within 5 seconds of the send, from Apple Mail Privacy Protection's addresses, or from Gmail's image proxy within 20 seconds of the send (Gmail fetches images as the message arrives). A browser reporting a version of Chrome older than 80 is a security scanner, for opens and clicks. A person who clicks an email has opened it, even when every open we saw was a machine's: a click proves the open (email only - WhatsApp and Viber keep their read receipts). In the Recipients list a person shows as Opened with at least one real open or click - the same rule as the open rate - and someone whose only opens were machine opens stays at Delivered with a Machine open only tag. Each open and click in the person's timeline says who opened it (for example "Gmail image proxy" or "Browser - Chrome on macOS").
Security-scanner bursts. Some company mail filters open every link of a message seconds after it arrives, from what looks like an ordinary browser. When one recipient clicks 3 or more different links of a message, each within 15 seconds of the last, the whole burst counts as a bot: every click in it, including the ones before the third link, and an open up to 60 seconds before it. Those clicks and that open no longer make the person a clicker or an opener, and the person's timeline marks them as bot with the reason "Part of a security-scanner burst". A click more than 15 seconds before or after the burst still counts as the person's. To decide this, an open or click is recorded shortly after it happens - about 30 seconds for a click, about 90 seconds for an open in the first 10 minutes after sending - always with the time it happened; the link itself opens at once. Opens and clicks recorded before this rule keep their earlier label.
Deliverability signals
The Deliverability signals card on an email campaign shows bounces, unsubscribes and spam reports, each with its rate and, where one is published, the threshold it is measured against.
- Bounced is split into Hard (permanent - the address does not exist or refuses mail, and is suppressed) and Soft (temporary - a full mailbox or a busy server). The parts add up to the Bounced figure; a bounce with no recorded type is shown as Other. The split uses the same counting rule as the Bounced total and as the Deliverability report.
- Auto-replies counts the messages answered by an out-of-office or other automatic reply. The email was delivered, so an auto-reply is not a bounce: it is never part of Bounced, the bounce rate or its 2% threshold. Auto-replies are recognised from the returned message itself; one whose returned message cannot be tied to a send is shown on the contact's timeline but not on a campaign. The row appears only while returned-mail handling is turned on: when it is off, auto-replies are not recorded, so a campaign without any shows no row rather than a misleading 0. A campaign that recorded auto-replies while it was on keeps showing them after it is turned off.
Date range
The date button at the top right of the campaign page (it reads All time until you pick something) picks the period. It is the same date-range picker the journey analytics uses: the presets Today, Yesterday, Last 7 days, Last 30 days, This month, Last month and All time, each showing its dates, and a Custom Range section with a start and an end date. A one-time send also offers windows measured from the moment it went out (First 1h, First 6h, First 24h), and the button reads All time since send until you pick one. A custom range covers both days in full; until both dates are picked, the page shows all time.
Unique or total
Next to Human / Incl. bots is a Unique / Total switch. Unique (the default) counts each person once: someone who opened three times is one open. Total counts every open and every click, and the number of unique people moves to the line underneath ("400 unique people · 2.5× per person"). The percentages always stay on unique people, because a rate over total opens can pass 100% and says nothing about how many people you reached.
Related
- A/B Testing
- Statistical Significance
- Custom Dashboards - build campaign widgets with channel + metric filters