Tracking problems · Marketers, founders and agencies
Why GA4 and Stripe Revenue Do Not Match
GA4 and Stripe revenue often disagree because they record different things. Stripe records payment activity; GA4 reports the ecommerce events your setup sends. Start with the same payments, currency, dates, and refund rules, then compare transaction records. Fix the reason for the gap before changing tags or judging a channel.

1. Decide Which Revenue Figures You Are Comparing
Write down the name and definition of each metric before exporting anything. A Stripe payout is money transferred to your bank, while a purchase event is an analytics record. Comparing those two totals can create a gap even when both systems are working correctly.
| Figure | What It Represents | What to Check |
|---|---|---|
| Stripe successful payments | Payments in the selected payment scope | Status, currency, payment date, taxes and refunds |
| Stripe balance or payout | Funds movement or a bank transfer | Fees, refunds, timing and adjustments |
| GA4 Purchase revenue | Purchase revenue less recorded refunded transaction revenue | Purchase and refund events actually collected |
| GA4 Item revenue | Item-level revenue, excluding tax and shipping | Item price, quantity and discounts |
| Attributed channel revenue | Credit assigned to recorded sources | Model, source scope and matching coverage |
Google's Data API definition of Purchase revenue includes refunded transaction revenue as a deduction. Do not subtract the refund amount again from a number that already includes that deduction. Item revenue has a different scope: Google's ecommerce purchases report excludes tax and shipping from it.
For your first pass, compare successful payments with the corresponding purchase records, before payment-processing fees. Agree whether tax and shipping belong in the comparison. Keep subscriptions, one-time purchases and refunds identifiable. You can investigate payment-to-bank differences separately with the appropriate Stripe financial report.
2. Align Dates, Currencies and Refund Rules
Choose a completed reporting period and record its time zone. Then apply the same boundary to the records you compare. A payment close to midnight can belong to different calendar days when one export uses UTC and another uses a local time zone. Compare the underlying timestamp before calling that payment missing.
- Select the same live Stripe account and relevant GA4 property. Keep test activity out of the live comparison.
- Choose the same currency. Start with one original currency rather than adding converted and unconverted amounts.
- Define the included checkout, subscription and payment statuses. An open invoice or failed attempt is not the same as a successful payment.
- Agree whether refunds are counted when issued or against the original purchase cohort. Keep the original payment reference beside the refund.
- Record the export time and allow recent analytics processing to finish before treating the snapshot as final.
Google's data-freshness guidance says processing can take 24 to 48 hours. That is a reason to recheck recent reports, not an explanation for every missing order. A stable gap in an older completed period still deserves a record-level review.
A useful reporting convention is more valuable than an unexplained adjustment. If a September payment is refunded in October, say whether your October report shows that refund as October activity. Keep that convention in your monthly marketing report so the next comparison uses the same rules.
3. Reconcile a Small Set of Transactions
Take a handful of successful payments and trace each one to an analytics purchase record. Include a refund, a renewal, and a payment near the reporting boundary if those cases exist. Start with enough records to identify a pattern, then expand the check to the full period.
Use an internal sheet with a payment reference, your order reference, GA4 transaction ID, amount, currency, timestamp, refund amount and an investigation status. Keep the sheet in an authorized workspace. Use nonpersonal identifiers and avoid copying customer emails into campaign URLs or public screenshots.
| Observation | Likely Investigation | Next Check |
|---|---|---|
| Payment exists, purchase record absent | Collection or checkout handoff | Check the purchase trigger and supported checkout path |
| Both records exist, values differ | Value definition or currency | Inspect sent value, currency, tax and shipping |
| Several purchase records point to one order | Repeated firing or unstable IDs | Compare transaction IDs and event-sending paths |
| Renewal has no new website visit | Billing and website activity differ | Review how renewals are sent and matched |
| Refund exists only in Stripe | Refund-event coverage | Check the refund event and original transaction reference |
Google's missing-revenue guide identifies value, currency, transaction_id and ecommerce item information as fields to check. A value with a currency symbol or the wrong data type can be a collection problem even when the purchase event itself appears.
For web streams, Google's transaction-ID guidance explains that repeated purchases with the same transaction ID are deduplicated. Use a stable, unique order identifier. A random ID on each page reload can make the same order look different; reusing one constant ID across orders can hide legitimate purchases.
Do not add another purchase tag just because a dashboard total is low. First check whether an existing browser tag, server event, plugin or checkout integration already sends the purchase. Test one supported flow in debug tools, document the expected record, and confirm the resulting report after processing.
4. Explain the Revenue Gap With a Reconciliation Worksheet
Use the worksheet to check your arithmetic after reviewing the records. Enter gross amounts before refunds in both starting fields. Add only verified net adjustments, with the reason kept in your sheet. If the GA4 metric you exported already subtracts refunds, recover the gross basis or use a separate consistent calculation.
| Example Step | Amount | Meaning |
|---|---|---|
| Stripe successful payments | $5,000 | Selected USD payments before refunds |
| Less Stripe refunds | $200 | Stripe net is $4,800 |
| GA4 gross purchase value | $4,500 | Before recorded refunds |
| Less GA4 recorded refunds | $100 | GA4 net is $4,400 |
| Starting difference | $400 | Stripe net minus GA4 net |
| Verified missing net value | +$500 | Supported by checked records |
| Verified excess net value | −$100 | Supported by checked records |
| Remaining difference | $0 | Amounts balance, subject to record-level review |
The example closes a $400 gap by adding $500 of verified missing net value and removing $100 of verified excess net value. Those are net adjustments, not necessarily two purchase events. If one missing purchase also had a missing refund, account for both before entering its net contribution.

