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:
- What the product cost you to make and ship
- Payment fees, discounts, and returns
- Whether that buyer was a new customer or someone who was going to buy anyway
- For lead gen, whether that lead ever turned into a deal
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:
- Google Ads keeps the click ID (the GCLID) for 90 days, and its click-through conversion window maxes out at 90 days. Import a closed deal inside that window and Google can tie it back to the click. Miss it and the signal is gone.
- Meta’s Conversions API only accepts standard web events up to 7 days old. For longer cycles, you send CRM stage changes (qualified, closed) as their own events as they happen, so Meta learns along the way instead of waiting on a deal that closes in month three.
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:
- Keep first touch and last touch. The first ad someone clicked and the last one before they converted are both useful. Don’t overwrite one with the other.
- Don’t rely on the browser alone for long cycles. Safari limits how long scripts can keep data around, often to about 7 days. If your sales cycle is longer, save the source on your server or CRM as soon as you have it.
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:
- Ecommerce: profit after product cost, shipping, fees, and returns. POAS per campaign, and contribution margin for the whole store.
- B2B and SaaS: closed deals and pipeline value, tied back to the original click.
- Local businesses: booked appointments and jobs, not clicks on the directions button.
Then do the boring work that makes it real:
- Pull orders and deals from the source of truth. Your store or your CRM, not the ad platform.
- Keep the source attached. Store UTMs and click IDs from the landing page and carry them through to the conversion.
- Send profit back to the platforms. Through server-side events and offline conversion imports, inside each platform’s window.
- 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.