Field guide · 6 min read

How to reconcile GA4 and ad platform revenue with Shopify or Stripe

The short answer

Start from the ledger, not the dashboards. Export one month of orders from Shopify or Stripe, net of refunds, in the store’s time zone and currency. Match GA4 to it by transaction ID, then add up what every ad platform claims for the same month. Claimed revenue divided by ledger revenue is your attribution inflation.

Why the numbers never match

GA4, Meta, Google Ads and your store each count a sale by their own rules, and none of them is wrong by its own definition. GA4 records what its tag observed, and when a visitor denies consent, Google says its tags send cookieless pings that it uses to model the missing data. By default, Meta credits a conversion to an ad that was clicked within 7 days or viewed within 1 day, and its reporting API can date that conversion on the day of the impression. Google Ads dates a conversion by the click, not by the purchase, and uses a 30 day click window unless you change it. Shopify counts orders, and Stripe counts payments.

So the same sale can appear three times, in three different weeks. Google itself says that discrepancies “often up to 20%” are expected between Google Ads and other analytics tools. The gap is normal. Not knowing how big it is, is the problem: attribution inflation showed up in 54% of our 74 published audits.

What each system counts
SystemWhat it countsDated byDefault window
ShopifyOrders, net of discounts and returnsOrder date (returns on the return date)None
StripePayments, refunds, disputes and feesPayment date, in your account time zone or UTCNone
GA4Purchases its tag observed, deduplicated by transaction IDSession date in the property’s time zonePer its attribution settings
Meta AdsConversions after a click or a viewImpression date (API option) or conversion date7 day click, 1 day view
Google AdsConversions after an ad interactionClick date30 day click

Step 1: Pick the ledger and lock the period

Choose one source of truth for revenue. For a Shopify store it is net sales; for a business that bills through Stripe it is the balance report, which lists charges, refunds, disputes and fees. Lock one calendar month, in one time zone and one currency. Stripe lets you report in your account’s time zone or in UTC, and GA4 reports in the time zone set on the property, so a sale at 11pm in one can land on the next day in the other. Write down which you used.

Step 2: Build the order list

Export every order in the month with its ID, date, amount and refund status. In Shopify, gross sales are product price times quantity before taxes, shipping, discounts and returns; net sales take out the discounts and the returns. Shopify books a return on the day it happens, so a refund in March can belong to a February order. Keep refunds on the order they reverse, or your months will not match the ad platforms. Leave out taxes and shipping, because GA4 and the ad platforms usually report product revenue only; check what your setup sends.

Step 3: Match GA4 by transaction ID

GA4 should carry the same order ID on each purchase, and Google requires a transaction ID for purchases and refunds. Google also deduplicates purchases that repeat an ID, so a confirmation page that reloads does not count twice. Join the GA4 purchase export to your order list on that ID and sort the result into three groups: orders GA4 saw, orders it missed, and purchases that do not match any order.

Missed orders usually come from consent choices, tags that did not fire, or checkouts that skip the confirmation page. Unmatched purchases point to test orders, a missing ID or a duplicate tag. GA4 converts other currencies at the prior day’s exchange rate, so small differences in value are expected; differences in order count are not. Write down the match rate. It tells you how much of your revenue GA4 can see at all.

Step 4: Add up what each ad platform claims

Export the conversion value each platform reports for the same month: Meta, Google Ads, TikTok, Microsoft Ads and any affiliate network. Next to each number, record its attribution window and whether it dates by click, impression or purchase. Do not adjust the numbers yet. The point of this step is to see each platform’s claim as it is reported to you and to anyone who manages your budget.

Step 5: Compute the ratio and read it

Divide the total that all platforms claim by your ledger revenue for the month. That ratio is your attribution inflation. Below 100%, the platforms see less than you sold, which usually means tracking gaps or a lot of organic and direct demand. Above 100%, two or more platforms are crediting the same sales.

For example, say the ledger shows $200,000 of net sales in March. Meta reports $130,000, Google Ads $110,000 and an affiliate network $20,000. The platforms claim $260,000, which is 130% of what was sold: $60,000 of reported revenue belongs to sales that another platform also claimed, or to no sale at all. A return on ad spend computed on the claims looks 30% better than the business actually performed.

Share of the 74 published audits where each leak was material. Each figure stands alone; they do not add up.
LeakShare of audits
Non incremental paid spend68%
Attribution inflation54%

Step 6: Decide which number runs the budget

Use the reconciled figure, not the platform claims, for budget decisions. Check it against MER: total revenue divided by total marketing spend, which no platform can inflate. If the platforms claim far more than the ledger shows, the next question is which of the claimed sales the ads actually caused, and that takes a holdout test, not a better dashboard (see how to measure incrementality). Rank what you find by dollars a year, the same way any margin leak is ranked.

Confidence is not the same as measurement. In Nielsen’s October 2025 study, 85% of marketers said they were confident in their ability to measure ROI, but only 32% measured it holistically. A monthly reconciliation is the cheapest way to be in the 32%.

When to repeat it

Run it every month after the books close, with the same ledger, time zone and windows each time, so the ratio is comparable month to month. Run it again whenever a platform changes its attribution settings, a new channel launches, or the checkout or tagging changes.

Questions about reconciling ad platform revenue

Why is GA4 revenue lower than Shopify?

GA4 records only the purchases its tag observed. Visitors who deny consent, tags that fail to fire and checkouts that skip the confirmation page all leave orders out. Match the two by transaction ID first: the share of orders GA4 can see explains most of the gap, before time zone, currency and refund timing.

Why do Meta and Google Ads together claim more revenue than we made?

Each platform credits a sale it touched inside its own window: by default 7 days after a click or 1 day after a view on Meta, and 30 days after a click on Google Ads. A customer who saw both ads is counted by both. Add the claims up and divide by ledger revenue to see how much is counted twice. Attribution inflation, defined →

How often should we reconcile ad platform revenue?

Monthly, after the books close, using the same ledger, time zone and attribution windows each time so the ratio is comparable. Repeat it after any change to attribution settings, tagging, checkout or the channel mix. The break even ROAS your reconciled return must clear →

See how the audit reconciles platform revenue to the ledger →
Request an audit → See the benchmark