Meta says 4.2x. Google Ads says 3.1x. GA4 says 1.8x. Your Shopify dashboard says something else entirely, and your bank account has its own opinion. I get some version of this question on almost every audit call, usually phrased as "which one is lying to me?"
None of them. They're all counting honestly, by rules that were never designed to match.
Why do Meta, Google Ads, and GA4 show different ROAS for the same store?
Because each platform answers a different question with a different measuring stick. Five mechanics drive the gap:
- Attribution windows. How far back each platform looks for an ad interaction to credit.
- View-through conversions. Whether an ad someone merely saw gets credit.
- Self-attribution. Every ad platform gives itself 100% of any sale it touched.
- Modeled conversions. How each platform fills the holes left by iOS, ad blockers, and consent.
- Reporting dates. Whether the conversion lands on the day of the click or the day of the purchase.
| Meta Ads Manager | Google Ads | GA4 |
|---|---|---|
| 7-day click plus 1-day view | 30-day click, data-driven credit | Only sees sessions that arrive |
| Takes 100% credit for the sale | View-through in its own column | Splits credit across channels |
| Dated to the ad interaction | Dated to the click, backfilled | Dated to the day of purchase |
| Models iOS conversions it can't see | Models consent gaps in the EEA | A no-click sale looks like Direct |
How do attribution windows change the number?
An attribution window is how long after an ad interaction a platform will still claim the sale. Meta's default is 7-day click plus 1-day view. Google Ads defaults to a 30-day click window with data-driven attribution deciding how much credit each click gets. GA4 runs data-driven attribution too, but with its own lookbacks and its own model.
Same customer, same purchase, three different verdicts. Someone who clicked your Meta ad nine days before buying is outside Meta's reported window but well inside Google's. Stretch or shrink the window and ROAS moves with it, even though not a single real sale changed.
What are view-through conversions and why do they inflate Meta's ROAS?
A view-through conversion is a sale credited to an ad the buyer saw but never clicked. Under Meta's default 1-day view setting, someone who scrolled past your ad Tuesday morning and bought Tuesday night counts as a Meta-driven purchase.
GA4 can't see that. Analytics only knows about sessions that actually arrive on your site, so a purchase with no click looks like Direct or organic. That one difference explains a big slice of the "Meta says 4.2x, GA4 says 1.8x" gap. Meta is answering "did my ad influence this sale?" GA4 is answering "which visit led to this sale?" Different questions.
Why do my platform conversions add up to more than my actual orders?
Because every platform credits itself 100% for shared conversions. If a buyer clicked a Meta ad on Monday and a Google Search ad on Friday before purchasing, Meta reports one purchase and Google Ads reports one purchase. You sold one thing. The platforms reported two.
So summing platform-reported conversions always overshoots your real order count when you run more than one channel. Always. Each platform only knows its own touchpoints, so from where it sits, it drove the sale. GA4 is the only one of the three that even tries to split credit across channels, which is exactly why its per-channel numbers come in lower than what the ad platforms claim.
What about modeled conversions and reporting dates?
Two quieter mechanics finish the job. First, modeling. Since Apple's ATT prompt, Meta can't observe every iOS conversion directly, so it statistically models some into your reporting. Google runs its own modeling, including for consent gaps under Consent Mode v2 in the EEA. Both are educated guesses. Different guesses, built from different data.
Second, dates. Google Ads reports a conversion on the day of the click. Meta reports it on the day of the ad interaction too. GA4 reports it on the day of the purchase. So a Friday purchase from a Monday click lands on Monday in Google Ads and on Friday in GA4. It's also why last week's Google Ads ROAS keeps climbing for days after the week ends.
- Meta click, the 5th — Retargeting ad, no purchase yet
- Google click, the 10th — Search ad, same shopper
- $100 purchase — One order, one deposit in the bank
- Both claim it in full — Meta dates it the 5th, Google the 10th
- $200 attributed — Twice the revenue that actually arrived
What does one $100 purchase look like in each platform?
Follow one order through the machine. A customer clicks a Meta retargeting ad on the 5th, clicks a Google Search ad on the 10th, and buys a $100 product that night.
| Where you look | What it reports | Why |
|---|---|---|
| Meta Ads Manager | $100 purchase, dated the 5th | The purchase happened within 7 days of the click on the 5th, so Meta takes full credit and reports it on the click date |
| Google Ads | $100 conversion, dated the 10th | Last click before purchase, inside the 30-day window, reported on the click date |
| GA4 | Credit split between Paid Social and Paid Search | Data-driven attribution divides the $100 fractionally across the contributing sessions |
| Your bank | One deposit, $100 minus fees | Reality |
Platform-reported total: $200 of "attributed revenue" on $100 of actual sales. Multiply that by every multi-touch order in your account and the mystery dissolves. And if that buyer ran an ad blocker, some pixels never even saw the purchase.
Which ROAS number should you actually trust?
There's a hierarchy of truth, and platform dashboards sit at the bottom of it:
- Backend revenue. Your order system and your bank. The only number that's actually real.
- First-party server-side tracked conversions. Purchases recorded by your own tracking setup, on your own domain, matched against the backend. Built right, it runs within a few points of your real order count.
- Platform ROAS. Meta, Google Ads, TikTok. Directional only. Useful for comparing campaign A against campaign B inside the same platform, because both are measured by the same rules. Never comparable across platforms.
The practical rule I give clients: use platform ROAS to decide which ad wins, use blended numbers to decide how much to spend, and use backend revenue to decide whether the business is actually working.
Do I need first-party server-side tracking to fix this?
You can't make Meta and Google agree, but you can build one number you actually control, and that's exactly what first-party server-side tracking is for. Plain-language version: instead of relying only on each platform's pixel running in the buyer's browser (where ad blockers, iOS, and Safari's ITP cookie limits eat events), a server you own receives every conversion and forwards it to each platform from your own subdomain.
For the ROAS mess specifically, that gets you four things. Recovered signal: purchases that browser pixels miss still reach your server, so the gap against your backend shrinks instead of drifting. One source of truth: Meta, Google Ads, and GA4 all receive the same purchase event with the same event_id and value, so deduplication works and the platforms are at least arguing over identical inputs. Better match quality: server events carry richer first-party data, which raises Meta's Event Match Quality score, so the algorithm optimizes on real buyers instead of modeled guesses. And durability: first-party cookies on your own subdomain live longer under Safari's ITP, and the setup doesn't collapse the next time a browser tightens the rules.
Server-side won't make the dashboards match — the attribution rules stay different. It gives your reconciliation a trustworthy baseline, so the platform numbers become interpretable instead of contradictory.
- Pull backend revenue and ad spend — Use the last completed week and skip the most recent 3 days, which are still backfilling.
- Compute MER — Total revenue divided by total ad spend, all channels blended. No attribution involved.
- Log each platform's ROAS beside it — Same date range, plain spreadsheet, one row per completed week.
- Watch the relationship, not the values — Platform ROAS up while MER falls means a platform is claiming sales it didn't drive.
- Decide off MER, optimize off ROAS — Budget calls follow MER trends; creative and campaign calls follow in-platform ROAS.
How do I build a weekly reconciliation habit?
Thirty minutes, same day every week:
- Pull backend revenue and total ad spend for the same completed week (skip the most recent 3 days, they're still backfilling).
- Compute MER — marketing efficiency ratio: total revenue divided by total ad spend, all channels blended. This is your north star. It ignores attribution entirely, which is exactly the point.
- Log each platform's reported ROAS next to it, same date range, in a plain spreadsheet.
- Watch the relationship, not the absolute values. If Meta's ROAS rises and MER rises with it, Meta's signal is honest enough to act on. If platform ROAS climbs while MER falls, a platform is claiming sales it didn't drive — usually retargeting or branded search eating existing demand.
- Make budget calls off MER trends, and creative or campaign calls off in-platform ROAS.
That's the whole system. The spreadsheet beats most paid attribution tools because it's anchored to the one number that can't be modeled: money that arrived.
Frequently asked questions
Why is my Meta ROAS so much higher than GA4?
Meta counts view-through conversions and takes full credit for any sale inside its 7-day click / 1-day view window, while GA4 only sees actual visits and splits credit across channels. The gap is structural, not an error.
Which is more accurate, Meta Ads Manager or Google Analytics?
Neither matches your real orders — they're different lenses with different rules. Your backend order data is accurate; a well-built first-party server-side setup gets close to it; both dashboards should only be read directionally.
Why do my ad platforms report more conversions than I have orders?
Each platform credits itself 100% for any sale it touched, so one order that involved both a Meta click and a Google click gets reported twice. Summed platform conversions will always exceed real orders when you run multiple channels.
What is MER and how is it different from ROAS?
MER (marketing efficiency ratio) is total revenue divided by total ad spend across all channels, with no attribution involved. Platform ROAS is one platform's self-reported revenue over its own spend — useful for optimizing inside that platform, nothing more.
Why does last week's ROAS keep changing in Google Ads?
Google Ads reports conversions on the date of the click, so purchases that happen days later get backfilled onto earlier dates. A week's numbers keep rising until the conversion window plays out.
Does server-side tracking make ROAS match across platforms?
No — attribution rules stay different, so the dashboards will never agree. What server-side tracking does is capture nearly all real conversions and send every platform identical, deduplicated events, giving you a reliable baseline to reconcile the platform numbers against.
Should I turn off view-through attribution in Meta?
You can set attribution to 7-day click only for cleaner comparisons. I usually leave 1-day view on and read Meta's ROAS as an influence metric, not incremental truth.
- roas
- attribution
- reporting

