DecisaBlog
Back to blog
Attribution10 min read

Real ROAS vs. Platform ROAS: Why the Numbers Never Match

Google says 4.2x, Meta says 3.8x, your bank account disagrees with both. Here is why platform ROAS is inflated, how much, and how to measure the return your ads actually produce.

By Decisa Team ·

Open Google Ads and Meta Ads Manager side by side and add up the conversions each one claims for the same day. In most accounts the total is bigger than the number of orders that actually exist. Both platforms are grading their own homework — and both give themselves generous marks.

This is not a bug. It is how platform attribution is designed to work. Understanding the gap is the difference between scaling a campaign that prints money and scaling one that quietly burns it.

Why Every Platform Over-Reports

Three mechanics inflate platform ROAS, and they stack:

  • Each platform claims the whole conversion. A customer clicks your Meta ad on Monday and your Google ad on Wednesday, then buys. Meta reports 1 purchase. Google reports 1 purchase. You sold one product and your dashboards show two conversions. Platforms cannot see each other's clicks, so neither deduplicates (Meta attribution settings, Google attribution models).
  • View-through conversions count people who never clicked. Meta's default attribution includes 1-day view: someone scrolled past your ad, bought later through a branded search, and the ad gets credit for a sale it may not have caused.
  • Modeled conversions fill the privacy gaps. Since iOS App Tracking Transparency, platforms estimate a share of conversions statistically instead of observing them. Modeled numbers are a best guess — and the platform doing the guessing is the one selling you the ads.

How Big Is the Gap?

It varies by mix, but the pattern is consistent. A typical e-commerce account running Google + Meta simultaneously sees something like this:

SourceReported purchasesReported ROAS
Meta Ads Manager4123.8x
Google Ads3674.2x
Sum of platforms779
Orders in your store5312.6x real

Methodology note: the table above is illustrative math, constructed to show how double-counting works mechanically. It is not data from a study, a benchmark, or any customer account. Do not cite the 47% figure (or any number in this table) as an empirical statistic — your own gap is something you measure, and the diagnosis steps below show you how.

The platforms collectively claim 47% more conversions than exist. Your blended, real return — revenue in the bank divided by total ad spend — is a third lower than either dashboard suggests. Decisions made on the 4.2x are decisions made on fiction.

What "Real ROAS" Means

Real ROAS is calculated from your own data, not the platform's:

  1. Your pixel records the click — with its gclid, fbclid or UTM parameters — as a first-party event on your domain.
  2. Your checkout reports the order — via webhook from Shopify, Stripe or your payment provider, with the real amount actually charged.
  3. Attribution joins the two — each order is matched to the click that produced it, once, under a model you control (last click, or multi-touch when you want credit spread).

One order, one credit. Refunds subtract. The result is the only ROAS that reconciles with your bank statement — which is exactly how the Decisa pipeline computes it, click to revenue, with the evidence for every match inspectable.

The Platforms Are Not Lying — They Are Selling

Platform metrics exist to help you optimize within that platform, and for that they are genuinely useful. Smart bidding needs conversion signals; send them. The mistake is treating in-platform ROAS as a financial statement:

  • Budget allocation across Google vs. Meta using each one's self-reported ROAS systematically over-funds whichever platform inflates more.
  • Scaling decisions ("4x ROAS, double the budget") based on numbers ~40% high turn profitable campaigns into break-even ones at scale.
  • Creative tests judged on view-through-heavy attribution reward ads that are seen by buyers, not ads that create buyers.

How to Close the Gap This Week

  1. Install first-party tracking on your site (a pixel that captures clicks and click IDs on your own domain).
  2. Connect your checkout so every order — and every refund — flows into the same system as your clicks.
  3. Compare side by side. Keep platform numbers for in-platform optimization; use real ROAS for budget and scaling decisions. The discrepancy itself is a metric: when it widens suddenly, something changed in platform attribution, not in your sales.
  4. Send the truth back. Push your verified conversions to Meta CAPI and Google Enhanced Conversions so the platforms' algorithms learn from real orders instead of their own estimates.

The gap between platform ROAS and real ROAS never goes to zero — but once you can see both numbers, you stop paying for conversions that never happened.

How to Diagnose the Gap in Your Own Account This Week

You do not need new tooling to find out how bad your version of this problem is. You need a spreadsheet, an hour, and access to two systems you already have: your ad platforms and your store backend. Here is the walk.

Step 1 — Pick a clean 30-day window. Choose a period that ended at least a week ago, so the platforms' attribution windows have settled — Meta and Google both keep adding conversions to past dates for days after they happen, and comparing against a window that is still moving will understate the gap. Avoid windows where you changed your pixel, switched conversion events, or migrated checkout providers; you want a period where measurement was stable, even if imperfect.

