TrueTrackedTrueTracked
Marketing Performance

Why Your Ad Platform ROAS Is Wrong (And Which Number to Trust)

Meta, Google Ads, TikTok and GA4 report four different ROAS figures for the same orders. Here is the mechanism behind the gap, and which number to trust for which decision.

Sharif UjjamanUpdated 16 min read
Meta claims $52,200 at 2.9x under a 7-day click window, Google Ads $61,200 at 5.1x under 30 days, and TikTok $14,400 at 3.2x under up to 28 days, totalling $127,800 claimed against $98,000 collected
In this article

You open Meta Ads Manager and purchase ROAS reads 2.9x. Google Ads says 5.1x. TikTok says 3.2x. Every dashboard is above break-even, so the month looks fine.

Then you add up what each platform says it earned you, compare it to what the business actually banked, and the numbers are nowhere near each other. The platforms claim more revenue than existed.

This is not a broken pixel and it is not a setup mistake. It is what happens by design when several independent measurement systems are each asked to grade their own work on the same set of orders.

The number is not wrong. It is answering a different question.

ROAS is revenue attributed to ads, divided by ad spend.

The denominator is not in dispute. You spent $18,000 on Meta last month and every system agrees on that.

The numerator is where it falls apart. "Revenue attributed to ads" is not a fact about your store. It is the output of a policy, and each platform writes its own. That policy has three parts. How far back the platform is willing to look. What kind of interaction counts. And how it decides that the person who converted is the person it showed the ad to.

Change any one of those and the number changes, without a single order changing.

So when someone says their ROAS is 4x, the question that actually matters is: according to whose policy?

What each platform is allowed to claim

Meta

Meta's standard attribution settings for website conversions count events in three buckets. Within 1 day or 7 days after a link click, within 1 day after an impression (view-through), and within 1 day after a non-link click (engage-through).

That last bucket is new. In its announcement of the change, Meta says it is "renaming engaged-view attribution, and going forward, it will be known as engage-through attribution". The same announcement updates the engaged view definition for video ads "from 10 seconds to 5 seconds". Meta's stated reasoning: "46% of online purchase conversions with Reels now happen within the first 2 seconds". Conversions from a "share, save, or other non-link click actions" now count too.

Meta did not change its windows. It widened what counts as a claim inside them, which moves the gap this article is about in one direction only.

Seven days is the longest click window Meta offers. That is worth sitting with, because Meta is usually the platform accused of over-claiming, and it is working from the shortest lookback of the three.

Meta is explicit that its own reporting is not the way to answer whether an ad caused a sale. In the same announcement it calls incrementality experiments "the gold standard in measurement", naming Conversion Lift. That is a test you run, not a setting you switch on, and it is a different question from the one the ROAS column answers.

Meta is also, in its words, "starting to partner with third party analytics providers, such as Northbeam and Triple Whale, to incorporate both clicks and views into their attribution model". Which is Meta acknowledging that the cross-platform view has to live somewhere other than Meta.

Google Ads defaults to a 30-day click-through conversion window, configurable from 1 to 90 days depending on the conversion source. Its default view-through window is 1 day.

Thirty days is more than four times Meta's maximum. A customer who clicks a Shopping ad, disappears for three weeks, then comes back through a bookmark and buys is a Google Ads conversion. The same journey is invisible to Meta by day eight.

TikTok

TikTok lets you set click-through attribution to 1, 7, 14 or 28 days, and view-through to off, 1 day or 7 days, at the ad group level. The setting is locked once the ad group is published, so a mid-flight change means building a new ad group.

That matters for a reason that is easy to miss: two ad groups in the same TikTok account can be reporting under different windows. Comparing them is not like for like either.

Microsoft Ads

Microsoft Ads sets the window per conversion goal rather than per campaign. Its API reference for the conversion goal object states that "the minimum value supported is 1 minute", and that "the maximum value supported is 129600 minutes (90 days)". Thirty days is the working default. That puts it alongside Google Ads rather than Meta.

Its view-through handling is where it separates from both. Microsoft's documentation states that "by default, view-through conversions are counted the same as other conversions, and are therefore included in the figure you see in the All conv. column". The default view-through window is 1 day, and the maximum is 30.

