Skip to content

High ROAS but no profit: how to find the leak, step by step

Take one closed month. Write down what Meta and Google Ads claim and set it against Shopify's net sales. Take out tax, then walk down from gross profit through fees, ad spend and fixed costs. The step where the money disappears is your leak.

By , Founder & CEOUpdated 8 min read

Run the numbers for your store: the free break-even ROAS calculator, or the free Shopify fee calculator.

Build a one-month bridge from the ad dashboards to your bank. Write down what each platform claims and set the total against Shopify's net sales. Then take out tax, product costs, fees, ad spend and fixed costs, in that order. The step where a healthy ROAS turns into a loss is usually your leak.

Eight steps, one closed month, three admin screens: Shopify, Google Ads and Meta Ads Manager. The menu paths are the ones Shopify, Google and Meta print in their own help pages, checked on 1 October 2026. Bring a spreadsheet and roughly the patience of a refund queue.

Step by step

  1. Pick a closed month. Choose one that ended a few weeks ago, so late conversions and refunds have landed. Google asks you to leave the most recent conversion delay period out of any ROAS review. Shopify books a refund on the day it is processed, not on the order's date. Menu path: the date picker at the top of each report below.
  2. Write down each platform's claim and spend. In Google Ads, add Conv. value and Conv. value/cost from the Conversions list, next to Cost. In Meta Ads Manager, add Purchases conversion value, Amount spent and Purchase ROAS, which Meta calculates as purchase conversion value divided by amount spent. Menu path: Google Ads > Columns > Modify columns > Conversions; Meta Ads Manager > Campaigns > Columns > Customize columns > Apply.
  3. Pull the month's sales from Shopify. Open the Finance Summary and read its Total sales breakdown card. Net sales are gross sales minus discounts and sales reversals. Total sales add taxes, duties, shipping and fees on top, so they are the bigger and less useful number here. Menu path: Shopify admin > Analytics > Reports > Category filter > Finances > Finance Summary.
  4. Take the tax out of Meta's figure. Shopify's Facebook & Instagram app sends Meta an order's total price, including duties and taxes. Google's figure needs no such fix: its reference says the Google & YouTube app's purchase value excludes shipping charges and taxes. Divide Meta's figure by one plus your tax share, which is taxes divided by net sales on the same card. Menu path: Shopify admin > Sales channels > Facebook & Instagram > Settings > Data sharing settings.
  5. Set the claims against net sales. Add up every platform's claim, tax removed, and compare the total with net sales. If it comes close to net sales or passes them, platforms are counting the same orders. One store's Channels sheet shows the mechanism: its touched view sums to 110.4%, because a journey that touched two channels counts in both. Menu path: none, this step is arithmetic.
  6. Turn net sales into gross profit. Read the Gross profit breakdown card in the same Finance Summary. Only net sales with a cost recorded count toward gross profit, so first check how much sits under Net sales without cost recorded. Your margin is gross profit divided by net sales with cost recorded. Menu path: Finance Summary > Gross profit breakdown card.
  7. Subtract the costs gross profit skips. Shopify's gross profit takes off product cost only. Card fees sit in the Shopify Payments activity report; carrier bills, packaging, agency and creator fees sit in your books. Take them all off, then subtract the ad spend from step 2. Menu path: Shopify admin > Finance > Documents > Shopify Payments activity report.
  8. Subtract fixed costs and read the verdict. Wages, rent and software come last. If the line turns negative before fixed costs, the ads cost more than the sales they brought in. If it turns negative only after them, the ads pay for themselves but not for the business. Menu path: none, this is your own accounts.

A worked example

For illustration, take one invented month in round numbers.

LineWhere it comes fromFor illustration
Meta's claim and spendAds Manager columns€60,000 on €20,000 (3x)
Google Ads' claim and spendGoogle Ads columns€45,000 on €10,000 (4.5x)
Total sales, tax includedFinance Summary€100,000
TaxesFinance Summary€20,000
Net salesFinance Summary€80,000
Gross profit at a 40% marginGross profit breakdown card€32,000
Card fees and carrier billsPayments activity report and your books€4,000
Ad spend, both platformsStep 2€30,000
Fixed costsYour books€8,000
What the month madeArithmeticminus €10,000

Say the Meta account claims €60,000 on €20,000 of spend, a ROAS of 3x. Say the Google Ads account claims €45,000 on €10,000, a ROAS of 4.5x. In this worked example the two claim €105,000 together, more than the €100,000 Shopify recorded with tax included.

Now take out the tax. For illustration, with free shipping, taxes add €20,000 to €80,000 of net sales, a tax share of 25%. In this worked example Meta's €60,000 becomes €48,000 once you divide it by 1.25. Google's €45,000 already excludes tax, in this worked example. For illustration, the claims still total €93,000 against €80,000 of net sales. So at least €13,000 of sales is claimed twice in this worked example, before email, organic search or Direct get any credit.

