Aplon
← Blog

Your ROAS Is Counting Customers You Didn't Pay For

AttributionThe Aplon team6 min read

A Facebook click ID on a URL is not proof that Facebook sold anything. Here is how free customers end up on your ad report, and how to get them off it.

Your ad platform says it made you 4 sales today.

Some of those people were going to buy anyway.

That is not a controversial statement — everyone nods at it and then goes back to reading the same dashboard. What almost nobody can tell you is how many, or by what mechanism a free customer ends up filed under paid. So here is the mechanism, in full, because once you can see it you cannot unsee it in your own reports.

It is worth saying that this is not a fringe mistake made by careless tools. It is the default behaviour of most attribution setups, it is often written into the specification as if it were correct, and it survives because the resulting number looks plausible.

The thing everyone treats as proof

When somebody clicks a Facebook ad, Facebook adds a tag to the link. It looks like this in the address bar.

yourstore.com/products/thing?fbclid=IwAR2x9...

Google does the same with gclid. Every ad platform has one. That tag is called a click ID.

Almost every attribution setup ever built treats it as a confession: this tag is here, therefore an ad happened, therefore the ad gets the sale.

It is not a confession. It is a piece of text in a URL. Here are four ways it gets there without an ad ever selling anything.

Four ways a free customer becomes a paid one

One: the click and the sale are different journeys. Someone taps your ad on Tuesday, looks for nine seconds, leaves. On Saturday they remember you, search your brand name on Google, and buy. If your system asks "did this shopper ever arrive with a paid click ID?", the answer is yes, and Meta takes a sale that Google's search results delivered. The ad did something — it created the memory. It did not close the order, and a report that cannot tell those apart will always overstate the platform with the loudest top of funnel.

Two: the tag outlives the visit. Click IDs get stored — in a cookie, in a saved session, in the URL a customer bookmarked. Weeks later that stored value is still sitting there, ready to be attached to whatever happens next. Your customer did not click anything. Your storage did.

Three: people share links. A customer taps your ad, likes the product, and sends the link to a friend. That link still has the click ID in it. The friend buys. You paid for one click and got credited with two customers, one of whom arrived by word of mouth — the cheapest channel you have, quietly relabelled as your most expensive one.

Four, and this is the big one: organic posts carry tags too. You post your product on your own Instagram. That link is tagged so you can track it. Someone taps it and buys. No money changed hands. It lands in the same bucket as the ads, because the bucket was built to sort by tag present, not by money spent.

None of these are edge cases. Number four happens on every store that posts its own products, which is every store.

Four journeys that all arrive carrying a Facebook click ID. Only the first one was bought.
Four journeys that all arrive carrying a Facebook click ID. Only the first one was bought.

What the mistake actually costs you

It is not that your ROAS number is a bit flattering. It is what you do next.

You read a good ROAS, so you put more money in. The extra money buys more of the traffic that was genuinely incremental, plus more of the traffic that was going to buy anyway — and the second group does not grow with spend, because those people were never bought in the first place. So your reported ROAS holds up while your actual profit sags, and the gap widens the harder you scale.

Then the real damage. You look at your organic channels — email, word of mouth, your own social — and they look weak, because a share of their results has been quietly moved onto the ads report. So you cut the budget for the thing that was working and feed the thing that was taking credit for it.

That is how a store ends up spending more each month and keeping less, with every dashboard agreeing that things are going well.

What proof should actually look like

Three tests. A click only counts as paid if it passes all three.

Was there real money behind it? A click ID should be matched back to an actual ad click in your ad account. Meta and Google both let you resolve an ID back to the campaign that spent money on it. If nothing in your spend records corresponds to it, it was not a paid click, whatever the URL says.

Did the click start the journey that ended in the order? Not "appears somewhere in this shopper's history". Started it. If a later visit came from search, email or direct, that later visit is what closed the sale.

Did it happen inside a window you can defend? Pick a window and apply it to every channel identically. The specific number matters far less than using the same one everywhere, because comparing a 7-day channel to a 28-day channel is not a comparison at all.

Anything that fails those tests is not paid. It might be organic social, it might be word of mouth, it might be a returning customer. All three deserve credit. None of them should be on your ad bill.

Check your own store this week

You do not need software for the first pass.

  1. Take last month's orders that your ad platform claims. Count them.
  2. Take the same month's total orders and revenue from Shopify.
  3. Add up what every platform claims. Meta, Google, TikTok, email, everything.
  4. If the claimed total is bigger than what actually happened, the difference is orders being counted twice. That difference is your floor, not your ceiling — it is only the double-counting you can see.

Then one manual check that takes ten minutes and is worth more than the arithmetic: pick five orders your ads claim. Look at what those customers actually did before buying. How many had been to your site before the ad? How many came from a link you posted yourself? Five orders will tell you which of the four mechanisms above is live in your store.

The uncomfortable part

When you fix this, your ROAS goes down.

Nothing about your business got worse that day. The only thing that changed is that you stopped counting customers you did not pay for. But it will feel like a loss, and if you report to anyone — a partner, an investor, yourself in a spreadsheet — you will be explaining a number that fell for a good reason.

Do it anyway. A number you trust at 1.8 is worth more than a number you don't at 3.4, because you can actually act on the first one.


Aplon separates paid from organic by checking the click against real ad spend, not just the tag on the URL. [See what your real numbers look like](/).


Aplon turns your Shopify store into profit analytics. See how it works.

Your ROAS Is Counting Customers You Didn't Pay For · Aplon