← All posts

Platform ROAS isn’t revenue. What to judge campaigns on instead

Ad platforms grade their own homework. A practical look at tying spend to orders, margin, and closed deals, and what changes when you do.

Every ad platform will tell you it’s working. Meta says it drove the sale. Google says it drove the sale. Add up what each one claims and you’ll often land well above what actually hit your bank account.

Nobody’s lying, exactly. Each platform counts conversions with its own rules, its own attribution window, and its own view of the customer, and none of them can see the others. They’re grading their own homework.

But the bigger problem isn’t who gets credit. It’s what the number is measuring in the first place.

ROAS measures revenue. Your business runs on profit.

ROAS, return on ad spend, is revenue divided by ad spend. Spend $1,000, bring in $4,000 in sales, and you have a 4x ROAS. Looks great.

What ROAS doesn’t know:

So a campaign can show a 4x ROAS and still lose money. And because the platforms optimize toward whatever value you give them, a revenue-only setup quietly teaches the algorithm to chase the easiest sales, not the most profitable ones.

POAS: profit on ad spend

POAS swaps revenue for profit. It’s gross profit divided by ad spend.

Same $1,000 in spend, same $4,000 in sales. If your gross margin on those orders is 30%, that’s $1,200 in profit, so your POAS is 1.2. Above 1 means the ads brought in more profit than they cost. Below 1 means you paid to grow revenue and lost money doing it.

That’s a very different conversation than “we’re at a 4x.”

The real unlock isn’t the report, though. It’s the signal. Google Ads doesn’t have a separate POAS bid strategy, but it doesn’t need one. If you send profit as the conversion value instead of order total, Target ROAS is now bidding on profit. Same idea on Meta: whatever value you pass with the purchase is what the algorithm learns to find more of.

If you sell physical products, I go deeper on doing this product by product in Scaling a store on margin, not ROAS.

For lead gen, it’s the same idea over a longer timeline

With lead gen, the form fill isn’t the money. The closed deal is. And the deal might close weeks after the click.

What I hear most from a campaign perspective is: make sure the signals are actually mapping and feeding back in, even when the deal closes 60 or 90 days later. If the platform only ever sees form fills, it optimizes for form fills. If it sees which leads became customers, and what they were worth, it starts finding more people like them.

The windows matter here:

Understanding where profit is actually coming from, even across a 90-day window, is worth way more to the campaign than another month of optimizing toward cheap form fills.

The part everyone forgets: the UTM disappears

All of this depends on knowing where the customer came from. And here’s where most setups quietly fall apart.

Someone clicks your ad. They land on a page with UTMs and a click ID in the URL. Then they browse. They check the pricing page, read an about page, come back to a product. By the time they submit the form or check out, they’re on a totally different page, and that URL has no UTMs on it anymore.

So the conversion gets recorded with no source. Or worse, it gets credited to “direct.” And the landing page, the one that actually told you which ad, which campaign, and which keyword brought them in, is long gone.

The fix is a small script that grabs those parameters on the first page someone lands on, stores them locally in the browser, and attaches them to the form or order when they finally convert. Then you pass that same information to your CRM or store, so when the deal closes 45 days later, you still know which click it came from and can send it back to the platform.

A couple of things to watch:

I walk through what that script looks like, and the other ways tracking breaks quietly, in Your pixel is probably broken.

What to judge campaigns on instead

Judge spend on the number your business actually lives on:

Then do the boring work that makes it real:

  1. Pull orders and deals from the source of truth. Your store or your CRM, not the ad platform.
  2. Keep the source attached. Store UTMs and click IDs from the landing page and carry them through to the conversion.
  3. Send profit back to the platforms. Through server-side events and offline conversion imports, inside each platform’s window.
  4. Watch the blended number. Total profit against total spend, week over week. If that moves the right way, the platform-level credit fights matter a lot less.

And some of what you find won’t be the ads at all. Sometimes it’s the landing page, and sometimes it’s that the actions before the purchase were never measured.

What changes when you do this

Usually a few uncomfortable things, then a few great ones.

Some campaigns that looked like winners turn out to be riding on low-margin sales or leads that never close. Some campaigns that looked mediocre turn out to bring in your best customers. Budgets move. And bidding gets smarter, because the platforms are finally optimizing toward profit instead of revenue.

Why this is so hard to do today

None of this is new. Good teams have been doing pieces of it for years. The problem is the pieces live in different places.

One tool handles server-side tracking. Another is an attribution dashboard. Another calculates profit. Your margins are in a spreadsheet, your deals are in the CRM, and your bids are in the ad platforms. Each tool covers a slice, and it’s on someone to stitch it together, keep it running, and actually act on what it shows. That’s the difference between martech and what we call grotech.

That’s the gap we’re building Apello for (more on how it works in What it means to hand your computer to a growth coworker). It connects spend to orders, margin, and closed deals, keeps the tracking underneath it clean, and judges campaigns on profit instead of the number the platform reports. When something doesn’t add up, it tells you why and what it would change.