Why Your GA4 Funnel and Your Revenue Report Disagree

Nothing errors. The report renders, the percentages look plausible, and a team spends a quarter optimising a step that was never the problem. Here is how the gap opens and how to find which cause is yours.

KISSmetrics Editorial

|11 min read

A GA4 funnel counts sessions that contain a step. Your revenue report counts people who bought. Those are different denominators, so the two numbers can both be correct and still disagree by a wide margin. Almost every reconciliation exercise that starts with “the funnel must be broken” ends with the discovery that it was measuring something else.

This is the single most expensive misunderstanding in web analytics, because it is invisible. Nothing errors. The report renders, the percentages look plausible, and a team spends a quarter optimising a step that was never the problem. What follows is how the gap opens, how to work out which cause is yours, and what changes when the funnel is scoped to a person instead.

The newsletter

Join our KISS newsletter

One short read a week on what actually moves revenue, in a free email. Read by 10,000+ operators and founders.

No spam. Unsubscribe in one click.

I.The gap is not a bug, it is the unit of measurement

Two reports disagree because they count different things. Until you name the unit, no amount of tag debugging will close it.

A.What a GA4 funnel is actually counting

Open Funnel exploration in GA4, drop in four steps, and the report tells you how many users completed each one. The word users is doing a lot of work there, because the scope that decides whether a step counts is the session.

By default the steps have to occur within one session. GA4 will show you a user count, but the sequence it is testing lives inside a session boundary. A person who views a product on their phone at lunch, reads reviews that evening, and buys from a laptop on Thursday has done every step in your funnel and completed none of it as far as the report is concerned.

The same five people, counted two ways

Funnels view
Product viewed
100100%
26% drop
Added to cart
7474%
45% drop
Checkout started
4141%
71% drop
Purchased, session-scoped
1212%
Purchased, person-scoped
2929%
Illustrative, not measured. The shape is the point: the last two rows are the same purchases. The only thing that changed is whether the steps had to happen inside one visit.

The longer your consideration cycle, the wider the gap gets. An impulse purchase closes in one session and the two numbers nearly agree. A B2B trial that takes three weeks and two devices will show a funnel conversion rate that bears no relationship to the revenue report, and the gap will grow every time you improve the top of the funnel without improving same-session closing.

B.Why this survives so long unnoticed

Broken tracking announces itself. A tag that stops firing produces a cliff in a chart and somebody files a ticket. A scope mismatch produces a plausible number, and plausible numbers are never investigated.

The usual trigger for finally looking is finance. Someone notices that the funnel says 300 purchases and the billing system says 640, and the analytics team is asked to explain a discrepancy that was there all along. By then a quarter of optimisation work has been aimed at the wrong step.

II.Four reasons the numbers separate, in the order to check them

Two of these cost nothing to rule out. Check those first, because the other two are engineering work.

A.Session scope, and the timeout that creates sessions you did not intend

The first cause is the one above. The second is subtler and compounds it: what counts as a session is itself a rule you did not choose.

GA4 closes a session after 30 minutes of inactivity, and it also starts a new one when the campaign source changes mid-visit. That second rule catches people out. A visitor who arrives from an email, opens a new tab from a Google search for your brand, and returns to complete a purchase has generated a new session at the moment of the campaign change. The purchase now sits in a session that never contained the earlier steps.

Anywhere a payment provider redirects offsite and back, the same thing can happen through a different mechanism, because the return trip may arrive with a referral source that is not yours.

B.Open versus closed funnels, and event ordering

A closed funnel requires people to enter at step one and pass through in order. An open funnel lets them enter anywhere. The default in GA4 exploration is closed, which is usually not what a real journey looks like.

Two things break closed funnels routinely. Returning customers skip steps, arriving from an email straight into checkout without ever hitting the product page in that session. And events that fire in an unexpected order, which is more common than teams expect: an add_to_cart that fires on page load for a pre-filled basket will land before the view_item, and the sequence test fails on a journey that plainly happened.

