All articles

Meta vs. Google Ads: How to Actually Tell Which One Is Selling

Meta says 40 sales. Google says 32. Shopify says 58. Here's why all three are 'right' and how to build a single number you can trust.

TL;DR. Meta Ads Manager and Google Ads both over-report conversions because neither platform can see the other. Your Shopify or Stripe data is the only place that sees every sale. The honest marketing number for a small business is blended ROAS — total revenue divided by total ad spend — and you can compute it in under an hour by exporting three CSVs and joining them.

The dashboard conversation you’re sick of

You open Meta Ads Manager. “40 purchases last week.” You open Google Ads. “32 purchases.” You open Shopify. “58 orders.” 40 + 32 = 72, but Shopify only saw 58. Fourteen sales have apparently been counted twice.

Then your ad agency or your freelancer sends you a report that claims a 6.0 ROAS on Meta and a 4.5 ROAS on Google, and you wonder why your bank account doesn’t feel like that. It’s because those numbers describe a universe where the two platforms are never looking at the same customer — and in the real world, they are looking at the same customer constantly.

This isn’t a bug in either platform. It’s a structural limitation. Once you understand it, you stop arguing with the dashboards and start using your own data as the referee.

Why the numbers never agree

Three things make the dashboards over-count.

Each platform sees only its own ads

Meta knows a user clicked a Facebook ad. It does not know that same user also clicked a Google Shopping ad two days later. When the sale happens, Meta claims it. Google sees its own click and the sale, and claims it too. The customer is counted in both columns.

This is called attribution overlap. The more channels you run, the bigger the overlap. For a small store running Meta + Google + email + organic, 20–30% double-counting is common.

Default attribution windows are generous

Meta’s default attribution is 7-day click, 1-day view. That means if a user so much as saw your ad on Tuesday and then bought on Wednesday without clicking anything, Meta claims the sale. Google Ads defaults to data-driven attribution with a 30-day click window, which is more conservative but still claims partial credit for assisted conversions.

Both defaults are designed to make the platform look effective. Neither is wrong — they’re just optimistic.

Conversion tracking isn’t perfect

iOS 14+ ATT (App Tracking Transparency), ad blockers, cookie consent banners, and privacy-focused browsers all block a portion of conversion pixels. Meta and Google respond by modeling the missing conversions — they statistically estimate what they think happened. Those modeled conversions often show up as round-number inflation in your dashboard.

The only data that sees every sale

Your store does. Shopify, WooCommerce, Stripe Checkout, or whatever charges the card — that system logs every actual transaction that actually completed, with no modeling and no double-counting. It is the single source of truth for revenue.

What your store does not know is where each customer came from. That’s where UTM tags come in (see below). But the total revenue number is beyond dispute.

The blended ROAS formula

The honest weekly number is:

Blended ROAS = Total Revenue (from store) ÷ Total Ad Spend (across every platform)

It’s crude. It treats Meta and Google as one big bucket. It can’t tell you which channel to cut. But it cannot be double-counted, it cannot be inflated by modeled conversions, and it is the one number that moves in the same direction as your bank balance.

If blended ROAS is 4.0 and you’re profitable, great. If it’s 1.5, no amount of Meta dashboards showing 6.0 will save you.

Adding per-channel visibility with UTMs

A UTM tag is a little label added to the end of your ad URLs. When a shopper clicks, the label arrives at your store and can be saved with the order. A Shopify app like UTM.io, Analyzify, or a built-in Shopify setting will capture these.

A tagged URL looks like:

https://yourstore.com/?utm_source=meta&utm_campaign=spring_sale

With UTMs saved on orders, you can split revenue by source without trusting the ad platform’s count. The formula stays the same — revenue ÷ spend — but you compute it per channel.

The weekly reconciliation pipeline

Here is what the actual workflow looks like in a visual tool like Flowfile. Built once, runs in seconds every week.

Step 1: Export four CSVs

  • Meta Ads Manager → Reports → Export by campaign: campaign_name, spend, impressions, clicks, purchases
  • Google Ads → Reports → Campaigns: campaign, cost, impressions, clicks, conversions
  • Shopify → Orders Export: Name, Total, Created at, Referring Site, Landing Page (which contains the UTMs)
  • Optional GA4 → Explore → Free-form: sessions and revenue by source/medium

