Skip to content

Marketing & attribution

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.

DATUMPANELPublished Updated 6 min read

Cover for the ROAS vs POAS article

"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 marginBreak-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

MetricFormulaUse
ROASad-attributed revenue / spendcampaign optimisation
Ad ROI(ad-attributed profit − spend) / spenddo ads make money
MER (blended ROAS)total revenue / total ad spendoverall efficiency, no attribution
POASgross profit from orders / spendjudging 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):

CampaignSpendRevenueROASGross profitPOAS
Search: brand5004,5009.01,3502.7
Shopping: electronics2,00010,0005.01,5000.75
Meta: accessories1,0003,0003.01,5001.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

  1. Product-level margin: price, COGS, category. The simplest version is a COGS sheet the pipeline loads nightly.
  2. Orders with line items from the store backend, with statuses (paid/refunded).
  3. Order-to-campaign attribution via UTMs/gclid stored on the order, or via BigQuery (attribution guide).
  4. Spend per campaign per day from the ad platforms.
  5. 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)
Spend50,00050,000
Revenue (platform-attributed)250,000175,000
ROAS5.03.5
Gross margin on those products25%55%
Gross profit62,50096,250
Fulfilment + fees (orders × 100)300 orders → 30,000120 orders → 12,000
Profit before ads32,50084,250
POAS (profit before ads / spend)0.651.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:

  1. 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.
  2. Exclude or separate low-margin products into their own campaigns with a lower budget or a higher target.
  3. 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.

Tags: ROASPOASpaid adsmargin

Author

DATUMPANEL — Business data analytics

DATUMPANEL is an independent data analyst based in Ukraine. I build dashboards for business owners, set up GA4 and the BigQuery export, and run data pipelines and Telegram auto-reports for e-commerce, service businesses, SaaS and agencies, from data audit to decisions.

Message on Telegram[email protected]Open the demo

Keep reading

  • Marketing & attribution10 min read

    Marketing attribution models: how to measure channels honestly

    How attribution models work (last click, first click, linear, data-driven), why Google Ads, Meta and GA4 all report different conversions, and how to build one channel report you can actually trust.

    Pillar guide

  • Marketing & attribution7 min read

    Google Ads, Meta and TikTok in one dashboard: cross-channel ad reporting

    How to combine spend and results from Google Ads, Meta Ads and TikTok Ads into one report, covering a shared schema, currencies, time zones and retroactive conversion updates, then add backend orders so you see real ROAS.

  • Marketing & attribution7 min read

    AppsFlyer attribution: OneLink, SKAN and a revenue dashboard

    How install attribution works in AppsFlyer, what OneLink does for web-to-app journeys, what changed on iOS after ATT, and how to join MMP data with subscriptions and events to get CAC and LTV by channel.

Want this kind of analytics for your business?

Tell me what data you have and which questions it can’t answer yet. I reply the same day with a plan, a timeline and the quick wins.

Or reach me directly:

Open the demo →

Send a request

I reply within one business day.

What are you interested in
Industry
A few more details · optional
Approximate budget · optional
When to start · optional
Data sources you have · optional

By submitting, you agree to the Privacy policy — your contact details are used only to reply to this request.