Which cause, and what it looks like

Diagnosis view
SymptomLikely causeCost to check
Gap grows with consideration timeSession scopeFree
Purchases missing for returning customers onlyClosed funnel, skipped stepsFree
Step 1 much larger than any other report saysEvent fires on load, not on actionLow
Sharp loss at the payment step specificallyOffsite redirect or blockerMedium
Totals low across every step by a similar ratioConsent gate or ad blockerMedium
Numbers change when you re-run the same reportSampling or thresholdingFree to confirm
Work down the list. The first two are settings, not code, and between them they explain most of the gaps we see.

C.Data that never arrived

The fourth cause is loss, and it is the one people reach for first even though it is usually the smallest. Ad blockers, consent gates and tracking prevention all remove some share of events. What matters for a funnel is that the loss is not evenly distributed.

It concentrates on the steps furthest down, because those pages are more likely to sit behind a redirect, load a payment iframe, or run after a consent decision that a visitor has by then had time to decline. A uniform 12% loss would leave your conversion rate unchanged. A loss that is 5% at the top and 20% at the bottom invents a drop-off that never happened. Our breakdown of ad blocker impact covers how to size your own share, and GA4 data thresholds covers the reporting side of the same problem.

III.Diagnosing it, and what a person-scoped funnel changes

Reconcile against one number you trust absolutely, then remove the session from the definition.

A.The reconciliation that settles it

Start from the bottom, not the top. Take one day, and compare the count of your final funnel step against the count of orders in your billing system. Billing is the only number in this exercise that is not an estimate.

If the final step already disagrees with billing, you have a data loss problem and no amount of funnel configuration will fix it. If the final step matches billing but the funnel conversion rate looks wrong, the loss is in the definition, and you are looking at scope or ordering. That single comparison splits the problem in half in about ten minutes.

Then widen the funnel window and re-run. If the numbers move materially when the steps are allowed more time, you have confirmed session scope as the cause without writing any code.

1
day
enough to diagnose
2
numbers
final step against billing
4
causes
and the split rules out half
What the reconciliation tells you, depending on where the numbers stop agreeing.

B.What changes when the unit is a person

Every cause above except outright data loss comes from the same root: the session is the unit of analysis, and a session is an artefact of measurement rather than a thing your customer did. Nobody has ever decided to have a session.

Kissmetrics resolves every event to a person across devices and months, so a funnel step counts when the human did it, not when they did it inside an arbitrary thirty-minute window. The three-week B2B journey and the two-device purchase are one record. There is no open-versus-closed setting to get wrong, because the question being asked is whether this person did these things, in this order, ever.

It also removes the reconciliation ritual. When the funnel and the revenue report are built on the same person-resolved events, the answer to “why do these disagree” is that they do not. And any drop-off in the funnel opens as the list of people who stopped there, which is the thing you actually wanted when you asked why step three was losing everybody.

There is a real trade. A person-scoped funnel will not tell you about single-visit behaviour, and sometimes single-visit behaviour is exactly the question, particularly for a landing page or a checkout flow you have deliberately built to close in one sitting. For that, session scope is right and GA4 is fine. Our complete guide to funnel reports covers when each is the correct unit.

Verdict

When a funnel report and a revenue report disagree, the instinct is to assume something is broken. Usually nothing is. Two systems are counting different denominators, and both are right about the thing they are counting.

Reconcile the final step against billing first. It takes ten minutes and it tells you whether you have a data problem or a definition problem, which are fixed by completely different teams. Then decide, deliberately, whether the question you are asking is about a visit or about a person, because that choice is the funnel.

Continue Reading

ga4 funnelfunnel analysisconversion funnelga4 troubleshootingsession scopefunnel explorationdata discrepancy
KISSmetrics

Build your business intelligence layer for free.

KISSmetrics scans your site, works out the steps and builds the funnel with the person as the unit, so a three-week journey across two devices counts once and the reconciliation stops being a monthly ritual.