← Back to blog
Optimization· 10 min read

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 JurgutisFounder, Adsify — builds the Google & Meta automation merchants use daily

Editorially reviewed by Adsify Editorial on February 19, 2026Reviewed 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.

Frequently asked questions

Why can a campaign have a 4x ROAS and still lose money?

ROAS only measures revenue against ad spend. Once cost of goods, payment fees, shipping, returns, and discounts are subtracted, a 4x ROAS can leave near-zero or negative actual profit, as shown in the worked example.

What is POAS and how does it differ from ROAS?

POAS, profit on ad spend, is (Revenue − COGS − fees − shipping − returns) ÷ Ad Spend. Unlike ROAS it accounts for true margin, so it's a better metric for deciding where to allocate budget.

Where do I check if my Shopify cost of goods data is accurate?

Open each product variant's Pricing section and check the 'Cost per item' field, then spot-check 10 recent orders against current supplier invoices to confirm it hasn't gone stale.

How do returns affect profitability that ROAS doesn't show?

Returns often happen weeks after purchase, so same-day ROAS can look healthy while the eventual return rate, visible in Shopify Analytics > Returns, quietly erodes real profit for that period.

Sources

Try Adsify free for 7 days

Launch AI-powered Google & Meta ads for your Shopify store in one click. See pricing or the full feature list.

Install from Shopify App Store →

Keep reading on Optimization