Most store owners judge their media buyer by one screen: the Meta Ads Manager. The numbers there are always pretty. You spent $920, you "made" $11,000, ROAS 1230%. It looks like the person is doing magic.
The problem is that this screen does not show your profit. It shows what Meta decided to credit to itself. Those are two very different things. On real numbers we will watch "ROAS 1230%" turn into a loss in the bank.
I am not a copywriter rewriting someone else's article. I set up analytics and server-side tracking for e-commerce, so I see this gap from the inside: the number a client gets in a report versus the money that actually hits the account.
The core sleight of hand: ROAS sold as the result
ROAS (return on ad spend) is the ratio of "revenue" to ad spend. ROAS 1230% simply means the cabinet credited about $12 of sales for every $1 spent. Media buyers love it because it almost always looks like a win. But three convenient silences are baked into it:
- It is revenue, not profit. Margin, cost of goods, shipping and returns are not in it.
- It is not your revenue, it is Meta's estimate. It is counted by the ad platform itself, which has every reason to look effective.
- It is not "because of the ad," it is "after contact with the ad." Most of the over-crediting lives in that difference.
The honest metric is called ROMI (return on marketing investment): it counts real profit after margin, operating costs and returns, not the cabinet's top-line revenue. It is almost never shown, because it is less flattering. Sometimes, as we will see, it is negative.
Case: a cosmetics store
A real example by structure (no brand name). One month, one main channel, Meta Ads.
Two dashboards, two stories
The ad cabinet reports the most flattering number it can. A second, independent source tells you how much of it is real.
- Amount spent
- $920
- Purchases
- 283
- Conversion value
- $11,332
- Purchase ROAS
- 1230%
- Sessions
- 6,140
- Conversions
- 188
- Revenue (after refunds)
- $7,500
- Store total, all channels
- $9,805
Meta never walks back a counted conversion. GA4, set up properly, subtracts refunds — so it sits closer to the bank.
Sit with those rows. Meta credited itself $11,332. The entire store, across every source combined (search, direct, email, ads), made $9,805 that month. The ad cabinet "sold" about fifteen hundred dollars more than physically exists.
That is not a rounding error. It is a structure in which the report can never reconcile with the bank. Here is why.
Four reasons the cabinet always overstates
1. The "7-day click, 1-day view" attribution window
This is Meta's default setting. The cabinet credits a sale to itself if the person clicked the ad within 7 days before buying, or, within 1 day before buying, just saw it (view-through). They scrolled past it, came back five days later from Google and bought, but Meta has already logged that sale as its own.
A narrower window (say "1-day click") gives cleaner numbers, but it makes the media buyer look worse on paper. So the standard move is to keep the widest window with view-through on. Technically not a lie, but a deliberate choice to show the most flattering picture.
2. Cannibalizing other channels
Through that same wide window, ads "pull" sales that other channels actually drove: Google organic, Google Ads, email and SMS flows, direct visits from loyal customers. The person was going to buy anyway, saw the brand in search, got a discount email. But because a banner flickered in their feed a week ago, the sale goes to Meta.
That is exactly where the gap between $11,332 in the cabinet and $7,500 in the analytics "Facebook / CPC" channel comes from. Over three and a half thousand dollars is other channels' credit that the cabinet annexed.
3. Returns, declined payments and out-of-stock are ignored
Here we have a hard number for this store: only 85% of orders actually complete. The other 15% are returns, declined or abandoned card payments, and cases where the item is not really in stock because the site status was not updated but the order already came in.
Meta does not know and does not want to know about those 15%: it counted the sale at checkout and never revisits it. Google Analytics, by contrast, subtracts them when the "refund" event is set up correctly (more below) — which is why the GA4 figure is more honest: it is already free of the orders that fell through.
So "revenue" in the Meta cabinet is an optimistic scenario where every order is paid, shipped and kept. In a real store that never happens: roughly one in seven orders falls through.
4. The goal fires on the "Pay" click, not on the actual payment
There is a common misunderstanding here. The "thank you for your order" page usually shows after a successful payment, so by itself it is not lying. The problem is a different setup: the "Purchase" event is wired to the click on the "Pay" button on the checkout page.
The person clicked "Pay," but the card was declined, or they bailed out in the payment gateway, or the payment page never loaded. The event already fired, the sale is counted, the money is not there. That is how intents to pay end up in your stats instead of actual payments. The "Purchase" event should fire on the backend, at confirmation of a successful transaction.
ROAS vs ROMI: walking the money from cabinet to cash
Now the interesting part. Take not the imaginary $11,000, but the revenue analytics realistically credited to ads: $7,500 (about 188 completed orders at a $40 average order value). One thing matters here: that GA4 figure is already net of refunds, so there is no need to discount it again for returns. Run that money through the store's real economics.
Inputs: 30% margin, operating cost of 15% per order (about $6 on a $40 order), specialist fee $300, ad spend $920.
From the cabinet number to the cash
Each step looks harmless on its own. Stacked together they turn “ROAS 1230%” into a loss.
- Cabinet “revenue” (Meta)$11,332
- Revenue credited in GA4 (after refunds)$7,500
- Gross profit (30% margin)$2,250
- Minus operating cost (15%)$1,125
- Minus ad spend$205
- Minus specialist fee−$95
Figures illustrative of one real cosmetics-store month. The GA4 revenue is already net of refunds, so it is not discounted again.
Look at the top row and the bottom row. The cabinet shows a triumphant $11,332 and ROAS 1230%. The bank shows minus $95. A campaign that looks like a gold mine on the screenshot actually ran at a loss once you count margin, operations, the ad spend itself and the specialist's fee.
Notice how the gap accumulates. Each step looks innocent on its own: first a wide attribution window inflates the cabinet "revenue," then only 30% margin survives on the honest figure, then operations eat another slice. Together they turn "ROAS 1230%" into a loss. That is why "all good, let's scale" cannot be decided on a cabinet number: it has nothing to do with your money.
Cleaner analytics: refunds in GA4
A separate reason Google Analytics is closer to the truth than the Meta cabinet: GA4 can subtract returns, and Meta essentially cannot.
GA4 has a standard e-commerce event called "refund." When an order is returned, canceled or a payment fails, you send a "refund" event with the same transaction_id as the original purchase. For a partial refund you can pass the specific items. GA4 then subtracts that amount from revenue in reports, so "Purchase revenue" and total revenue reflect returns already deducted.
What that gives you in practice:
- The GA4 number gradually converges with the real bank balance instead of living in an imaginary world where every order is paid.
- For returns and chargebacks you can send a "refund" the moment an order is marked returned or disputed. Then refunds stop inflating "revenue."
- The most reliable way is server-side: your CRM or order system sends the "refund" to GA4 via the Measurement Protocol when an order status changes to "returned" or "canceled." It does not depend on the customer's browser and is not lost to ad-blockers.
The Meta cabinet has almost no equivalent: it never reverses a counted conversion. That is why two independent, honestly configured sources (the bank plus GA4 with refunds) are always more trustworthy than one self-interested ad cabinet. How to wire this up technically is covered in detail in the article on server-side tracking with GA4 and Meta CAPI →.
How to audit your media buyer in 10 minutes
You do not need to be an analyst. Just reconcile a few screens:
- Reconcile revenue. The amount in the Meta cabinet versus actual store revenue for the same period. If the ads "made" more than the entire store, the question is settled.
- Ask about the attribution window. If the report uses "7-day click, 1-day view," ask for the same numbers on a "1-day click" window and see how far they drop.
- Calculate ROMI, not ROAS. Margin minus operating cost minus ad spend minus the specialist fee. That is your result in dollars.
- Ask whether the "Purchase" event matches an actual payment, not a "Pay" click.
- Check whether refunds are configured in GA4. If not, your analytics overstates too, just less than Meta.
A good specialist answers these calmly and shows you honest numbers themselves. The one who starts explaining why "that's the wrong way to count" and why you should look only at the cabinet has already answered you with their reaction.
Bottom line
A media buyer does not have to be a fraud to show inflated numbers. Often it is enough to leave the default settings on and not count the inconvenient parts: not the failed orders, not the margin, not their own fee. The Meta cabinet does the rest and credits itself other channels' sales.
Your job as the owner is not to trust one pretty screen. Reconcile the ad report against the bank, the margin and the completion rate at least once. Very often a triumphant "ROAS 1230%" turns into a small but very real loss after that. And that is not a reason to quit advertising, it is a reason to start measuring it honestly: otherwise you are scaling a loss while thinking you are scaling profit.
ROAS vs ROMI, answered
Next step
If you advertise and still look only at the Meta cabinet, you do not know your real result. Ad and analytics setup → includes an honest ROMI report, correct attribution and server-side tracking with refunds in GA4. Building a store from scratch? Clean analytics is already part of the online-store baseline →.