← Back to Blog

June 5, 2026

Why ROAS Doesn't Tell You If You're Actually Profitable

ROAS of 4x sounds great. But after refunds, shipping, COGS, and fees, that campaign might be losing money. Here's how to track real profit, not just ad returns.

Johny | Shopsterra

Most Shopify founders check ROAS before they check their bank balance. It is the number ad platforms optimize for, the metric agencies report in weekly calls, and the shortcut most operators use to decide whether a campaign is working.

The problem is simple: ROAS measures revenue, not profit. And in ecommerce, the gap between those two numbers is where businesses quietly bleed.

The ROAS trap

ROAS measures revenue per ad dollar. A 4x ROAS means $4 in revenue for every $1 spent on ads. Sounds profitable. But revenue is not profit.

Here's what ROAS doesn't include:

  • Cost of goods sold (COGS)
  • Refunds and returns
  • Shopify transaction fees
  • Shipping costs
  • Payment processing fees

A store doing $10,000 in revenue from a campaign with 4x ROAS spent $2,500 on ads. Revenue minus ad spend = $7,500. Looks good.

But subtract $4,000 COGS, $800 in refunds, $300 in fees and shipping, and real profit is $2,400. That's a 24% net margin, not a 75% margin ROAS implies.

This is not a theoretical example. It is the default state for stores that scale on platform ROAS without a profit layer underneath. Meta and Google report what customers paid at checkout. They do not know your landed cost, your return rate, or whether you subsidized shipping to close the sale.

ROAS also treats all revenue as equal. A $50 order with 5% refunds and $12 COGS counts the same as a $50 order with 22% refunds and $28 COGS. Your ad platform cannot see that difference. Your Shopify dashboard does not surface it in one number either.

So when someone says a campaign is "printing at 4x," the honest follow-up question is: printing what, exactly? Gross sales or money you keep?

Why Shopify doesn't show you this

Shopify Analytics tracks revenue, orders, and conversion rate. It pulls in ad spend only if you manually connect ad accounts, and even then it shows blended ROAS across all channels, not per-product net margin.

The result: most store owners optimize for ROAS while their actual profit stays invisible.

Shopify is excellent at commerce reporting. It was not built to be a full profit-and-loss engine for performance marketing. You can see which products sold. You can see total sales by day. You might see a blended marketing number if integrations are wired up correctly.

What you typically cannot see in one view:

  • Net margin per SKU after ads, COGS, refunds, shipping, and fees
  • Whether a campaign funded profitable units or refund-heavy variants
  • Daily contribution margin that updates as returns post in the following week

That last point matters more than people admit. Refunds lag. A campaign that looked like a winner on day three can flip negative by day fourteen when returns hit. ROAS on the ad platform does not wait for that correction.

The result is a familiar loop. Revenue charts go up. Ad spend goes up. Founders feel momentum. Then month-end reconciliation shows thinner cash than expected. Nobody lied. The stack just never connected revenue to what was left after every cost that actually left the business.

What to track instead

Net profit per order is the number that matters. It's calculated as:

Revenue - COGS - Ad spend - Refunds - Shipping - Fees = Net profit

For a $50 product:

  • Revenue: $50
  • COGS: $18
  • Ad spend attributed: $8
  • Refund reserve: $3
  • Shipping: $5
  • Shopify fees: $1.50
  • Net profit: $14.50 (29% margin)

Without this breakdown, you're flying blind.

ROAS can still be useful as a directional signal. If ROAS collapses from 3.2x to 1.4x week over week, something broke in acquisition or offer. But ROAS should feed into a profit model, not replace one.

Use ROAS to spot efficiency changes quickly, then validate with net margin before you change budget. At $200k to $2M in annual revenue, that second layer needs to run daily, not monthly.

The product-level problem

Blended ROAS hides which products are actually profitable. A store might have a 3.5x blended ROAS with one product at 6x (genuinely profitable) and another at 1.8x (losing money after COGS and fees).

Scaling the losing product because it "has good ROAS" is one of the most common and expensive mistakes in ecommerce.

Blended ROAS is store revenue divided by total ad spend. It is easy to report and easy to misread. Platforms push budget toward what converts on revenue because that is what they can measure cleanly.

Imagine a catalog where two SKUs drive most of the spend. Product A runs 5.8x ROAS with 38% landed COGS and a 4% refund rate. Product B runs 2.1x ROAS with 52% landed COGS and a 14% refund rate. Blended ROAS might still look acceptable at 3.4x while Product B destroys contribution every day.

That is how teams end up "scaling winners" that are actually subsidized by quieter SKUs with better unit economics. The fix is not abandoning ROAS. The fix is splitting ROAS by product and then subtracting the costs ROAS ignores.

How to fix your profit tracking

You need a system that pulls together:

  1. Order revenue from Shopify
  2. COGS per product (you input this)
  3. Ad spend per channel (Meta, Google)
  4. Refunds and returns (automatic from Shopify)
  5. Fees and shipping (automatic from Shopify)

This gives you net profit per product, per day, updated automatically.

Manual spreadsheets can get you there once. They fall apart at weekly cadence because refunds post late, COGS changes by supplier batch, and campaign-to-SKU mapping is tedious. One wrong allocation rule and you scale the wrong SKU for a month.

The faster path is connecting Shopify order data with your cost inputs and ad accounts in one place. You keep ROAS where it belongs, on the media side. You add a profit layer that answers the question ROAS cannot: what did we keep?

Shopsterra does this for Shopify stores doing $200k-$2M in annual revenue. Connects in 5 minutes via Shopify OAuth. No spreadsheets, no manual data entry.

The real number

One of our beta stores had a 3.8x ROAS on their top product. After running the full profit calculation, net margin was 11%. Not bad, but not the 74% their ROAS implied. They found a second product with a 2.1x ROAS and 31% net margin because COGS were lower and refund rate was near zero.

They shifted budget. Profit went up.

ROAS is a useful signal. It's not your profit number. Track both.

If you have never run the full subtraction on your top SKUs, assume at least one "winner" in your ad account is thinner than it looks. Start with your top three products by ad spend, calculate net margin for each, and compare that ranking to your ROAS ranking. If the lists do not match, you have found the leak.