One of the more uncomfortable conversations I have with new clients goes something like this:
"Our Google Ads ROAS is 4.2×. Our Meta is at 5.1×. Why are our margins shrinking month over month?" — Founder, $180K/mo Shopify D2C skincare brand
The dashboard says one thing. The bank account says another. The dashboard is wrong.
Across hundreds of Shopify D2C ad-account audits I've run, platform-reported ROAS over-states real Shopify-attributed revenue by 30–80%. Sometimes more. The mechanisms that cause this aren't subtle once you know where to look — but they're invisible if you're only reading the Google Ads / Meta Ads dashboards.
This post walks through the four most common ROAS-inflation mechanisms in D2C accounts, then shows you the 15-minute reconciliation against Shopify Reports that surfaces your real number.
The 4 mechanisms that over-state platform ROAS
None of these are conspiracies. They're just side-effects of how Google Ads and Meta Ads count conversions — which is generous to the platform, by design.
1. Branded-search inflation
When someone Googles your brand name and clicks an ad, Google Ads counts that as a conversion driven by your ads. But that customer was already going to buy. The brand demand was earned through Meta, organic, email, word-of-mouth, podcasts — all the upstream channels that built brand awareness in the first place.
Google Ads sees a click and a purchase. It claims credit. Reality: you'd have captured that revenue for $0 via organic search (or via direct traffic if the person typed your URL).
In a typical D2C beauty/skin/supplements account, 30–40% of "Google Ads revenue" is branded-search. Strip it out, and the real non-brand ROAS drops 35–50%.
Skincare brand at $180K/mo Shopify revenue. Reported Google Ads ROAS: 4.2×. Branded search share of "Google Ads revenue": 38%. Real non-brand Google Ads ROAS after isolation: 2.1×.
2. PMax cannibalizing Search
Performance Max bids across all Google surfaces — Search, Shopping, Display, YouTube, Discover. Without brand exclusions configured, PMax bids on your brand name. PMax wins those clicks at low CPCs (because brand terms convert well) and reports them as PMax conversions.
Now PMax looks like the hero campaign. It's just stealing credit from organic, branded Search, and direct.
I've seen accounts where PMax reported 6× ROAS. Once brand exclusions were configured and the same audience tested in non-brand-only PMax, the real incremental ROAS was 2.5–3×. 50% of the platform-reported number was illusion.
3. Retargeting overcount
Meta retargeting at 8× ROAS sounds incredible. It's also mostly people who already had your product in their cart, or already bought from you in the last 60 days, or are repeat browsers checking the site daily.
Most retargeting ROAS is last-click-attributed revenue from people who would have converted anyway. The incremental contribution — the marginal lift you'd lose if retargeting were turned off — is typically 30–50% of the reported number.
Worse: D2C accounts I take over routinely have 25–35% of total Meta spend going to retargeting. That budget could be acquiring real new customers in prospecting at a similar effective CAC. Instead, it's paying premium CPMs to reach the warmest possible audience.
4. Last-click attribution bias
Both Google Ads and Meta default to last-click (or last-touch) attribution within their own reporting. That means the channel that gets the final click before purchase claims the entire conversion. The earlier touchpoints get nothing.
For D2C brands running both Google + Meta, this creates a perverse double-count: Google claims the conversion when a customer clicks a branded Search ad after seeing a Meta ad. Meta claims the conversion when a customer clicks a Meta retargeting ad after browsing from a Google PMax click.
Add up the platform-reported revenue across Google + Meta and it routinely exceeds total Shopify revenue. That's the give-away. If your platforms claim more revenue than your store actually made, the platforms are over-attributing. Mathematically guaranteed.
The 15-minute reconciliation against Shopify Reports
Here's the workflow that surfaces your real number. You'll need 15 minutes and read-only access to Google Ads, Meta Ads Manager, and Shopify.
Step 1 — Pull total Shopify revenue from paid traffic
In Shopify, go to Analytics → Reports → Sales by traffic referrer. Filter to the last 30 days. Look at the rows attributed to Google Ads (UTM-tagged) and Meta/Facebook Ads (UTM-tagged). This is your real Shopify-attributed paid revenue.
Save those numbers. We'll call them Google_Shopify_Revenue and Meta_Shopify_Revenue.
Step 2 — Pull total ad spend from each platform
Last 30 days, total spend across all campaigns. Google_Spend and Meta_Spend.
Step 3 — Calculate real Shopify-attributed ROAS
Real_Meta_ROAS = Meta_Shopify_Revenue ÷ Meta_Spend
// Then compare against the platform-reported numbers from Google Ads and Meta Ads Manager.
Step 4 — Calculate the gap (the "lie")
Meta_Lie = (Platform_Meta_ROAS − Real_Meta_ROAS) ÷ Platform_Meta_ROAS
// In a healthy D2C account, this gap should be under 25%. In most accounts I audit, it's 40–80%.
Step 5 — Calculate real non-brand Google ROAS
This is where it gets interesting. Pull your Search Terms report from Google Ads (last 30 days). Filter to terms containing your brand name. Sum the conversions and revenue from those terms — that's Branded_Revenue.
Real_NonBrand_ROAS = Non_Brand_Revenue ÷ (Google_Spend − Branded_Spend)
// This is the only number that tells you whether Google Ads is acquiring real new customers.
Want this calculated for your account?
The $499 Profit Audit reconciles your Google + Meta against Shopify in 5 business days. live walkthrough, written 17-point plan, real number on the leak.
Why this matters: contribution margin, not ROAS
Real non-brand ROAS is necessary but not sufficient. The number that actually pays bills is contribution margin after ad spend — what we call CM2.
CM2 = Revenue − COGS − Shipping − Returns − Ad Spend. Per order, per campaign, per channel. Until you can quote your CM2, "scaling profitably" is a guess.
If the reconciliation in this post surfaced a 40%+ gap between platform-reported and Shopify-attributed ROAS, the next step is moving the entire account onto CM2-based reporting. The methodology for that lives in Google Ads management and Meta Ads management.
What to do once you find the gap
Three actions, in order:
- Isolate branded Search into its own Google Ads campaign. Stop letting it inflate your non-brand ROAS dashboards. Branded ROAS will be massive (it should be); non-brand will be visible for the first time.
- Configure brand exclusions on PMax. Settings → Account-level brand exclusions → add your brand and any common misspellings. Within 14 days, PMax ROAS will drop 30–50% — and that's the real number to scale on.
- Cap retargeting at 10–15% of total spend. Add 90-day purchaser exclusions on prospecting campaigns. Reallocate the freed budget to prospecting + non-brand Search where the next dollar buys a real new customer.
None of these are aggressive optimizations. They're removing waste. Most accounts find 15–30% of total ad spend was being mis-attributed to the wrong campaigns or going to over-counted conversions. Surface that, and the rest of the optimization stack actually has clean signal to work with.
Platform ROAS lies because of how the platforms count conversions. The fix isn't to distrust the platforms — it's to reconcile against Shopify Reports every month, isolate branded from non-brand, configure brand exclusions on PMax, and cap retargeting. Then optimize against contribution margin (CM2), not against the inflated platform number.
If you want me to run this reconciliation on your account and produce a written 17-point action plan ranked by expected impact — that's the $499 Profit Audit. Same workflow as this post, plus 7 more audit pillars (Pixel + CAPI accuracy, Merchant Center health, search-terms waste, audience overlap, etc.) and a live walkthrough where I show you the gap in your own data.
Either way — whether you do it yourself with this guide or have me run it — start with the reconciliation. The number is almost never what you think it is.
