Why Your Meta ROAS Doesn't Match Your Bank Account

Meta Ads Manager says 4x ROAS. Your accountant says margins are flat, or worse, shrinking. Both dashboards are technically correct, and that gap is exactly where a lot of D2C brands quietly bleed money while celebrating a "winning" campaign.

This is one of the most common disconnects in performance marketing, and it's rarely explained clearly because platforms have no incentive to explain it. Meta's job is to report on Meta's activity. Your job is to run a profitable business. Those are not the same job, and they don't use the same math.

ROAS measures revenue, not profit

Return on ad spend is a simple ratio: revenue generated divided by ad spend. That's the entire calculation. It doesn't know your product cost, your shipping cost, your return rate, your payment gateway fees, or the discount code a customer used at checkout.

A brand selling a product at 70% gross margin and a brand selling at 25% gross margin can post the exact same 4x ROAS on the exact same ad spend, and one of them is thriving while the other is losing money on every single order. ROAS has no way of telling you which one you are, because it was never built to.

This is not a flaw in Meta's reporting. It's simply outside the scope of what platform-level metrics are designed to measure. The mistake is treating ROAS as if it already accounts for profitability, when it's actually just a proxy for "did this ad generate top-line revenue efficiently."

The three things ROAS quietly ignores

Cost of goods and fulfillment. Ad platforms see the sale price at checkout. They never see what it cost you to manufacture, pack, and ship that product. A brand with a 70% gross margin has enormous room to absorb a mediocre ROAS and still be deeply profitable. A brand with a 25% gross margin needs a dramatically higher ROAS just to break even on the same ad spend, and Meta reports both scenarios identically if the ratio matches.

Returns and RTO (return to origin). Meta counts the purchase event the moment checkout completes. It has no visibility into what happens three days, ten days, or thirty days later when the order gets returned, refused at the door (a major issue for COD-heavy markets), or charged back. If your category runs a 15-20% return rate, a meaningful chunk of "reported revenue" never actually lands in the bank, but it stays in the ROAS calculation forever unless you're manually reconciling it.

Discounting and promotional codes. If a campaign ran with a 20% off code to boost conversion rate, ROAS looks stronger because more people converted at a lower price point per unit, but your actual take-home per order got worse, not better. A discount can simultaneously improve ROAS and shrink real profit, which is precisely backwards from what the dashboard implies.

A worked example

Say a product retails at ₹1,000. COGS is ₹350, shipping and packaging run ₹90, payment gateway fees are around 2.5% (₹25), and the ad spend to acquire that specific sale was ₹250.

Reported ROAS: ₹1,000 / ₹250 = 4x. On paper, a strong campaign.

Actual contribution after costs: ₹1,000 − ₹350 − ₹90 − ₹25 − ₹250 = ₹285. Still profitable, but a fraction of what a "4x ROAS" intuitively suggests to most business owners, who tend to hear "4x" and assume something closer to quadrupling their money.

Now run the same math with a 20% discount code active on that order (final sale price ₹800, ad cost unchanged at ₹250):

Reported ROAS: ₹800 / ₹250 = 3.2x. Looks slightly worse.

Actual contribution: ₹800 − ₹350 − ₹90 − ₹20 − ₹250 = ₹90. The ROAS dropped by 20%, but the real contribution margin dropped by nearly 70%. The dashboard understates how much the discount actually cost you.

What this looks like for a skincare or personal care brand

A D2C skincare brand often runs subscription bundles or "buy 2 get 1" style offers to lift average order value and conversion rate simultaneously. These bundles frequently include a lower-margin free or discounted SKU baked into the offer. A campaign promoting that bundle can report 5x ROAS while the true bundle margin, once you account for the discounted or free unit, the extra packaging, and a higher return rate on bundles (customers testing multiple products at once tend to return more), puts the brand closer to breakeven per new customer acquired. The dashboard says winner. The P&L says neutral at best, and sometimes negative once customer service and logistics overhead for handling bundle returns gets factored in.

What this looks like for a fashion or apparel brand

Fashion carries structurally higher return rates than most categories, frequently 20-30% or more depending on price point and whether sizing charts are accurate. A campaign can report a healthy 3.5x ROAS on gross sales, but once returns are deducted, net ROAS on the same spend can fall to 2.5x or lower. If the brand's minimum viable ROAS (the number needed to hit target contribution margin) was calculated assuming a 10% return rate, and actual returns are running at 25%, that campaign has been quietly unprofitable for months while every internal report showed a "winning" number.

The metric to run alongside ROAS

Contribution margin per order is revenue minus COGS, minus shipping, minus payment gateway fees, minus the ad spend itself, minus an allowance for expected returns based on your actual historical return rate for that product category. If that number is positive after ad spend, you have a genuinely profitable acquisition channel. If it's negative, no amount of ROAS optimization fixes the underlying math, because you're funding growth at a loss, and scaling a loss just means losing money faster with more confidence.

How to build this into your weekly reporting

Start with your actual cost structure, not estimates. Pull real COGS per SKU, real average shipping cost (not the shipping fee you charge customers, your actual carrier cost), real payment gateway percentage, and your trailing 90-day return rate by product category.

Build a simple contribution margin column next to ROAS in whatever reporting sheet or dashboard you already use. It doesn't need to be sophisticated, a spreadsheet with a formula referencing your cost inputs is enough to start. Review both numbers together before deciding to scale any campaign, and set your actual scaling threshold based on contribution margin, not ROAS alone.

Common mistakes brands make with this metric

Using category-average COGS instead of SKU-level COGS. Different products in your catalog almost certainly have different margins. Blending them into one average number hides which specific products are actually worth scaling ad spend behind.

Ignoring return rate entirely until it shows up in the bank reconciliation. By the time returns show up as a P&L problem, you've often already scaled the campaign that's driving them.

Recalculating contribution margin once and never updating it. Shipping costs change, gateway fees change, COGS changes with supplier pricing, and return rates drift as your customer base and product mix shift. This needs to be a living number, checked quarterly at minimum.

Confusing this with "we don't trust Meta's data." This isn't a data accuracy problem, Meta is reporting exactly what it's designed to report. The fix isn't distrust, it's adding a second, complementary metric that measures what Meta was never built to measure.

FAQ

Is a high ROAS ever meaningless? Not meaningless, but incomplete. A high ROAS still tells you the campaign is efficient at generating revenue relative to spend, which matters. It just doesn't tell you whether that revenue is profitable once real costs are applied.

What ROAS should I actually target? There's no universal number. It depends entirely on your gross margin, return rate, and fixed cost structure. A 70%-margin brand can profitably run campaigns at a ROAS that would bankrupt a 25%-margin brand. Calculate your own minimum viable ROAS from your contribution margin math rather than borrowing an industry benchmark.

How often should I recalculate contribution margin? Quarterly at minimum, and immediately after any change to COGS, shipping rates, or a noticeable shift in return rate.

Does this apply differently to subscription models? Yes, subscription brands should extend this further into CAC payback period, since first-order contribution margin often understates the real economics once repeat purchases are factored in.

The takeaway

ROAS tells you if Meta thinks the ad worked. Contribution margin tells you if the business actually made money. Both numbers matter, but only one of them should be the deciding factor on whether to scale a campaign, and it's usually not the one sitting front and center in your ads dashboard.