There is a specific meeting that happens in every digital business. Marketing reports one revenue number, finance reports another, and someone is asked to “reconcile them”. The reconciliation never fully works, everyone loses an afternoon, and the same meeting happens next quarter.
The numbers do not agree because they are not measuring the same thing. Once you understand precisely where the gaps come from, you stop trying to close them and start using each number for the job it is good at.
This is a companion piece to the web measurement and attribution section of the cheat sheet.
Where the data actually goes missing
A client-side analytics tag has to survive a gauntlet before it reports anything:
- Ad blockers and tracking protection. Anywhere from 10% to 30% of sessions depending on audience — higher for technical products, lower for mainstream retail.
- Browser storage limits. Safari’s ITP caps script-writable first-party cookies at seven days, and in some cases 24 hours. A returning visitor after two weeks is a new visitor.
- Consent. Under GDPR-aligned consent flows, denied users send nothing, or send cookieless signals only.
- Plain network loss. Beacons fired during page unload get dropped, particularly on mobile.
Server-side collection avoids most of that, because the event comes from your infrastructure rather than the visitor’s browser. What it cannot see is on-page behaviour: scroll, hover, rage clicks, the fact that someone opened the size guide three times before buying.
Which is why the honest architecture is both: server-side for anything that must be complete (orders, revenue, refunds), client-side for anything behavioural, joined on a shared identifier. Treat the server-side figure as the source of truth for money, and the client-side figure as the source of truth for behaviour, and stop asking either to be the other.
Why the same week produces three numbers
Say your store did £180,000 last week.
- The payment processor says £180,000. It sees every captured payment. It has no idea which of them were driven by anything.
- The ecommerce platform might say £186,000 — it counts orders at placement, including ones that later failed payment, and may include tax and shipping differently.
- GA4 might say £152,000 — it lost the blocked and unconsented sessions, missed some purchases where the confirmation page never fired, and attributed some to a prior period.
None is broken. A 10–20% gap between backend and client-side analytics is normal and expected. The failure is not the gap; it is treating the client-side number as a financial record. Use the processor for revenue reporting, and the analytics platform for relative comparisons — this channel versus that one, this week versus last — where the missing data affects both sides roughly equally.
Modelled conversions deserve a specific caution. Under consent mode, platforms estimate the conversions they could not observe. Those are statistical estimates with their own error bars, which makes them fine for trend and optimisation and useless for reconciliation to the penny.
Attribution models are not measurement
Here is the uncomfortable part. Every attribution model — last click, first click, linear, time decay, position based, data driven — answers the same question: given that this conversion happened, how shall we divide the credit among the touchpoints we observed?
That is a bookkeeping question, not a causal one. It cannot tell you what would have happened without the touchpoint, because it only ever looks at journeys that were exposed.
The structural biases are predictable:
- Last non-direct click over-credits whatever sits closest to the purchase. Brand search and retargeting look extraordinary, because they are present at the end of journeys that were already going to convert.
- First click over-credits discovery and ignores the work of closing.
- Data-driven attribution compares converting and non-converting paths and is genuinely better than the rules-based models — but it is still observational, and it still cannot see the counterfactual.
The classic demonstration: pause brand search for a fortnight. Attribution says you just switched off your best channel. Revenue often barely moves, because those people were typing your name and would have found you anyway. The attributed value was real credit assignment and near-zero incremental value.
What actually measures incrementality
Incrementality is the conversions that would not have happened otherwise. It is the only number worth setting a budget against, and it is always lower than attributed conversions.
Three ways to get at it, in descending order of rigour:
- Randomised holdout. Withhold the campaign or feature from a random slice and compare. This is a real experiment and gives you a real causal estimate. It costs you the revenue from the holdout, which is the price of knowing.
- Geo experiments. Randomise or match at region level, run the campaign in some geos and not others. Standard where user-level holdouts are impossible. Fewer units means less power, so effects need to be reasonably large.
- Marketing mix modelling. Regress aggregate outcomes on spend, price, seasonality and promotions, with adstock and saturation terms. Privacy-proof and covers offline channels. Low resolution, and vulnerable to collinearity when your channels always move together.
MMM and experiments are complements, not rivals. The strong pattern is to run MMM for the broad allocation across channels, and calibrate it with a handful of geo or holdout experiments so the model is anchored to something causal. If your MMM disagrees violently with an experiment, trust the experiment.
View-through conversions deserve their own warning. A conversion credited after an impression with no click is, in most implementations, mostly a measure of who the platform chose to target. If the algorithm is good at finding people about to buy, view-through will look spectacular regardless of whether the ad did anything. Read it as an audience-quality signal, never as evidence of effect.
Instrumentation that does not rot
Most measurement problems are not analysis problems. They are naming problems that compounded.
Design the event taxonomy before you instrument. For each event: what it is called, when exactly it fires, what properties it carries, and what each property means. If two teams can each ship an event called checkout_started with different trigger conditions, they will.
Use a data layer. Have the page publish a structured object that the tag manager reads. The alternative — scraping the DOM for selectors — breaks silently at every redesign, and nobody notices until a month of data is wrong.
Identity stitching decides whether one person looks like four. When an anonymous visitor logs in, you need to link the device identifier to the user identifier, and ideally backfill their earlier activity. Get this wrong and cross-device journeys fragment, retention looks worse than it is, and attribution assigns the same person’s touchpoints to different “users”.
Filter bots and internal traffic from day one. Crawlers, uptime monitors, scrapers and your own office inflate sessions, deflate conversion rate, and — most damagingly — add pure noise to every experiment you run.
Sessionisation is a per-tool convention. GA4’s 30-minute idle timeout, a warehouse model’s definition, and your testing tool’s definition will not match. Session-denominated rates therefore are not comparable across tools. This is not a bug to fix; it is a reason to state which tool a number came from.
Practical stance
- Payment processor for revenue truth
- Analytics platform for relative behavioural comparison
- Attribution for credit assignment and for spotting starved upper-funnel channels
- Experiments and MMM for incrementality and budget decisions
- Never mix the four in one chart without labelling which is which
Where this connects
- The denominators these numbers land in are covered in product and growth metrics
- Holdouts and geo tests are experiments, so experiment design applies in full
- When you cannot randomise at all, see causal inference without an A/B test
- Every term above, in one line, is in the cheat sheet