You open Stripe, then Google Analytics, then your ad platform — and all three swear they’re right. So which number goes in the report?
Every solo operator hits this wall. One tab says you made 40 sales this week. Another says 52. A third counts 31 “conversions.” Nothing’s broken, but nothing agrees either, and you’re left squinting at a screenshot at 8am trying to decide what’s actually true. Here’s how to reconcile conflicting metrics without a data degree — a method you can run by hand today.
Why your dashboards disagree (they’re not lying)
The numbers differ because each tool is counting a different thing, over a different window, using a different rule. That’s not a glitch. It’s the whole reason they’ll never match on their own.

Three culprits explain almost every mismatch you’ll ever see:
- Different definitions. Stripe counts a completed charge. Analytics counts a “key event” (what GA4 used to call a conversion) that fired in the browser. Your ad platform counts a click it can tie back to an ad. A refund, a failed card, or an ad-blocker splits these instantly.
- Different time windows. One tool reports by the day the sale happened; another credits the day the ad was clicked — sometimes a week earlier. Ad platforms call this the attribution window, and it quietly shifts every total (Google Ads attribution).
- Different time zones. If Stripe is set to UTC and Analytics to your local zone, “this week” literally starts at different hours. Late-night sales land in different buckets.
Five checks that explain most GA4, Stripe and Shopify mismatches
Those three culprits show up as specific settings. Run these checks before you decide any number is “wrong”.
1. The payment page is taking the credit
When a buyer leaves your site for a hosted checkout and comes back to your thank-you page, GA4 can record the checkout domain as a new referral. The sale then gets credited to checkout.stripe.com instead of the video, newsletter or ad that actually brought the buyer, and your channel report stops making sense. Stripe’s own GA4 guide says to add checkout.stripe.com to your referral exclusion list (Stripe Docs: Analyze your conversion funnel). Shopify recommends excluding your own domain, checkout.shopify.com, shop.app (Shop Pay) and any external payment provider such as paypal.com (Shopify Help: Excluding referrer domains). In GA4 this list lives in your web data stream, under Configure tag settings → List unwanted referrals. It doesn’t rewrite history: sessions already credited to the checkout domain keep that credit.
2. “Sales” means different things
Shopify’s sales reports show the value of the goods sold, not the money you received. Gross sales include pending, canceled and unpaid orders, and a refund appears as a negative “sales reversal” on the day it was processed, not on the day of the original sale (Shopify Help: Sales reports). GA4 only knows about a refund if your site sends it a refund event with the original transaction_id (Google Analytics developer docs: Measure ecommerce). If nobody set that up, GA4 revenue never goes down when you refund.
3. The day starts at different hours
Stripe’s financial reports use either your Stripe account’s time zone or UTC, and you choose which (Stripe Docs: How report configuration works). Stripe Sigma’s report templates filter by UTC (Stripe Docs: How Sigma works). GA4 uses the property’s reporting time zone as the day boundary, and changing it only affects data going forward (Google Analytics Admin API: Property). Shopify uses the store time zone set in Settings → General (Shopify Help: Business settings). Put all three on the same zone before you compare a day or a week.
4. A key event isn’t a purchase
GA4 now calls conversions “key events”, and you can mark almost any event as one: a sign-up, a click, a purchase. Each key event is counted either once per event or once per session, depending on its counting method (Google Analytics Admin API: Key events). So “31 key events” can include things that aren’t sales, or count two purchases in one session as one. Compare Stripe with GA4’s purchase event and its revenue, not with the key event total.
5. Some visitors are never counted
With Google’s basic consent mode, Google tags don’t fire at all for a visitor who declines cookies; not even the consent choice is sent. Advanced consent mode sends cookieless pings instead, and GA4 uses modeling to fill part of the gap (Google tag docs: Consent mode overview). Ad blockers can stop the tag too. Stripe and Shopify still record every paid order, which is why the analytics number is almost always the lowest of the three.
| Stripe | Shopify | GA4 | |
|---|---|---|---|
| What counts as a sale | A payment processed by Stripe | Value of goods ordered (gross sales include pending, canceled and unpaid orders) | A purchase event that fired in the browser |
| Refunds | Recorded by Stripe when you refund | A negative sales reversal on the day it’s processed | Only if your site sends a refund event |
| Where the day starts | Account time zone or UTC (your choice per report) | Store time zone | Property reporting time zone |
| Who it misses | Sales paid outside Stripe | Sales made outside the store | Visitors who decline cookies or block the tag |
Links checked September 27, 2026.
The one-page reconciliation method
You don’t need to make the tools agree. You need to know why they don’t, once, so you can trust one going forward. Do this on a single sheet:
- Pick your source of truth for money. For revenue, that’s almost always your payment processor — Stripe, Shopify, or PayPal. Money that actually landed in your account beats any browser-fired estimate. Everything else is a supporting witness, not the judge.
- Write down each tool’s exact question. Next to each number, note what it’s really measuring: “completed charges,” “sessions with a purchase event,” “ad clicks credited to last-touch.” Half your confusion vanishes the moment the definitions are side by side.
- Align the window and the zone. Force all three to the same date range and, where you can, the same time zone. This single step closes most gaps on its own.
- Explain the leftover gap in one sentence. “Analytics is 20% low because ad-blockers stop the event from firing.” “Ads counts 12 extra because it credits clicks from last week.” Once you can name the gap, it stops being scary — it becomes a known, stable offset.
The goal isn’t a perfect match. It’s a reconciled view: one trusted revenue number, plus a written reason for every difference. Do it once and you’ll never re-panic over the same mismatch again.
A quick example makes it concrete. Say Stripe shows 40 sales, Analytics shows 31 key events, and your ad tool shows 52. Aligned to the same week and zone, the story usually reads: Stripe’s 40 is the truth (real charges), Analytics’ 31 is low because 9 buyers had ad-blockers or bought on a second device, and Ads’ 52 is high because it’s crediting clicks from the prior week’s campaign. Three numbers, one reality, no mystery.
The rule that saves your Monday morning
Trust one number for each question, and treat the rest as context. Revenue lives in your processor. Traffic and behavior live in Analytics. Ad efficiency lives in the ad tool — but you sanity-check its revenue claim against the processor, always.
This is the same discipline behind putting your whole business in one place: the value isn’t more charts, it’s fewer arguments with yourself. When the numbers stop fighting, decisions get faster — and switching between all those tabs stops eating your focus.
When the board does the reconciling for you
Doing this by hand works, but it’s a chore you’ll repeat every week. The quieter version is a board where each source is already a live card — Stripe, Analytics, your ad data — refreshing on its own, side by side, on one screen.
In Vexlynk, an agent can read those live cards together and tell you, in plain language, why this week’s three numbers differ — grounded in your actual data, not the open internet, and only when you ask. You still pick the source of truth. It just stops you retyping the reconciliation every Monday.
Frequently asked questions
Which number should I actually report — Stripe or Analytics?
For revenue, use your payment processor. It records money that truly settled. Analytics is an estimate of behavior in the browser and will almost always read a little lower.
Why is Google Analytics always lower than my sales?
Because its key event (formerly called a conversion) doesn’t fire for everyone — ad-blockers, cookie refusals, and people who buy across two devices all go uncounted. There’s no standard size for the gap: it depends on how many of your visitors decline cookies or block scripts, and on whether GA4 receives your refunds. Measure your own gap once, write it down, and watch for changes.
Why does GA4 say my sales came from checkout.stripe.com?
Because the buyer came back to your site from Stripe’s hosted checkout, and GA4 treated that return as a new referral. Add checkout.stripe.com (and any other payment domain, such as paypal.com) to GA4’s list of unwanted referrals, as Stripe’s GA4 guide recommends. It fixes new sessions, not past ones.
Do I have to make all my tools match exactly?
No, and you’ll waste hours trying. Aim to explain each difference in one sentence and pick one trusted number per question. That’s a reconciled view, and it’s enough.
Does Vexlynk change my numbers in Stripe or Analytics?
No. Stripe and Analytics connect read-only. Vexlynk pulls your data in as live cards and reads it; it never writes back or alters anything there.
Which of your dashboards do you actually trust when they disagree — and why that one?
If you’d rather see your real numbers side by side than reconcile them by hand every week, Vexlynk’s free plan puts your first live card on a board in a few minutes.
Vexlynk
Vexlynk Team