ROAS vs POAS: break-even ROAS and judging ads by profit
The ROAS formula, how to calculate break-even ROAS for your store, how ROAS differs from ROI, MER and POAS, and how to move your dashboard from ad revenue to ad profit.

"Is a ROAS of 4 good?" You can't answer that without knowing the margin. For a store with 60% margins, ROAS 4 is excellent. For a consumer electronics store at 15% margin, it loses money. Here are the formulas, and how to get the right metric onto a dashboard.
ROAS: the formula
ROAS = revenue attributed to ads / ad spend
Spend $1,000, get $4,000 in revenue, and ROAS = 4 (or 400%).
ROAS is handy for comparing campaigns within one channel. It says nothing about profit.
Break-even ROAS
This is the minimum ROAS at which ads don't lose money on the first order:
Break-even ROAS = 1 / order margin
where order margin = (price − COGS − shipping − fees) / price.
| Order margin | Break-even ROAS |
|---|---|
| 60% | 1.67 |
| 40% | 2.5 |
| 30% | 3.33 |
| 20% | 5.0 |
| 15% | 6.67 |
So a store with 30% margins needs ROAS above 3.33 to avoid losing money on the first order. With strong repeat purchasing, you can deliberately run below that line, but then judge payback through LTV and CAC.
ROI, MER, POAS: what's the difference
| Metric | Formula | Use |
|---|---|---|
| ROAS | ad-attributed revenue / spend | campaign optimisation |
| Ad ROI | (ad-attributed profit − spend) / spend | do ads make money |
| MER (blended ROAS) | total revenue / total ad spend | overall efficiency, no attribution |
| POAS | gross profit from orders / spend | judging ads on profit |
POAS
POAS (profit on ad spend) is the same idea as ROAS, with gross profit instead of revenue in the numerator. POAS = 1 means you break even on the first order. Above 1, you make money.
An example (illustrative numbers):
| Campaign | Spend | Revenue | ROAS | Gross profit | POAS |
|---|---|---|---|---|---|
| Search: brand | 500 | 4,500 | 9.0 | 1,350 | 2.7 |
| Shopping: electronics | 2,000 | 10,000 | 5.0 | 1,500 | 0.75 |
| Meta: accessories | 1,000 | 3,000 | 3.0 | 1,500 | 1.5 |
By ROAS, accessories look worst. By POAS, electronics Shopping is the problem: lots of revenue, but thin margins make it unprofitable.
MER
MER is the sober view. It doesn't depend on attribution and doesn't trust the platforms. If the platforms claim ROAS 6 while MER falls, part of what the platforms count as conversions isn't incremental.
Calculating POAS in practice
- Product-level margin: price, COGS, category. The simplest version is a COGS sheet the pipeline loads nightly.
- Orders with line items from the store backend, with statuses (paid/refunded).
- Order-to-campaign attribution via UTMs/
gclidstored on the order, or via BigQuery (attribution guide). - Spend per campaign per day from the ad platforms.
- Join them and divide profit by spend.
SELECT c.campaign,
SUM(s.spend) AS spend,
SUM(o.revenue) AS revenue,
SUM(o.revenue - o.cogs - o.shipping - o.fees) AS gross_profit,
SAFE_DIVIDE(SUM(o.revenue), SUM(s.spend)) AS roas,
SAFE_DIVIDE(SUM(o.revenue - o.cogs - o.shipping - o.fees), SUM(s.spend)) AS poas
FROM ad_spend_daily s
LEFT JOIN orders_attributed o USING (campaign, day)
JOIN campaigns c USING (campaign)
WHERE s.day BETWEEN '2026-09-01' AND '2026-09-30'
GROUP BY 1
ORDER BY poas;
Some ad platforms let you send margin as the conversion value so bidding optimises for profit. Be careful with this: margin is sensitive, so send a scaled or proxy value.
What to show on the dashboard
- MER by day and by week, your main sobriety check;
- ROAS and POAS side by side, by channel and by campaign;
- a break-even line on the ROAS chart;
- the top losing campaigns (POAS < 1);
- the brand vs non-brand spend share.
For the combined Google Ads and Meta report, see the cross-channel ad reporting dashboard. For profit after every variable cost, see contribution margin.
Common mistakes
- Comparing ROAS between stores with different margins.
- Calculating ROAS on revenue with tax included and refunds left in.
- Treating branded search as your best campaign, when many of those buyers would have bought anyway.
- Trusting platform ROAS without checking MER.
- Killing top-of-funnel campaigns because of low last-click ROAS alone.
Checklist
- Order margin is known by category
- The team knows your break-even ROAS
- Revenue comes from the backend, net of refunds and tax
- POAS is calculated at least weekly
- MER is on the first screen
- Brand and non-brand are split
Worked example: two campaigns, opposite conclusions
Two illustrative campaigns over the same month:
| Campaign A (bestsellers) | Campaign B (premium line) | |
|---|---|---|
| Spend | 50,000 | 50,000 |
| Revenue (platform-attributed) | 250,000 | 175,000 |
| ROAS | 5.0 | 3.5 |
| Gross margin on those products | 25% | 55% |
| Gross profit | 62,500 | 96,250 |
| Fulfilment + fees (orders × 100) | 300 orders → 30,000 | 120 orders → 12,000 |
| Profit before ads | 32,500 | 84,250 |
| POAS (profit before ads / spend) | 0.65 | 1.69 |
By ROAS, A is the winner and B should be cut. By POAS, A loses 17,500 a month (spend exceeds the profit it brings) and B makes 34,250. This pattern is common in stores where the bestsellers are low-margin traffic magnets. ROAS rewards revenue, but you can't pay salaries with revenue.
A POAS above 1.0 means the campaign covers its own ad cost from the profit it generates. Whether 1.0 is enough depends on what else you count: repeat purchases from new customers can justify a POAS below 1 on acquisition campaigns, if you have the LTV data to back it up.
SQL: POAS by campaign from your own data
When orders carry the campaign (via UTM or click IDs), you can compute POAS in the warehouse instead of trusting platform revenue:
WITH orders_by_campaign AS (
SELECT o.utm_campaign AS campaign,
SUM(o.revenue_net) AS revenue,
SUM(o.revenue_net - o.cogs - o.fulfilment - o.payment_fee) AS profit_before_ads,
COUNT(*) AS orders
FROM clean.orders o
WHERE o.status = 'paid' AND o.order_date BETWEEN @from AND @to
GROUP BY 1
),
spend AS (
SELECT campaign_name AS campaign, SUM(spend) AS spend
FROM clean.ad_spend WHERE day BETWEEN @from AND @to
GROUP BY 1
)
SELECT s.campaign, s.spend, o.revenue, o.orders,
SAFE_DIVIDE(o.revenue, s.spend) AS roas,
SAFE_DIVIDE(o.profit_before_ads, s.spend) AS poas,
o.profit_before_ads - s.spend AS profit_after_ads
FROM spend s LEFT JOIN orders_by_campaign o USING (campaign)
ORDER BY profit_after_ads;
Sorting by profit_after_ads ascending puts the campaigns losing the most money at the top, which is where the weekly review should start. This only works if campaign names in UTMs match the platform names exactly, one more reason for a strict UTM convention.
Feeding profit back to the platforms
Ad platforms optimise toward whatever value you send them. If the conversion value is revenue, the algorithm hunts for revenue, including low-margin revenue. Options, from simplest to most involved:
- Send gross profit as the conversion value instead of revenue (computed on the site or server at purchase time from product costs). The bidding strategy then targets profit.
- Exclude or separate low-margin products into their own campaigns with a lower budget or a higher target.
- Upload offline conversion adjustments later (refunds, cancellations) where the platform supports it, so the algorithm learns from what was actually kept.
Be careful with option 1: product costs then reach the ad platform. For many businesses that's acceptable. If it isn't, send a margin band (for example a value multiplier) rather than exact profit.
Weekly review routine
- Campaigns sorted by profit after ads, worst first
- Any campaign with POAS < 1 for 2+ weeks: cut, restructure or justify with LTV
- Platform revenue vs backend revenue per channel (gap explained?)
- Product mix of ad-driven orders: share of low-margin SKUs
- Changes made last week and their effect
FAQ
What's a good ROAS?
One above your break-even ROAS, once repeat purchases are factored in. There's no universal good number. It depends on margin.
How is ROAS different from ROI?
ROAS is revenue per dollar of spend. ROI is profit net of spend. A ROAS of 3 can mean a profit or a loss.
Can I optimise ads for POAS?
Yes. Send profit as the conversion value, or run ROAS bidding with different targets for different margin tiers. The simplest version is splitting campaigns by product margin.
What is MER and why track it?
Marketing efficiency ratio: total revenue divided by total ad spend. It's independent of attribution and shows whether real sales grow along with the ROAS the platforms report.