A zero remaining difference is useful, but it does not prove that every order matches. Two unrelated errors can cancel each other out. Keep an unresolved status for records without evidence instead of inserting an adjustment whose only purpose is to make the totals equal.
5. Review Payments and Source Credit in Attriboo
Use Attriboo to bring supported payment records beside recorded website activity. Follow the Stripe connection guide, install the website script, and verify the connection with a known supported checkout. Connecting a payment provider and recording a website visit are separate tasks.
Open Dashboard and find Follow the money beneath the revenue summary. Start with All traffic, check the chart's Sales, Refunds and Net amounts, then inspect a paid-ad or AI-search view only when you want that narrower question. The screenshot shows where those controls sit and includes the graph they affect.
Where to find itDashboard → Follow the money → Sales, Refunds and Net
Find the chart below the revenue cards. The overview shows its filters, full graph, legend and axes; the Sales, Refunds and Net summary is enlarged below.
Select the overview to open the full screenshot.
Enlarged detail of the outlined area
- Read refunds with sales
The summary row shows sales, refund deductions and net for the selected chart. A zero refund amount means none are recorded in that view; it does not prove that the provider has never issued one.
Use the revenue definitions guide to keep payment totals separate from channel credit. A recorded payment can remain unmatched to a visitor. Changing First-Touch to Last-Touch changes how recorded touches receive credit; it does not create a missing purchase event in GA4 or recover a website visit that was never tracked.
Check the actual Stripe flow before relying on historical coverage. Attriboo imports supported paid Checkout Sessions and invoices from the last 90 days, up to 1,000 of each. Custom PaymentIntent payments outside Checkout or Billing and refunds older than the connection are not covered by that importer. Those limits can explain a difference that a new tag cannot fix.
Keep the payment ledger available when investigating refunds and unusual transactions. The numbers-differ troubleshooting guide helps separate reporting scope from missing records. Attriboo does not require GA4, and it does not automatically repair GA4 ecommerce events or reconcile every Stripe financial-report category.
6. Turn the Finding Into One Specific Fix
Assign the next action to the cause you found. A missing purchase trigger needs a collection fix. Different time boundaries need a reporting convention. A checkout with no visitor connection needs a matching review. These are different jobs, even when they produce the same headline gap.
For an agency or marketing leader, report the aligned totals, the amount explained, what remains unresolved, and the person checking it. Recheck the same completed period after the fix and compare a new supported transaction. Avoid promising that a reporting change increased sales.
A spreadsheet is often enough for a low-volume reconciliation. At higher volume, a developer or analyst can join authorized exports by a shared order reference and categorize exceptions. Keep that record check separate from the question of which marketing deserves credit. Revenue attribution explains recorded relationships; it is not a replacement for payment reconciliation.
Common questions
Should GA4 revenue exactly match Stripe?
Only expect agreement after aligning the included payments, currency, time boundaries, taxes, shipping and refund basis, and checking collection coverage. Do not choose an acceptable percentage gap before understanding the records. A small difference can hide an important missing payment type; equal totals can hide errors that cancel out.
Why is GA4 revenue lower than Stripe?
Possible reasons include missing purchase events, excluded checkout paths, blocked or unpermitted collection, missing renewals, different date boundaries or a narrower revenue metric. Start with a successful payment and look for its corresponding purchase record. A low total alone does not identify which cause applies.
Why is GA4 revenue higher than Stripe?
Check repeated purchase firing, unstable transaction IDs, different value definitions, missing refund events and different payment scope. Also confirm that you are comparing a purchase metric with successful payments rather than a Stripe payout. Do not remove events until you have identified the affected order records.
Does refunding a payment in Stripe automatically update GA4?
Do not assume it does. Your integration must send the relevant refund information to GA4. Google’s ecommerce guide describes a refund event linked with the transaction_id. Check whether your specific setup sends it, and whether partial refunds carry the intended amount.
Can a subscription renewal exist without a new website purchase event?
Yes. A renewal can be paid through billing without the customer visiting your website again. Check whether your analytics setup sends the appropriate renewal purchase record and how your payment reporting handles it. Keep renewal value identifiable rather than assuming every payment came from a new visit.
Will changing the attribution model fix the revenue mismatch?
It can change which sources receive credit, but it does not repair missing purchase events, incorrect currency values or a mismatched payment scope. Reconcile the payment and analytics records first, then compare channel credit under an agreed model.