So Microsoft includes view-through credit in its headline figure by default, where Google Ads deliberately keeps it out of the Conversions column. Two platforms, opposite defaults, and no label on either dashboard telling you which convention you are reading.

GA4

GA4 does not claim orders on behalf of a channel. It distributes them.

Its data-driven model splits credit for a single conversion across the touchpoints on the path, which is why GA4 shows decimals where the ad platforms show whole numbers. One order can land as 0.4 to paid social, 0.4 to paid search and 0.2 to organic. The total across all channels still comes to one conversion and one order value.

Its lookback is longer than any ad platform's. 90 days by default for most key events, with 30 and 60 as options, and 30 days for acquisition events like a first visit.

A long lookback only helps if GA4 can still tell it is the same person. That is where a store loses sales, more often than at the window.

GA4 resolves identity by User-ID first, which requires the visitor to be logged in. Most stores have no account for the majority of their buyers, so GA4 falls back to a first-party cookie tied to one browser. Safari caps cookies written by JavaScript at seven days, and that is what a standard gtag install writes. A Safari visitor who clicks an ad, returns three weeks later and buys arrives as a new user carrying no memory of the UTM. The sale is credited to whatever brought them back that day, usually direct or organic search. A phone click and a laptop purchase are two unrelated users for the same reason.

So UTMs label the arrival. They do not preserve identity between the arrival and the purchase, and that is the half that decides whether a campaign gets the sale. Setting that cookie from your own server rather than from JavaScript recovers part of it, and it is worth doing.

PlatformLongest click windowView-throughCounts an order as
Meta7 days1 day, included in resultsOne whole conversion
Google Ads30 days default, up to 901 day, reported separatelyOne whole conversion
TikTokup to 28 daysoff, 1 or 7 daysOne whole conversion
Microsoft Ads30 days default, up to 901 day default, included by defaultOne whole conversion
GA490 days lookbackn/a, click-basedA fraction of a conversion

Timeline showing Google Ads looking back 30 days, TikTok up to 28 days and Meta 7 days from the same purchase, with all three windows open during the final 7 days

Three windows, one purchase. Everything inside the shaded band is contested territory.

Why the platform totals overshoot your real revenue

The month below is a composite, built from a typical three-platform spend split. The amounts are constructed. The arithmetic is the point, and it is the arithmetic that repeats in every account running all three.

PlatformSpendRevenue it claimsIts ROAS
Meta$18,000$52,2002.9x
Google Ads$12,000$61,2005.1x
TikTok$4,500$14,4003.2x
Combined$34,500$127,800
Actually collected$34,500$98,0002.8x

The platforms between them claim $127,800. The store collected $98,000. That is 30% more revenue reported than the store ever received, and $29,800 of it does not correspond to money that exists.

The mechanism is not complicated. It is one order at a time.

One 80 dollar order fanning out to Meta, Google Ads and TikTok, each claiming the full 80 dollars, totalling 240 dollars reported against 80 dollars collected

Nobody is lying. Each platform is answering honestly about the only part of the journey it can see.

A customer clicks your TikTok ad on Tuesday and browses without buying. On Friday evening an Instagram ad appears in her feed; she scrolls past it without clicking. On Saturday afternoon she searches your brand name, clicks the Google ad at the top, and buys.

Google Ads claims it: there was a click, that same day. TikTok claims it: there was a click four days earlier, inside its window. Meta claims it: the ad was on screen the previous evening, inside its 1-day view window. One order, three full claims, and none of the three is misreporting what it saw.

They cannot deduplicate because they cannot see each other. There is no mechanism, no shared identifier and no commercial reason for one ad platform to tell another that it already took credit.

The view-through asymmetry nobody adjusts for

There is a second-order effect in that example that is worth isolating, because it makes cross-platform comparison worse than the window lengths alone suggest.

Meta counts that Friday evening impression. The customer scrolled past without clicking, and Meta still counts it in the results you see.

For most standard web campaigns, Google Ads does not do this. Its documentation is explicit: "view-through conversions are for reporting only and aren't included in the 'Conversions' column, only in the 'View-through conversions' and 'All conversions' columns." Three campaign types are exempt: Performance Max for store goals, App, and Demand Gen.

