ROAS Is the Wrong Metric: How to Track Profit Margin and POAS in Google Ads
A 500% ROAS can still lose money. What ROAS leaves out, how to calculate your real breakeven, and three ways to make Google Ads bid for profit instead of revenue.

“My ROAS is 500% but I’m not actually making money. What am I missing?” It is one of the most common questions in eCommerce communities.
The answer is nearly always the same. ROAS compares revenue with ad spend and says nothing about margin. A product with 70% cost of goods, 15% in fees and shipping and a 10% return rate leaves nothing (or less than nothing) at 500% ROAS. Google’s algorithm, meanwhile, optimises for maximum revenue, and maximum revenue is not the same thing as maximum profit.
This post explains what ROAS really measures, what POAS is and why it matters, and how to change your tracking so Google bids for profit rather than revenue.
The Problem With Optimising for Revenue
ROAS = Revenue / Ad Spend
When you set a Target ROAS, you are asking the algorithm to generate as much revenue as possible for every pound of ad spend. It is very good at that. It finds the auctions, searches and people most likely to buy.
But revenue is not profit, and the algorithm does not know your margins. It has no idea that one product costs £2 to make and sells for £50 while another costs £40 and sells for £55. To the bidding model they are simply a £50 sale and a £55 sale. It will happily push high revenue, low margin products and neglect cheaper, high margin ones.
At scale, the result is a campaign with impressive ROAS and mediocre or even negative real profit.
What ROAS Leaves Out
These costs sit between revenue and profit, and ROAS ignores all of them:
Cost of goods sold (COGS). What it costs to make or buy the product. With 60% COGS, £60 of every £100 in revenue goes on the product before anything else.
Shipping. Outbound delivery you partly or fully absorb, plus return postage if returns are free.
Returns. If 15% of orders come back with a full refund, your real revenue per order is lower than the conversion value Google reports. A £200 order that is later returned still counts as a £200 conversion, because the algorithm never hears about the refund.
Payment fees. Shopify Payments, Stripe and other processors usually take 2 to 3% of each transaction. Small at 500% ROAS, but real.
Platform costs. Your Shopify plan, app subscriptions and any revenue-based fees.
Ad spend itself. ROAS already includes ad spend as the denominator, but none of the costs above.
Add them up and the picture changes. A product with 60% COGS, 10% shipping and returns and 3% fees leaves 27% of revenue as gross margin before overheads. At 500% ROAS (ads take 20% of revenue) you have 7% left for overheads and profit. At 400% ROAS (ads take 25%) you have 2%. Below a certain ROAS the business loses money, however good the percentage looks.
What POAS Is
POAS (profit on ad spend) puts profit in place of revenue:
POAS = Gross Profit / Ad Spend
where Gross Profit = Revenue minus COGS minus other variable costs.
A 200% POAS means every £1 of ad spend produced £2 of profit. That number means something directly: it tells you whether advertising is profitable, not just whether it brings in revenue.
The hard part is that POAS needs your margins. ROAS is easy because Google records revenue automatically. POAS means feeding your cost data into the system.
Option 1: Send Margin Instead of Revenue as the Conversion Value
The most direct way to make Google bid for profit is to replace revenue-based conversion values with margin-based ones.
Instead of sending conversion_value = 100 (the order revenue), you send conversion_value = 27 (the estimated gross profit on that order).
Google then optimises for the highest profit value. Your Target ROAS effectively becomes a target POAS, because the “revenue” it works with is now profit.
Setting it up in GTM:
In the purchase data layer push on your order confirmation page, add a calculated profit value next to revenue:
window.dataLayer.push({
event: 'purchase',
ecommerce: {
transaction_id: 'ORDER-123',
value: 100.00, // full revenue, keep this for GA4
currency: 'GBP',
profit_value: 27.00, // your calculated margin
items: [...]
}
});
Create a Data Layer Variable in GTM that reads ecommerce.profit_value. In your Google Ads Conversion tag, set the Conversion Value field to {{DL - Profit Value}} instead of the usual revenue value.
Google Ads now receives profit as the conversion value, and your target changes meaning: a 300% target now means 300% return on ad spend measured in profit, which is far more useful than 300% measured in revenue.
The challenge: profit has to be calculated at checkout. If your margins are simple and consistent (roughly the same across products), a flat multiplier works: profit_value = revenue × 0.27 for a 27% margin. If margins vary across a large catalogue, you need product-level margin data in the checkout calculation.
Calculating margin per product:
With variable margins, the cleanest approach is to keep cost and margin data in a Google Sheet keyed by product ID, then use a server-side lookup or your CRM to calculate each order’s margin at checkout and pass it into the data layer.
That is more technical. For some stores, a blended margin estimate (an average across all products) is a reasonable starting point. It is not perfect, but it is far more accurate than full revenue.
Option 2: Conversion Value Rules
Google Ads Conversion Value Rules let you adjust conversion values by campaign, audience or device without touching your tracking.
Find them under Tools, Measurement, Conversion Value Rules.
You can create rules such as:
- Multiply all conversion values by 0.3 (a flat 30% margin factor)
- Use different multipliers for different product categories if you have category-level margins
It is simpler than changing what your tag sends. The trade-off is that rules are applied at campaign level, so you get less detail than product-level margin tracking.
If you want to move towards POAS bidding quickly without a complex build, value rules are the fastest route. Start with a blended margin factor and refine towards product-level accuracy over time.
Option 3: Custom Labels for Margin-Based Bidding
A less direct but very common approach uses custom labels in your Merchant Center feed to group products by margin tier, then sets different ROAS targets for each group in Shopping or PMax.
In the feed, add a custom_label_0 attribute with values such as high_margin, mid_margin and low_margin based on each product’s gross margin.
In Google Ads, split product groups by those labels. Give low margin products higher ROAS targets (they need more revenue per pound of spend to stay profitable) and high margin products lower targets (you can accept lower revenue efficiency because more of it is profit).
This is not true POAS bidding, but it steers the algorithm towards your most profitable products: low margin products become expensive to serve (the higher target limits delivery) and high margin products get more aggressive bids (the lower target allows more spend).
Accounting for Returns
Returns are the cost most often missed in ROAS analysis. If 15% of orders are returned and fully refunded, your real revenue per conversion is 85% of what Google reports.
Google Ads lets you submit return data after the event through conversion adjustments. Under Tools, Conversions, upload a file of transaction IDs with the refund amount for each returned order. Google reduces those conversion values and recalculates the campaign’s historical ROAS.
That is the right way to handle returns, rather than ignoring them and living with inflated ROAS. The more closely historical conversion values match revenue you actually kept, the better Smart Bidding can optimise from here.
In high return categories such as clothing and footwear, return adjustments can move reported ROAS by 15 to 25%. That is the difference between a campaign that looks profitable and one that actually is.
Your Real Breakeven ROAS
Every store has a breakeven ROAS: the point where the margin from ad-driven revenue exactly covers ad spend. Below it, advertising destroys value.
Breakeven ROAS = 1 / Blended Gross Margin %
With an average gross margin of 35%: Breakeven ROAS = 1 / 0.35 = 2.86, or 286%.
So any ROAS under 286% loses this store money, and that is before returns, payment fees and fixed overheads.
A fuller calculation:
Breakeven ROAS = 1 / (Gross Margin minus Returns minus Payment Fees minus Other Variable Costs)
For a store with 35% gross margin, returns costing 10% of that margin (3.5 points) and 3% fees:
Breakeven = 1 / (0.35 − 0.035 − 0.03) = 1 / 0.285 = 351%
So whenever a 400% ROAS gets reported as a win, check it against breakeven. At 400% ROAS, ads cost 25% of revenue. With 28.5% left after variable costs, that leaves roughly 3.5% of ad-driven revenue as contribution before fixed overheads. Profitable, but a long way from “400% ROAS is amazing”.
Where to Start
You do not need to do all of this at once. In order of impact:
- Work out your breakeven ROAS and check your campaigns are above it. If they are not, that is the most urgent finding in your whole Google Ads setup.
- Apply a flat margin factor with Conversion Value Rules. It is the fastest route to margin-aware bidding.
- Add return adjustments if more than 10% of orders come back. The distortion from unrecorded returns builds up over time.
- Move to product-level margin values in the data layer if margins vary across a large catalogue. It is the most accurate option and needs the most technical work.
ROAS is not meaningless. It is a useful measure of revenue efficiency. But it stands in for profitability rather than measuring it, and the stores doing best with Google Ads in 2026 are the ones that have closed the gap between what they report and what they actually earn.
Want this applied to your account?
30 minutes. No pitch deck. A clear view of your account and the highest-leverage opportunities.