roas shopify profit tracking meta ads

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

8 min read

You’re in your Meta Ads Manager checking your biggest campaign. ROAS is 3.2x. You’re glowing. You think: “This is working. I should double the budget.”

Then you sit down with your accountant in January and realize you made less profit last year than you thought. Your ads cost more than they looked like they did.

The villain isn’t usually your agency or Meta. It’s ROAS itself. It’s a beautiful lie, and almost every Shopify merchant believes it.

What Meta ROAS Actually Measures

ROAS stands for “Return on Ad Spend.” It’s simple: revenue divided by ad spend.

ROAS = Revenue attributed to ads / Ad spend

For example:

  • Ad spend: $1,000
  • Revenue attributed to ads (per Meta): $3,200
  • ROAS: 3.2x

The problem starts with that word: “attributed.” Attribution is Meta’s guess at which sales were caused by your ads. And Meta’s guesses are generous. This is why we wrote an entire post about what to do when you’re losing money on Facebook ads despite high ROAS.

Here’s how Meta’s attribution system works:

  1. You show an ad to someone.
  2. They click it — Meta records a click. Anyone who converts within 7 days gets attributed to this click.
  3. OR they see it — Meta records an impression. Anyone who converts within 1 day gets attributed to this view.
  4. Multiple touch points — If someone sees your ad, then clicks another ad, then comes to your site directly, Meta uses “cross-device attribution” to tie all those touches together.

On paper, that sounds reasonable. In practice, it creates massive inflation.

The Attribution Inflation Problem

Here’s a real example. A customer named Sarah:

  • Monday 10am: Sees your Instagram ad in her feed
  • Monday 2pm: Searches “your brand name” on Google and clicks the search result
  • Monday 3pm: Browses your site for 10 minutes (no purchase)
  • Thursday 2pm: Gets an email reminder from you
  • Thursday 3pm: Comes back to your site (from her email)
  • Thursday 4pm: Buys something for $85

Who deserves credit for this sale?

From a logical perspective: probably a combination of:

  • Your email campaign (she came from the email)
  • Your brand (she searched for it, so she already knew about you)
  • Your product/price/messaging (she finally decided to buy)

But in Meta’s attribution model:

  • The Monday Instagram ad gets 100% credit for the $85 sale because it’s within a 7-day click window (and she did click it, even if only to search your brand)

In Google Analytics (multi-touch):

  • Instagram gets 25% credit
  • Google gets 25% credit
  • Email gets 50% credit

In Shopify’s actual order data:

  • Email is tagged as the source
  • Instagram is mentioned nowhere

This is attribution inflation. Meta claims the sale. Google claims the sale. Email claims the sale. No one checks who was actually right.

Across thousands of stores, Meta’s attributed revenue is typically 20–40% higher than the actual orders tied to those campaigns in Shopify. Sometimes higher.

The specific sources of inflation:

  1. View-through attribution (1-day window)

    • Customer sees your ad but doesn’t click
    • Comes back via search, email, or direct URL 12 hours later
    • Meta takes credit because they saw the ad
    • Google also takes credit (because they clicked the search)
    • Email also takes credit (because they opened it)
    • Your brand awareness helped, but now 3 platforms claim the same sale
  2. Assisted conversions (last-click rule)

    • Someone researches your product for 2 weeks
    • Sees your ads 5 times over those 2 weeks
    • Finally clicks your email link and buys
    • Facebook says: “That’s ours, we helped during research”
    • You say: “Email converted them”
    • Both are true, but Meta counts it as 100% Facebook
  3. Cross-device attribution

    • Customer sees your ad on their phone at work
    • Clicks it, leaves
    • Comes back on desktop at home and buys
    • Meta bridges the gap via device graphs and says it deserves credit
    • This can be accurate, but it also creates false connections
  4. Organic/direct sales taken as paid

    • Someone who was going to buy anyway (loyal customer, brand searcher) happens to see your ad recently
    • They buy
    • Meta counts it as a conversion from the ad
    • But they would have bought anyway, with or without the ad
  5. Bot clicks and fraud

    • Not all clicks are real people
    • Not all conversions are real purchases
    • Meta’s bot detection filters catch most of it, but not all
    • Fake clicks inflate impression counts and CPC

