High ROAS But No Profit: Where the Money Leaks
Why a strong ROAS can still mean losing money on Shopify, and how to trace the leak using POAS instead of ROAS.
Written by Mantas Jurgutis — Founder, Adsify — builds the Google & Meta automation merchants use daily
Editorially reviewed by Adsify Editorial on February 19, 2026 — Reviewed against Shopify, Google Ads and Meta official documentation.
ROAS measures revenue, not money in your pocket
Return on ad spend is a revenue-to-spend ratio. It says nothing about product cost, payment processing fees, shipping cost, discounts, or returns. A campaign reporting a 4x ROAS can still lose money if the product's landed cost plus fulfillment eats more than 75% of revenue. This is the single most common reason a merchant feels like ads are 'working' according to the dashboard while the bank balance disagrees. The fix is switching your primary metric from ROAS to profit on ad spend, POAS, which nets out cost of goods before dividing by ad spend.
Worked example: 4x ROAS that loses money
Assume ad spend of $500 generates $2,000 in revenue — a 4x ROAS, which looks excellent on the surface. Now assume: cost of goods sold is 55% of revenue ($1,100), payment processing is 2.9%+$0.30 per order across 40 orders (~$70), and shipping cost not covered by the customer is $8/order (~$320). Gross profit before ad spend is $2,000 − $1,100 − $70 − $320 = $510. After subtracting the $500 ad spend, net profit is just $10. A 4x ROAS produced essentially breakeven economics — the ratio hid it completely.
Step 1: Confirm your true cost of goods is entered correctly
In Shopify admin, go to each product variant and check the 'Cost per item' field under Pricing. If this field is blank or outdated (common after a supplier price increase), any profit-based reporting built on top of it — including Shopify's own Profit report and third-party POAS tools — will be wrong. Pull a spot sample of 10 recent orders and manually verify the cost of goods against your latest supplier invoice; a mismatch here invalidates every profit calculation downstream.
Step 2: Add payment and platform fees into the real cost stack
Shopify Payments fees, third-party payment gateway fees, and app subscription costs that scale with order volume all reduce true margin but rarely appear in ROAS. Pull your payment processor's monthly statement and calculate the effective average fee percentage across your order volume — it's usually higher than the headline rate once currency conversion and chargebacks are included. Add this as a fixed percentage in your profit model.
Step 3: Isolate shipping cost per order, not per sale
If you offer free shipping, that cost is real and must be netted out per order, not treated as a marketing expense absorbed elsewhere. Pull your shipping carrier invoice for the same period as the ad report and divide total shipping spend by order count in that window to get a true per-order shipping cost. Compare this to what, if anything, the customer paid toward shipping at checkout — the difference is the real cost to net against revenue.
Step 4: Factor in returns and refunds
A campaign can show a strong ROAS at the point of purchase and still be unprofitable once returns are processed weeks later, especially for apparel or sized goods. Pull Shopify Analytics > Reports > Returns for the same 30-60 day window as the ad spend being evaluated, since returns lag purchases. If a category returns above roughly 15-20%, its true profit is materially lower than same-day ROAS suggests, and it needs its own POAS calculation separate from lower-return categories.
Step 5: Check for discount code leakage
In Shopify Analytics > Reports > Discount usage, check whether ad traffic is disproportionately using a sitewide discount code (from an influencer partnership, an old email flow, or a browser extension). A 20% discount silently applied on top of a healthy ROAS calculation directly erodes the margin the ROAS number assumes exists, and it's invisible unless you cross-reference discount usage against traffic source.
Rebuild the campaign report around POAS instead of ROAS
Once cost of goods, fees, shipping, returns and discounts are captured, calculate POAS as (Revenue − COGS − fees − shipping − returns) ÷ Ad Spend. A campaign needs a POAS above 1.0 to be profitable at all, and realistically needs healthy margin above 1.0 to fund reinvestment and cover fixed costs like staff and rent. Rank campaigns by POAS, not ROAS, when deciding where to shift budget — a lower-ROAS campaign selling a higher-margin product can be more profitable than a high-ROAS campaign selling a thin-margin one.
Where this breaks down at the product level, not just campaign level
The same math applies within a single Performance Max campaign that sells multiple products with different margins. A PMax campaign reporting an overall 3.5x ROAS might be driven almost entirely by a low-margin bestseller while a higher-margin product barely gets impressions. Pull the product-level performance breakdown in the Merchant Center or PMax asset group reporting and recalculate POAS per product, not just per campaign, before deciding the whole campaign is healthy.
Where Adsify fits into this workflow
Adsify tracks profit and POAS directly using each product's cost data pulled from Shopify, and shifts budget between campaigns on a 6-hour cycle based on that profit signal rather than raw ROAS, which is what catches a scenario like the 4x-ROAS-breakeven example above before it compounds across a month of spend.
Set a POAS floor before scaling anything
Before increasing budget on any campaign, set a minimum acceptable POAS, for example 1.3, meant to leave margin for fixed costs. Only scale spend on campaigns clearing that floor over a stable 7-14 day window; scaling a campaign that's barely profitable on paper just scales the leak faster and produces a larger loss at a larger dollar volume.
Recheck cost data quarterly at minimum
Supplier costs, shipping carrier rates, and payment processing terms all drift over a year. A POAS model built on Q1 cost data can silently go stale by Q3 if a supplier raised prices 8% and nobody updated the 'Cost per item' field in Shopify. Put a recurring calendar reminder to re-verify cost of goods against current invoices at least once a quarter, tied to whenever your supplier sends updated pricing.
Common mistake: chasing ROAS targets set for the wrong product mix
A blanket '3x ROAS or pause' rule applied across an entire account punishes high-margin, lower-volume products that never reach 3x on revenue alone but are highly profitable on POAS. Set ROAS or POAS targets per product category based on that category's actual margin, not a single account-wide number, or you'll end up pausing your most profitable line while scaling your least profitable one.
