Stripe and Google Analytics: Reconcile Purchases to Payments
GA4 counts what the browser reported, Stripe counts what the bank moved. Here is how to line them up by month, and where the channel question stops.
Google Analytics revenue and Stripe payments will not match, and they are not supposed to. GA4 counts what a browser reported at purchase; Stripe counts money that moved. The way to use both is to reconcile them by month, treat the gap as something to measure, and use GA4 for channel mix and Stripe for totals. What you cannot do with these two sources alone is name the channel that brought a specific paying customer.
Two systems, two questions
GA4 is event data. A purchase event fires if the page loads, tracking is allowed, and the event carries a value. Stripe is the processor: a charge succeeds, or it does not. The two agree only when every payment happens on a tracked page, with consent, with the right value, in one currency.
That is why a plain subtraction rarely gives zero. The point of the reconciliation is to learn how large the gap is, whether it is stable, and which part of the business it comes from.
The reconciliation, month by month
Build a small table with one row per month and these columns: GA4 revenue, GA4 purchases, Stripe gross volume, Stripe successful payments, the gap and the gap as a share of Stripe.
Example (illustrative) Month GA4 revenue Stripe gross Gap Gap % of Stripe Aug 41,200 48,000 -6,800 -14.2% Sep 43,900 50,100 -6,200 -12.4% Oct 39,000 52,300 -13,300 -25.4%
In this example the gap is steady for two months and then widens. A widening gap is the signal: something changed in tracking, consent, checkout or billing in October. A stable gap is a calibration factor you can state in the report. Compare against gross volume rather than net, since GA4 revenue is recorded at purchase, before refunds and fees. Our post on why conversions do not match Shopify covers the same family of causes on the store side.
The usual causes of the gap
- Consent and blockers. Visitors who decline tracking buy without a GA4 event.
- Payments off the site. Invoices, payment links, phone orders and renewals reach Stripe without a browser purchase event.
- Refunds. Stripe shows them as their own negative lines; GA4 often never hears about them.
- Currency. The GA4 property has one currency. Stripe rows carry their own, and amounts in a non-home currency should not be added to home-currency totals.
- Time zone. A payment at 11 pm on the last day lands in different months under different zones.
What you can and cannot say about channels
GA4 tells you revenue and purchases by default channel group, and landing page. Stripe tells you payments, customers and subscriptions. There is no shared key: Stripe rows in Quiriz do not carry a channel, and GA4 rows do not carry a customer. So the honest channel statement is a mix statement: GA4 attributes 38 percent of purchases to organic search (an example), applied with care to the Stripe total.
To attribute a specific Stripe customer to a channel, you need to pass an identifier from the site into Stripe metadata or GA4 at purchase. That is a tracking project. Without it, any claim that a given channel brings paying customers is a statement about GA4 purchases, not about Stripe payments. For cost-side work, see customer acquisition cost.
How to do the reconciliation in Quiriz
Connect both. The Google Analytics connector brings daily sessions, key events, purchases and revenue by channel, with metrics named Google Analytics purchases and Google Analytics revenue. The Stripe connector (in beta) brings the Payments and Balance transactions datasets with Gross volume and Successful payments metrics. Then ask:
- What was Google Analytics revenue by month versus Stripe gross volume?
- What was our revenue by channel last quarter?
- How many successful payments did we have each month?
Each answer shows which dataset it used. The definitions are held once in Company Context, so gross volume is not re-chosen each time. Connectors are read-only, refresh daily and are included in paid plans. For the GA4 side alone, see Google Analytics report.
Putting it in the monthly report
Once you know the gap, state it. A sentence such as GA4 recorded roughly 85 percent of Stripe gross volume this quarter, consistent with the last three (an example) tells readers how far to trust GA4 totals. Then use GA4 for what it is good at: which channels and landing pages are rising or falling, and how purchases per session are moving.
Use Stripe for what it is good at: how much money actually arrived, how much was refunded, and how recurring revenue moved. If the two disagree on direction, with GA4 up and Stripe down, treat that as the finding. It often means traffic is growing while something past the click, such as pricing, checkout or payment failures, is not keeping up, and the failed-payment line in the Stripe data is the first place to look.
A note for subscription businesses
If most revenue is recurring, GA4 will undercount it structurally, because renewals happen without a visit. In that case compare GA4 with new payments, the first successful charge for each customer, rather than with all gross volume. The Stripe Customers dataset carries a first payment date for that purpose. The reconciliation then answers a cleaner question: of the new customers Stripe saw, how many purchases did GA4 record?
Limits
- Month totals compare cleanly; customer-level matching does not exist across these sources.
- Stripe metrics count only account-currency rows. If your GA4 property uses a different currency, convert deliberately before comparing, outside the tool.
- If Stripe has more payments than the import cap, the Stripe datasets start later than your first payment, and the earliest months will not reconcile.
Reconcile GA4 to Stripe in one question
Connect both sources and ask for GA4 revenue versus Stripe gross volume by month. Free to start.
Try Quiriz free →