So Meta's headline number includes a category of credit that Google Ads' headline number deliberately excludes. Before you have adjusted for anything, you are comparing a figure that counts non-clickers against a figure that does not.

Microsoft Ads sits on Meta's side of that line, including view-through in the All conversions figure by default. So of the four, one platform excludes a category of credit from its headline number and the others include it.

This is a large part of why Meta looks like it over-claims relative to Google, and it is fixable in your reading rather than in your setup. If you want the two closer to comparable, look at Meta's results with the view-through window set to off, and compare that against the Google Ads Conversions column.

What server-side tracking does not fix

There is a version of this article that ends with "install server-side tracking". That version is wrong, and it is worth being precise about why.

Server-side tracking fixes delivery. When an ad blocker, Safari's cookie limits or a redirect through a payment provider stops a browser pixel from firing, the conversion happened and the platform never heard about it. Sending the event from your own server closes that gap, and platforms typically report more conversions afterwards.

What it does not touch is the attribution policy. After you install it, Meta still looks back 7 days, Google Ads still looks back 30, and neither knows the other exists.

The counterintuitive result: your platform totals usually move further from your real revenue after a good server-side implementation, not closer. Each platform now receives more events, so each has more orders it is entitled to claim. If you install Meta's Conversions API expecting your dashboards to converge, you will read a genuine measurement improvement as a regression.

The other thing server-side tracking cannot do is link a journey where nothing is shared between the sessions. A phone click at lunch and a laptop purchase that evening can be connected when the order carries an email address that matches earlier activity. Where no such identifier exists, no architecture recovers it.

Deduplication runs inside each platform, never between them

Deduplication is a real mechanism and it solves a real problem, so it is worth being clear about its boundary.

When both a browser pixel and a server-side event fire for the same purchase, the platform needs to recognise them as one conversion. Meta does this by matching an event_id you supply on both, combined with the event name. TikTok's Events API works the same way. Google Ads relies on click identifiers captured at the click and matched at conversion, with hashed customer data as a secondary signal.

Microsoft states its own version plainly. Click any Microsoft ad and you are "automatically excluded from your view-through conversion metric so they won't be counted twice", in its words. Note the scope of that sentence. Across Microsoft Advertising.

Every one of those runs entirely inside a single platform. Meta deduplicating its own pixel against its own server events has no bearing on whether Google Ads also claimed that order.

Cross-platform deduplication has to happen somewhere that can see all of them at once, which means your own data. That is what first-party tracking is for.

Which number to use for which decision

Stop trying to find the correct ROAS. There isn't one number, and the search for it is what wastes the month.

Each source answers a question well, and the trick is to only ask it that question.

SourceAnswers wellDo not use it for
Your storeWhat the business actually earnedWhich channel earned it
Platform ROASWhich campaign beats which, inside that platformSplitting budget between platforms
GA4Cross-channel comparison under one consistent modelFinancial reporting, and matching any platform's number
Independent attribution toolCross-channel comparison, and sizing each platform's over-claimFinancial reporting, and matching any platform's number
Blended ROASWhether total ad spend pays at allWhich campaign to turn off
Incrementality testsWhether an ad caused a sale at allDay-to-day budget decisions, because they are slow and expensive

Two rules follow from that table and they cover most of the damage.

Inside one platform, the comparison is valid. If your Meta prospecting shows 2.1x and your Meta retargeting shows 8.4x, both were measured by identical rules, and retargeting really is claiming more per dollar. Act on it.

Across platforms, the comparison is not valid. A 5.1x on Google Ads and a 2.9x on Meta tells you almost nothing about which deserves the next $1,000. Google is working from a 30-day click window on traffic that was often already searching your brand; Meta is working from at most 7 days. The gap between those two figures is partly a gap between two policies, not two performances.

How to reconcile your ad platform ROAS each month

This is a routine, not a project. Half an hour a month.

  1. Take your real revenue from the system that handles the money. This is the only figure in the exercise that is not an estimate.
  2. Sum what every platform claimed. Meta plus Google Ads plus TikTok plus anything else running.
  3. Divide claimed by real. In the month above that is $127,800 / $98,000 = 1.30. Write it down.
  4. Track that ratio over time. The absolute value matters less than its movement. A ratio drifting from 1.2 to 1.6 tells you something changed: usually a new campaign type leaning on view-through, or a broad-targeting push generating credit it did not earn.