Then the margin. One store's Break-even sheet puts the line at 2.5x for a 40% margin. For illustration, the same 40% turns €80,000 of net sales into €32,000 of gross profit. If the card fees and carrier bills take €4,000, the margin left is 35%, and the line moves to about 2.9x.

In this worked example the honest ratio is €80,000 of net sales over €30,000 of ads, about 2.7x. For illustration, every dashboard clears the Break-even sheet's 2.5x, and the month still loses money. For illustration, €28,000 left after costs, minus €30,000 of ads, is minus €2,000. If the fixed costs are €8,000, the month ends at minus €10,000.

Step 8 gives the harsher verdict here. The ads do not even pay for themselves on real sales, so a stricter ROAS target will not rescue this month. The fix starts with judging channels on Shopify's net sales instead of their own claims, and with the costs around the ads.

What should I check when the numbers look wrong?

  • Net sales without cost recorded is large. Profit only counts products that had a cost when they sold. Add one under Products, then the product, then Cost per item in the Price section, and edit each variant if the product has them.
  • Meta alone claims more than Shopify's net sales. Check it against total sales first, since Meta's value includes duties and taxes. If it still wins, Meta is counting orders that other channels also claim, which is what the bridge exists to expose.
  • GA4 revenue never drops after a refund. Google's list of the events the Google & YouTube app sends has no refund event. Take refunds from Shopify's sales reversals instead.
  • Last month changed after you closed it. Shopify shows each reversal as a negative value on the day it is processed. A late refund therefore lands in the month it happens, so rebuild once the month settles.
  • GA4's return on ad spend disagrees with both platforms. GA4 divides the revenue for the selected key events by the total cost for your ads. It only knows the cost of linked or imported campaigns, so if Meta's cost is missing, the total reads higher than it should.

What to do this week

  1. Fill in Cost per item for your best sellers. In Shopify, open each top product and click Cost per item in the Price section. Enter the cost for every variant. Pass: next month's Net sales without cost recorded shrinks to a sliver. Fail: it stays large, so gross profit only describes part of your range.
  2. Redo Meta's ROAS without tax. Take last month's Purchases conversion value from your Ads Manager columns and divide it by one plus your tax share. Divide the result by Amount spent. Pass: it still clears your break-even line. Fail: it drops below, so tax was propping the ratio up.
  3. Read GA4's return on ad spend for the same month. In GA4, open Advertising, then Planning, then All channels. Pass: GA4's ratio sits below the platforms' and still above your line. Fail: it falls below your line, so the platform ratios are flattering the month.

Check the homework. Your GA4 Attribution paths export already holds the evidence. Causality Engine reads that one file and shows what each channel caused next to what last-click gave it, in 1 to 2 minutes, for €99 once (excluding VAT), refundable within 30 days. Check the homework

Sources, 1 October 2026: Finance reports (Shopify Help Center); Sales reports (Shopify Help Center); Profit reports (Shopify Help Center); Facebook data sharing (Shopify Help Center); Shopify event parameters (Google for Developers); About Target ROAS bidding (Google Ads Help); Customize columns in Meta Ads Manager (Meta Business Help Center); Purchase ROAS (return on ad spend) (Meta Business Help Center); All channels performance report (Google Analytics Help).

Frequently asked questions

  • Where do I find net sales in Shopify?
    In Analytics, open Reports, filter the Category to Finances and open the Finance Summary. Its Total sales breakdown card shows net sales: gross sales minus discounts and sales reversals. Total sales add taxes, duties, shipping and fees on top, so leave them out of any ROAS sum.
  • Is GA4's return on ad spend closer to profit than Meta's?
    A little closer, still not profit. Through Shopify's Google & YouTube app, GA4's purchase value leaves out shipping and tax and takes discounts off, while Meta's value includes tax. But GA4 still ignores product cost and, with no refund event from that app, keeps refunded orders in revenue.
  • When should I build the profit bridge for a month?
    Once the month has settled, not the morning after it ends. Shopify books refunds on the day they are processed, and Google Ads advises leaving the most recent conversion delay period out of any ROAS review. Waiting a few weeks gives you numbers that stop moving.

Go deeper: Causal attribution, explained.

Sixty-second versions of these ideas: Causality Engine on YouTube Shorts.

Keep reading

Terms in this article

Browse the full glossary

Your platforms guess.
We run the math.

Upload a GA4 export and see what each channel caused, next to last-click, in 1–2 minutes. The read is yours to keep.

Free, in your browser: your file is not uploaded. The full read is €99, refundable within 30 days. Prices exclude VAT.
Or book a 30-min call.