Most campaign reporting measures the wrong things carefully. Open rate to two decimal places, click-through rate charted over twelve months, and no answer to the only question that matters: which of these sends should we do again?
This guide sorts campaign metrics by how much they actually tell you, explains where the standard numbers mislead, covers how attribution works and where it stops working, and lays out a reporting structure you can act on.
The metric hierarchy
Rank metrics by how directly they connect to a decision. Report tier one; investigate with tiers two and three.
| Tier | Metric | What it tells you |
|---|---|---|
| 1 — outcome | Revenue per recipient | Attributed revenue ÷ delivered. The best single number for comparing campaigns, because audience size does not distort it |
| 1 | Attributed orders & revenue | The raw totals. Useful for the business, less useful for comparison |
| 1 | Contribution margin per send | Revenue per recipient minus cost per message. This is what separates channels — an email step and a WhatsApp step with equal revenue per recipient are not equally good |
| 2 — conversion | Conversion rate | Attributed orders ÷ delivered |
| 2 | Click-to-conversion rate | Of the people who clicked, how many bought. Isolates the landing experience from the message: a high click rate here means the email wrote a cheque the product page could not cash |
| 2 | Average order value | Whether a discount bought volume at the cost of margin |
| 3 — diagnostic | Delivery rate | The health check on your list and your templates |
| 3 | Click-through rate | Whether the content and call to action worked |
| 3 | Unsubscribe & complaint rate | The cost side of frequency. Rising complaints is an emergency, not a footnote |
| 3 | Open rate | Subject line A/B comparison within a single send — and nothing else |
Two numbers that lie to you
"Sent" is not "delivered"
When a provider returns success, it means the message was accepted for delivery — it took responsibility. It does not mean anything arrived. Messages can still bounce, be silently dropped, hit a per-recipient cap, or fail because a template was rejected.
The practical consequence: calculate every rate against delivered. A campaign with 10,000 sent and 9,100 delivered has a conversion rate 10% better than the one you would report against sent — and, more importantly, a 900-message problem you should be looking at.
This matters most on the channels people check least. Email bounces are visible; a WhatsApp template silently failing a per-recipient limit, or an RCS message that quietly downgraded to SMS, are the ones that go unnoticed for months.
Open rate is a measurement artefact
Opens are tracked with an invisible image. Apple Mail Privacy Protection loads that image on the recipient's behalf regardless of whether they read anything, and other clients block it entirely. So your open rate is a blend of real opens, phantom opens, and invisible real opens.
It remains useful in exactly one situation: comparing two subject lines in the same send to the same audience at the same time, where the distortion applies equally to both. Any other use — trend lines, benchmarks against other brands, leadership reporting — is measuring your list's device mix.
Channel-specific version of the same trap: a WhatsApp read receipt only arrives if the recipient has read receipts enabled. WhatsApp "open rates" are therefore structurally lower than email's, which says nothing about performance. Compare clicks and conversions across channels; never compare opens.
How attribution actually works
Attribution answers: when this order arrived, which campaign should get the credit?
Why URL parameters are not enough
The intuitive approach is UTM tags: a shopper clicks a tagged link, the parameters land in the URL, and the order records them. It falls apart in ordinary use. The shopper clicks the link, browses, refreshes, navigates to a different product — and the parameters are gone. Later they return directly and buy. From the URL's point of view, that purchase came from nowhere.
Robust attribution records the touch server-side: when a contact clicks a campaign link, that click is stored against the contact. When an order later arrives — including via a webhook with no browser context at all — it is matched back to the most recent qualifying touch inside your lookback window.
Last-touch, and being honest about it
Most platforms, including CampGain, use last-touch attribution: the most recent qualifying interaction gets the credit. It is the right default because it is simple, stable, and comparable across campaigns.
It is also an estimate. Real customers see an email, a social ad, and a WhatsApp message before buying. Last-touch hands all the credit to the final click. Multi-touch models spread credit across the journey, but they replace one arbitrary assumption with several.
The workable position: use last-touch consistently for comparing campaigns to each other, and never present attributed revenue as the store's total revenue. They are different numbers measuring different things, and conflating them is how marketing teams end up claiming more revenue than the business made.
The lookback window
How long after a click can an order still be credited? A short window under-credits considered purchases; a long one credits campaigns for orders they had nothing to do with. Match it to your purchase cycle — a few days for impulse categories, longer for high-consideration products — and then leave it alone, because changing it retroactively rewrites your history.
The funnel is where diagnosis happens
Campaign metrics tell you a send underperformed. The on-site funnel tells you why. Track four stages, and read the drop-off between them — that is what localises the problem in a way no email metric can.
| Stage | What it means | If people stall here |
|---|---|---|
| 1. Product viewed | Traffic arrived and looked at something | The message promised something the product page did not deliver — wrong products, wrong price expectation, or a landing mismatch |
| 2. Added to cart | Interest became intent | Shipping cost or delivery time is doing the damage. Classic, and fixable by stating both in the email |
| 3. Checkout started | Intent became commitment | Payment options, a forced account creation, or an unexpected total |
| 4. Purchased | Commitment survived checkout | — |
Each of those is a different fix, and none of them is "rewrite the subject line" — which is where teams reflexively go when a campaign underperforms.
Build a dashboard around decisions
Design each view around the decision its reader is about to make.
| Cadence | Reader | What it shows | The decision it feeds |
|---|---|---|---|
| Daily | Whoever runs sends | Did yesterday's campaigns deliver, are complaints or failures spiking, is anything stuck | Operational — scanned in a minute, acted on today |
| Weekly | Marketing lead | Revenue per recipient by campaign and channel, top and bottom performers, funnel drop-off | Next week's plan |
| Monthly | The business | Attributed revenue by channel, list growth net of unsubscribes, repeat purchase rate | Trends, not events |
Testing: fewer, bigger tests
Most campaign A/B testing produces noise, because ecommerce list sizes cannot detect the size of difference being tested.
- Test one variable at a time, and make it a real difference — two versions of an offer, not two synonyms in a subject line.
- Decide the metric before you send. If you test subject lines and evaluate on revenue, you are measuring the whole email, not the subject line.
- Run to a pre-committed sample size. Stopping when one variant looks ahead manufactures winners that never repeat.
- Retest anything that mattered. A result that does not survive a second run was noise.
Test structural things — send timing, discount versus no discount, three steps versus five, channel order. Those produce differences large enough for a normal list to detect.
What CampGain measures
CampGain reports on two layers: what your campaigns did, and what shoppers did on your store.
- Per-step and per-contact campaign results — sent, delivered, opened, and clicked for every step and every recipient, with the provider's stated reason on each failure. A step that underperforms tells you whether it was the audience, the template, or the channel.
- Server-side attribution. Campaign clicks are recorded against the contact, so an order arriving later by webhook — with no URL parameters anywhere — is still matched to the campaign that earned it.
- Attributed revenue by campaign, by step, and by channel, plus a daily series, so you can see whether the WhatsApp step or the email step carried the sequence.
- A storefront funnel — product views, cart adds, checkouts started, and purchases over your chosen period, with conversion rate between each stage and the top products by view and cart rate.
- A live event feed for checking that tracking is working before you trust a report built on it.
Segments feed campaigns and campaigns feed these reports, so "which segment produces revenue" is answerable rather than inferred. Our segmentation guide covers building the audiences, and the multi-channel campaign guide covers sequencing the sends. See the analytics features for the full list.
The short version
Report revenue per recipient, calculated on delivered rather than sent. Use open rate only for subject line comparisons within a single send. Pick last-touch attribution with a lookback window that matches your purchase cycle, and never present attributed revenue as total revenue. Diagnose underperformance in the funnel rather than in the email.
Do those five things and your reporting stops being a monthly ritual and starts being the reason next month's campaigns are better than this month's.