Step 2 — Export platform-reported conversions. In each ads platform, pull purchases (not add-to-carts, not leads — the event that corresponds to money) and revenue for the window. Write down the attribution settings in force while you are there — Meta's default includes view-through conversions, and that detail matters when you interpret the result later (Meta attribution settings, Google attribution models). Sum the purchase counts across all platforms you run.

Step 3 — Count real orders in your store backend. Open Shopify, Stripe, or whatever system actually charges cards, and count paid orders in the same window, net of refunds and cancellations. This number is the ground truth: it does not model, it does not estimate, it does not claim credit. If a meaningful share of your orders comes from channels ads could never have touched (a wholesale line, a marketplace), exclude those — but be honest about it, because "organic" is exactly where inflated platform attribution hides.

Step 4 — Compute both ROAS and the gap. Platform ROAS you already have, per platform. Real blended ROAS is net revenue from step 3 divided by total ad spend across all platforms. The gap is the sum of platform-claimed purchases minus real orders, expressed as a percentage of real orders.

Reading the result: a gap under roughly 20% is ordinary overlap and modeling noise — platform numbers are still usable directionally, just not as financial truth. A gap of 20–50% means double-counting is materially distorting your numbers: stop using platform ROAS for cross-platform budget decisions today, because the platform that inflates more is silently winning your budget allocation. A gap above 50% means your dashboards have detached from reality — typically heavy view-through credit, overlapping broad audiences claiming the same buyers, or a pixel firing duplicate events. At that level, fix measurement before scaling anything, because you genuinely do not know which campaigns work.

One caveat: this comparison is approximate. Platforms also miss conversions they did legitimately drive (cross-device journeys, blocked pixels), which pushes the other way. The gap you compute is a rough magnitude, not a precise audit — but the direction and the order of magnitude are reliable, and that is enough to change how you make decisions.

Setting Up First-Party Measurement

Once you have seen the gap, the fix is structural, not a settings tweak. The architecture has three parts, and they work in any stack.

An own-domain pixel that captures click IDs. A small script on your site records each landing with whatever the ad click carried — gclid, fbclid, ttclid, UTM parameters — and sets a first-party cookie on your domain so later visits by the same person connect back to that click. Because the cookie is first-party, it is not subject to the third-party cookie blocking that gutted conventional tracking; because the click ID is captured at the moment it exists in the URL, you do not depend on the platform telling you later which click it was. The events land in your database, not someone else's.

A checkout webhook that reports orders — and refunds. Your store or payment provider sends a server-to-server notification for every order: the real amount charged, the currency, the customer reference, and crucially every refund and cancellation afterward. Webhooks are the load-bearing piece, because they bypass everything that breaks browser tracking — ad blockers, consent banners, Safari's storage limits, a buyer who completes payment on a different device. If the order happened, the webhook fires. Revenue stays net, because refunds flow through the same pipe and subtract.

A join under an inspectable model. The third component matches each order to the click history of the person who placed it — by click ID when available, by the first-party cookie or session otherwise — and assigns credit under a model that is explicit: last click, or a multi-touch split when you want credit spread across the journey. "Inspectable" is the property that separates this from yet another black box: for any order, you can open the match and see which click won, why, and under which model version. When a number looks wrong, you audit it instead of shrugging at it.

Two health metrics tell you whether the pipeline works. Match rate — the share of orders that connect to a tracked click — should be the first thing you watch; unmatched orders are not failures, they are a map of the channels you are not tracking yet. And keep the raw events: if you store clicks and orders immutably, you can re-run attribution under a different model later without losing history. This is the architecture Decisa implements end to end, but the pattern itself is tool-agnostic — what matters is that every piece writes to a system you own.

What to Do About Historical Data

The uncomfortable answer: you cannot retro-fix it. Last quarter's platform numbers were computed with view-through credit, modeled conversions, and whatever attribution settings were active at the time — the underlying click-level data needed to recompute them honestly no longer exists, at least not anywhere you can reach. Applying a flat discount ("our gap is 40%, so multiply old ROAS by 0.6") produces a number that looks rigorous and is not: the gap is not stable across months, campaigns, or audience mixes.

What works instead:

  1. Draw a line in the calendar. The day your first-party measurement goes live is day zero of your real baseline. Annotate it everywhere you report numbers.
  2. Compare trends, not absolutes, across the line. If platform ROAS said 4.2x in March and real ROAS says 2.6x in July, performance did not collapse — the ruler changed. Within each era, the trend is meaningful; across the line, only direction is.
  3. Run both numbers in parallel going forward. Keep platform ROAS for in-platform optimization, real ROAS for money decisions, and track the gap between them as its own metric. After 30–60 days you have a real baseline with enough history to act on — and from then on, every comparison is real-to-real.

Old numbers were the best you had at the time. Their job now is context, not truth.