The result: Meta’s ROAS is almost always 20–50% higher than your actual Shopify revenue divided by ad spend.

If Meta says 4x ROAS, the real number is probably 2.8–3.2x.

A Real Example: Campaign at 3.2x ROAS That’s Actually Losing Money

Let’s walk through the math with real numbers, accounting for all the hidden costs merchants don’t think about.

Meta’s view:

  • Campaign spend: $2,000
  • Meta attributed revenue: $6,400
  • ROAS: 3.2x ✓ Looks great

Your view (after checking Shopify):

  • Campaign spend: $2,000
  • Actual Shopify orders from the campaign: $4,200 (65% less than Meta claims)
  • Estimated ROAS: 2.1x (still decent)

But real profitability is worse:

Gross revenue: $4,200

Subtract costs:

  • COGS (40% of revenue): $1,680
  • Payment processing (Stripe 2.2% + $0.30 per transaction): $105 × 2.2% + ($105 × $0.30) = $33
  • Shopify fees (2.9% + $0.30 per transaction): $105 × 2.9% + ($105 × $0.30) = $33
  • Refunds/chargebacks (5% of revenue): $210
  • Shipping (avg $12 per order): 35 orders × $12 = $420
  • Ad spend: $2,000

Total costs: $1,680 + $33 + $33 + $210 + $420 + $2,000 = $4,376

Profit: $4,200 - $4,376 = -$176 (losing money)

But Meta’s ROAS said 3.2x, which looks wildly profitable. You didn’t know you were losing money. You probably scaled this campaign.

What if COGS was higher (more realistic)?

Most products have 45–60% COGS, not 40%. Let’s recalculate with 50% COGS:

Gross revenue: $4,200

Subtract costs:

  • COGS (50%): $2,100
  • Payment processing: $33
  • Shopify fees: $33
  • Refunds/chargebacks: $210
  • Shipping: $420
  • Ad spend: $2,000

Total costs: $4,796

Profit: $4,200 - $4,796 = -$596 (losing $600)

Same campaign. Same 3.2x ROAS. Now you’re losing money. If you had doubled the budget on this campaign because ROAS looked good, you’d lose another $600. You’d never know until accounting.

How to Calculate Real Campaign Profitability

Stop looking at ROAS. Start looking at contribution margin.

Contribution margin = (Revenue - COGS - Processing fees - Ad spend) / Revenue

This tells you what % of revenue is left over after the direct costs of acquiring and delivering that customer.

Here’s the formula:

Contribution margin = (Revenue - COGS - Payment processing - Shopify fees - Refunds - Ad spend) / Revenue

Example with our campaign:

  • Revenue: $4,200
  • COGS (50%): -$2,100
  • Payment processing: -$33
  • Shopify fees: -$33
  • Refunds: -$210
  • Ad spend: -$2,000
  • Remaining: -$176
  • Margin: -4.2% (losing money)

A healthy target is 15–25% contribution margin. Anything below 10% is risky.

Another way to think about it: payback period.

Payback period = Ad spend / (Average order value - COGS - fees)

If you spend $2,000 on ads and each customer delivers $40 profit (AOV $100 - COGS $50 - fees $10), your payback period is:

$2,000 / $40 = 50 customers

You need 50 customers to break even on that ad campaign. If you got 45 customers, you’re underwater by $200.

What to Optimize For Instead of ROAS

Stop: Optimizing for ROAS Start: Optimizing for contribution margin and payback period

Here’s why:

  1. Contribution margin accounts for the full cost of customer acquisition — not just ad spend
  2. Payback period shows how long it takes to recoup your investment — crucial for cash flow
  3. These metrics are closer to real profit — they account for COGS, fees, returns, and shipping