Step 2: Union the ad spend

Drop the Meta and Google CSVs onto the canvas. Use a Select node on each to keep only four columns: date, platform, campaign, spend. Then union them with a Concat node. You now have a single table of ad spend across both platforms.

Step 3: Extract UTM source from Shopify orders

Shopify stores the landing page URL on every order. Use a Formula node to extract the utm_source parameter from that URL — most pipeline tools have a string-split or regex function for this. Now every order has a source column: meta, google, email, direct, or empty.

Step 4: Group both sides by source

On the orders side, Group By source → sum of Total. On the ad spend side, Group By platform → sum of spend. Two small summary tables.

Step 5: Join and compute

Join the two summary tables on source = platform. Add a Formula node for ROAS = revenue ÷ spend. Output:

ChannelRevenue (Shopify)SpendRevenue-based ROASPlatform-reported ROASGap
Meta€5,200€1,4003.76.140% over-reported
Google€3,800€1,1003.54.624% over-reported
Email€2,900€0n/a
Direct / organic€2,100€0n/a
Blended€14,000€2,5005.6n/a

Now you have a per-channel ROAS that matches the money in your bank, and you can see exactly how much each platform is over-reporting.

Step 6: Save and re-use

The whole pipeline is one file on your computer. The next week you export the four fresh CSVs, drop them in, click Run. The report regenerates in seconds.

What changes once you have this

Three things, immediately:

  1. You stop panic-pausing campaigns. A Meta dashboard that drops from 6.0 to 5.0 ROAS looks like a disaster. The same week’s revenue-based number may have held steady. You decide based on the truth, not the platform’s mood.
  2. You notice when a channel dies. If Meta’s revenue-based ROAS quietly slides from 4.0 to 2.5 over three weeks while the platform-reported number stays at 6.0, your pipeline surfaces it. The platform dashboard will not.
  3. You stop double-paying. Many small businesses keep spending on a channel because its own dashboard looks good. Blended ROAS tells you whether the overall spend is working — which is the only question that matters to your cash flow.

Getting started

Flowfile is free and open-source and runs on your laptop — your ad data and sales data never leave your machine. The browser demo runs entirely in your browser if you want to try the canvas before installing.

A good first project: export one week of Meta, Google, and Shopify data. Build the blended ROAS pipeline above. Re-run it the following week. By the third week, you will have a marketing report you trust more than anything either ad platform shows you.


Related reading. The 10 Numbers Every Small Business Should Track Each Week places blended ROAS into the broader weekly scorecard, and What Is a Data Pipeline? explains the underlying concept in plain English.

Frequently asked questions

Why do Meta and Google both claim the same sale?
Because each platform only sees what happens on its own ads. If a shopper clicks a Facebook ad on Monday and a Google ad on Wednesday and buys on Thursday, Meta counts it as a Meta conversion and Google counts it as a Google conversion. Neither is lying — they just can't see each other. The only view that sees the full journey is your own sales data.
What is 'blended ROAS'?
Blended ROAS is total revenue divided by total ad spend across all channels. If you spent €2,000 on Meta and €1,500 on Google this month and Shopify reported €14,000 in sales, your blended ROAS is 14,000 ÷ 3,500 = 4.0. It is the one number that cannot be double-counted, which is why it's the honest baseline.
Do I still need UTM tags?
Yes, if you want per-channel numbers beyond blended ROAS. UTM tags are little labels you add to the end of your ad URLs so your sales data knows which channel sent each visitor. Without UTMs, the best you can do is blended — with UTMs, you can split revenue by campaign.
Does GA4 solve this for me?
GA4 gives you a fourth opinion, not a final answer. It uses its own attribution model (usually 'data-driven') and often disagrees with Meta, Google Ads, and your store. Treat GA4 as a useful cross-check on traffic and engagement — not as the source of truth for revenue. Revenue lives in Shopify, Stripe, or whatever charges the card.
How often should I run this reconciliation?
Weekly is the right cadence for a small business spending anything above €500/month on ads. Monthly is too slow to catch a campaign that's quietly burning money; daily is too noisy. A weekly pipeline takes 10 seconds to re-run once it's built.