Also compute blended ROAS, real revenue divided by total spend, which was 2.8x in the example against platform figures of 2.9x, 5.1x and 3.2x. That single number is harder to argue with than any dashboard, and it is the one to take into a budget conversation.

What the routine gives you is the size of the gap, not its owner. You will know the platforms over-claimed by 30%, and still not know which of the three earned the order. Splitting that gap needs every channel attributed under one ruleset, applied by something that can see all of them at once.

How TrueTracked reports this

TrueTracked puts the platform's claim and its own attribution on the same row, per platform, rather than in two systems you reconcile by hand. Platform-reported revenue and ROAS sit next to the sessions, orders and revenue attributed from first-party data. The gap in the reconciliation above becomes a column rather than a spreadsheet exercise.

View-through is broken out separately, which is what makes the asymmetry above measurable rather than theoretical. You can see how much of a platform's claim rests on people who never clicked.

Five attribution models are available, and they are applied identically across every channel: TrueTracked, TrueTracked with view-through, first click, last click and linear. Lookback windows can be set to 1, 7, 14 or 28 days, or left unbounded. That consistency is the whole point. One ruleset applied to every channel is what makes two channels comparable, which is precisely what platform-reported figures cannot give you.

That consistency holds one level down. Reporting runs to campaign level under the same models, so a Meta campaign and a Google Ads campaign can be set against each other on one basis. That is the comparison platform-reported figures cannot support at any level.

It will not tell you the metaphysically true origin of every sale. Nothing will. It gives you one consistent basis for the comparison, and an honest view of how far each platform's claim sits from it.

If you want to see the shape of it, the attribution dashboard is the page to start on.

Sources

All eight sources checked September 2026.

Frequently asked questions

Because Meta reports the revenue it is allowed to claim, not the revenue you collected. It claims an order when the buyer clicked a Meta ad within 7 days, or saw one within 1 day, and it has no visibility into whether Google Ads or TikTok claimed the same order. If a customer touched all three before buying, all three report the full order value. Your store still recorded one sale.

Use platform ROAS to compare campaigns inside that same platform, where every campaign is measured by identical rules. Use one consistent cross-channel model, from GA4 or an independent attribution tool, to decide how to split budget between platforms. Use your store's own revenue for anything financial. These are three different questions and they have three different correct answers.

No, and it commonly does the opposite. Server-side tracking closes the gap between conversions that happened and conversions the platform received, so each platform typically reports more conversions afterwards. Each one still applies its own attribution rules to the events it now receives, so the combined total across platforms usually rises further above your real revenue.

No. Meta's figure can include conversions from people who saw an ad and never clicked it, within a 1-day view window. Google Ads keeps view-through conversions out of its Conversions column for standard web campaigns and reports them separately, with a few exceptions such as Performance Max for store goals. Meta's number is also built on a click window of at most 7 days against Google's default 30. The two are computed under different rules, so the ratio is not comparable across them.

UTMs label the visit that arrives. They do not keep GA4 recognising that visitor between the click and the purchase, and that is the part that decides which campaign gets credit. Without a login to populate User-ID, GA4 identifies a returning visitor by a first-party cookie on one browser, and Safari caps cookies written by JavaScript at seven days. A visitor who clicks your ad, comes back three weeks later and buys is a new user to GA4, so the sale is credited to direct or organic rather than to the campaign. Cross-device journeys are unlinked for the same reason. Setting that cookie from your own server rather than from JavaScript recovers part of it.

Start from the revenue your store actually recorded, not the sum of platform-reported revenue. Divide it by total spend across every platform to get your blended figure. Then attribute each order once, under one model applied identically to every channel, to see the split. The gap between that split and each platform's own claim is that platform's over-reporting rate, which is worth tracking month to month as a ratio rather than treating as a one-off correction.

About the author

Sharif Ujjaman, Founder of TrueTracked

Sharif Ujjaman

Founder of TrueTracked · Tracking, Attribution and Paid Ads Specialist

Seven years implementing conversion tracking and attribution for businesses running paid ads, most of it fixing measurement that was already broken.

Get started

Track smarter. Grow faster.

Get clear insights into what drives your sales with TrueTracked.

14-day free trial · No credit card required