All articles

August 17, 2026 - 3 min read

Why your ROAS looks great and your margin doesn't

Coming soon

This describes a real problem worth understanding today. The automated version inside Ctrl PPC is still on our roadmap.

Two ad platforms, both reporting a strong ROAS this month, and a real bank balance at the end of it that does not agree with either of them. This is not a tracking bug, and it is not a coincidence that happens once. It is what the number was always going to say, because an ad platform measures conversion value at the moment of the click or view -- never what happened to that order afterward.

What the moment of the click never sees

Three things routinely disappear between a platform's reported ROAS and the number that actually lands in a bank account: orders that get refunded days or weeks later, discount codes stacked by affiliates or influencers that quietly erode margin on paper-profitable orders, and purchases credited to a channel from a customer who was already a repeat buyer, as if the ad created a sale that would likely have happened anyway.

Why platform-reported ROAS is not lying, exactly

None of this is a platform being dishonest. It is reporting exactly what it was asked to report, measured at the only moment it has access to: the transaction event, before a refund, a return, or a repeat-purchase check could possibly have happened yet. The gap is structural, not a bug to file a ticket about.

A worked example

Illustrative case: a Meta campaign reports a 400% ROAS this month, which looks like a clear scale-up decision. Set against the store's own order data over the same window, roughly a fifth of that revenue gets refunded within three weeks, and a meaningful share of the remaining orders came from customers who had already purchased before -- revenue that arguably belonged to retention, not to this campaign's prospecting spend. The platform's number was not fabricated. It was simply asked the wrong question, at the wrong moment, using the wrong source.

Where the real answer has to come from

Settling this requires a different source of truth than either ad platform: the store's own order data -- refund status, discount codes applied, and whether a customer ID has purchased before. Set against that, a channel's real return can look meaningfully different from what it reports, sometimes worse, occasionally better once repeat-customer credit gets sorted out honestly.

Why this is not live inside Ctrl PPC yet

This is one of the areas Ctrl PPC is actively building toward, not something available in every account today -- store-data integrations are still on our roadmap, tracked openly on the pricing page rather than left unsaid. The honest version of the promise: connecting real order data will not produce a nicer-looking number, it will replace a hopeful one with a checkable one, and that is worth waiting to build correctly rather than shipping early on a guessed cost basis.

In the meantime, the check is worth running by hand at least once a quarter, on any channel spending seriously: pull refund and discount data from the store directly, and compare it against what the ad platform reported for the same window. The gap, whatever it turns out to be, is the real number.

See how the Decision Framework applies to your own accounts.

Request a demo