Free 15-minute audit: we look at your ads, your tracking and your funnel and tell you what to fix first.

Book a call

Why platform-reported ROAS lies, and the four checks to run before you touch creative

· Brian Jones

A dark desk with a monitor and a small plant

Here’s the short version. The ROASROAS Return on ad spend: revenue divided by what you paid for the ads. 5x ROAS means $5 back for every $1 spent. Ad platforms calculate it from the sales they claim credit for, so it needs checking against real revenue. number inside Meta Ads ManagerAds Manager Meta's interface for building campaigns and reading their results. Its numbers reflect Meta's attribution rules, not your bank account. or Google Ads is the platform’s opinion of how much credit it deserves. It is not a measurement of what hit your bank account. On most accounts I audit, the two disagree by enough to change the decision you’d make.

That’s a tracking problem, not a creativeCreative The ad itself: the image or video, the words on it, and the copy underneath. "Testing creative" means trying different versions of the ad to see which one people respond to. problem. And it’s fixable in an afternoon if you know where to look.

Where the drift comes from

Four mechanisms account for most of the gap.

Attribution windowsAttribution window How long after someone clicks or sees an ad a conversion still counts as caused by it. Meta's default is 7 days after a click or 1 day after a view. Longer windows mean more conversions claimed.. Meta’s default attribution setting counts a purchase if the person clicked an ad in the last 7 days or merely saw one in the last day.

Google’s defaults vary by conversion actionConversion action In Google Ads, a defined event you count as a conversion: a form submit, a purchase, a booked call. Primary conversion actions are the ones bidding optimizes toward; secondary ones are recorded but ignored by bidding., and view-through conversions count on YouTube and Display. Someone who was going to buy anyway, saw your retargetingRetargeting Showing ads to people who have already visited your site or interacted with your business. Cheap and effective, and also the easiest place for a platform to claim credit for a sale that was going to happen anyway. ad on the way, and bought: the platform books the sale. Your accountant doesn’t.

Duplicate events. If you run the browser pixelMeta pixel A small piece of code on your website that reports visits and actions (page views, leads, purchases) back to Meta from the visitor's browser. Blocked by ad blockers and some browser privacy settings. and the Conversions APIConversions API Meta's server-to-server channel for sending events like leads and purchases from your own server or CRM, instead of relying on the browser pixel. Usually run alongside the pixel, which is where double counting comes from. (or the Google tag and an offline import) without a shared deduplicationDeduplication Matching a browser pixel event and a server event that describe the same action, using a shared event ID, so the platform counts it once instead of twice. key, one purchase can be counted twice. Meta’s own deduplication doc spells out the event_id + event_name pairing it needs. The platform doesn’t warn you. Revenue in the dashboard just looks better than it is.

Every platform claims the same sale. A customer clicks a Google search ad on Monday and a Meta retargeting ad on Wednesday, then buys. Google reports the sale. Meta reports the sale. Add up the two dashboards and you have two sales for the price of one.

Different definitions of “lead”. The ad platform fires the event when a form submits. Your CRMCRM Customer relationship management software, such as HubSpot or Salesforce, where leads, contacts and deals are recorded. Usually the only system that knows whether a lead was real. only counts it once someone has a phone number and a budget. The platform is optimizing toward a thing your sales team doesn’t consider real.

The four checks

You don’t need new software for any of these. You need one afternoon and a spreadsheet.

1. Reconcile purchases to the source of truth

Pull last month’s purchases (or booked calls, or qualified leadsQualified lead A lead that meets your sales team's definition of real: right kind of company, a budget, a working phone number. Different from a form fill, which anyone (or any bot) can produce., whatever your revenue event is) from the system that actually knows: Shopify, Stripe, your CRM. Count them. Now add up the conversionsConversion The action you want someone to take after seeing an ad: a purchase, a form fill, a booked call. Each platform counts conversions by its own rules, which is why two dashboards rarely agree. each ad platform reported for the same period.

If the platforms’ combined total is higher than your real total, you’ve found double counting, and the ratio tells you how much to discount the in-platform numbers by.

2. Check the deduplication key

For Meta, open Events ManagerEvents Manager Meta's dashboard for seeing which events the pixel and Conversions API are sending, how many arrived, and whether they were deduplicated., pick the Purchase event, and look at the “Event Deduplication” section. It should show browser and server events being matched by event_id.

If it shows both firing and no matching, every purchase is potentially counted twice. For Google, confirm the same transaction ID is passed on both the web tag and any offline or server-side import.

3. Change the attribution window and watch what happens

In Ads Manager, compare the same campaign under “7-day click, 1-day view” and under “1-day click”. The bigger the drop, the more of that campaign’s reported results are view-throughView-through A conversion credited to an ad the person saw but never clicked. Ad platforms count these; your analytics and CRM cannot see them. or late-click credit. Neither is worthless, but a campaign that loses 60% of its ROAS when you remove view-through is not the campaign you thought it was.

4. Compare the platform’s lead count to the CRM’s qualified count

Export leads from the ad platform for a month. Export the same month from the CRM with the qualification stage. Match on email. The percentage that qualified is your real conversion rateConversion rate The share of visitors who take the action you wanted. 100 visits and 5 form fills is a 5% conversion rate., and it will differ by campaign.

The platform can’t see this, so it’s optimizing toward form fills, some of which are garbage. Fixing this usually means sending the qualified stage back to the platform as an offline conversionOffline conversion import Uploading conversions that happened outside the website, such as a lead becoming qualified or a deal closing in the CRM, back to Google Ads or Meta, matched to the original click so the platform learns from real outcomes. so it learns from the right event.

What to do with the results

Once the four checks are done, you’ll have a discount factor per platform and a list of campaigns whose reported results don’t survive contact with the CRM. That’s the moment to make budget decisions, and it’s usually a different set of decisions than the dashboards suggested.

Then, and only then, is it worth talking about creative. Optimizing hooks and angles against a number that’s off by a third just makes you confidently wrong, faster.

If you’d rather have someone run this on your account and hand you the spreadsheet, that’s the measurement audit. It’s the first thing I do with every new client, because nothing else makes sense until it’s done.

Want this checked on your account?

Book a 15-minute call. Bring the ad account and the sales sheet, and we'll see whether they agree.