If you’re optimizing for ROAS, you might keep scaling until your ROAS is 2x, which could still be losing money if COGS is high.

If you’re optimizing for contribution margin, you’d stop scaling at 15% margin, which you’d know is profitable.

Here’s how to set targets:

  1. Calculate your minimum viable ROAS

    • AOV: $100
    • COGS: 50% ($50)
    • Shopify/payment fees: $3
    • Acceptable profit per customer: $20
    • Required revenue per customer: $50 + $3 + $20 = $73
    • Minimum ROAS: $100 / $1 (ad spend per customer)… wait, we need to work backward
  2. Or use contribution margin directly

    • AOV: $100
    • COGS: 50%
    • Fees: 3%
    • Target margin: 20%
    • Revenue available for ad spend: 100 - 50 - 3 - 20 = $27 per order
    • If average CPA is $25, you’re hitting your target
    • If CPA is above $27, pause

This is much clearer than “ROAS target.”

How to Automate Margin-Based Campaign Management

Manually calculating contribution margin for every campaign is tedious. The right platform automates it. Once you understand your margin thresholds, automated kill rules can pause campaigns before they become unprofitable.

You need a system that:

  1. Pulls Shopify orders for each campaign
  2. Applies your COGS (pulled from product data)
  3. Deducts fees (standard percentages)
  4. Calculates contribution margin
  5. Pauses campaigns when margin drops below your threshold

Set it once, let it run 24/7. For example:

Rule: “Pause if contribution margin < 12% after $50 spend”

The system:

  • Checks every 15 minutes
  • Pulls recent Shopify orders from that campaign
  • Calculates total revenue - COGS - fees - ad spend
  • Divides by revenue
  • If margin < 12%, pauses

You could also use contribution profit (dollar amount instead of percentage):

Rule: “Pause if contribution profit < $10 per order”

This is even simpler: require that every order nets at least $10 profit after all costs.

FAQ

Q: Is ROAS ever useful?

A: Yes, as a rough health check. But it’s not actionable. If ROAS is 3x, you don’t know if you’re profitable without also knowing COGS. Use it as a conversation starter, not a decision metric.

Q: What if I don’t track COGS in Shopify?

A: Estimate it. Take your annual COGS / annual revenue and use that percentage. Or enter a blanket rate: “all my products cost 45% of retail.” This estimate is better than ignoring COGS entirely.

Q: Should I use different profitability targets for different product types?

A: Absolutely. Low-AOV products ($20–50) need higher margin % targets because fixed costs matter more. High-AOV products ($200+) can run leaner margin because the dollar profit per order is higher. Use different rules for different campaigns.

Q: How often does attribution inflation vary?

A: Varies widely. Brand campaigns might have 30% inflation (Meta takes credit for sales that would have happened anyway). Cold traffic campaigns might have 10% inflation (mostly true conversions). Check your own data: compare Meta attributed revenue to Shopify orders for a full month, and calculate the gap.

Q: Can I use Google Analytics instead of Shopify for profitability?

A: Google Analytics is better than Meta’s numbers, but Shopify is still the source of truth. GA can’t see order COGS or refunds. Use Shopify as primary, compare to GA for sanity check.

Q: What’s a realistic profit margin for Meta ads?

A: 15–25% contribution margin is healthy. 10–15% is sustainable but tight. Below 10% is risky (one bad month could mean losses). Anything below 5% probably isn’t actually profitable after overhead.

Stop Trusting the Vanity Metric

ROAS is how Meta makes money — by showing you big numbers that feel successful. But profit is measured in dollars, not multiples.

Connect your Shopify store to a platform that calculates real profitability, set margin-based rules, and automate your pausing decisions. You’ll know exactly which campaigns make money and which ones don’t.

Start your free trial today. See your real campaign profitability in 5 minutes.

Ready to stop losing money on Meta ads?

Set up automated kill rules and let Calatrix protect your ad spend 24/7. Pair this with Shopify's real order data and COGS tracking to optimize for actual profit, not vanity metrics.

Start 14-day free trial