DEV Community

Andreas Hatlem
Andreas Hatlem

Posted on

POAS vs ROAS: Why Your "Profitable" E-Commerce Campaigns Might Be Losing Money

Most e-commerce brands optimize for the wrong metric. Here's the math that proves it.


You're running Google Ads for your e-commerce store. Your ROAS is 4x. Your boss is happy. Your agency sends a report with green arrows pointing up.

And you're quietly losing money on half your campaigns.

This isn't a hypothetical. It's the reality for the majority of e-commerce brands that rely on Return on Ad Spend as their north star metric. ROAS tells you how much revenue you generated per dollar spent on ads. What it doesn't tell you is whether any of that revenue was actually profitable.

I've spent years working in e-commerce performance marketing, and the single biggest unlock I've seen for brands isn't a new ad creative or a better audience — it's switching from ROAS to POAS (Profit on Ad Spend). This article breaks down why, with real numbers.

The Problem With ROAS

ROAS is simple. You spend $1,000 on ads, you generate $4,000 in revenue. That's a 4x ROAS. Sounds great.

But here's what ROAS ignores:

  • Cost of goods sold (COGS) — what you paid for the product
  • Shipping costs — both inbound and outbound
  • Transaction fees — payment processing, platform fees
  • Returns and refunds — revenue that gets clawed back
  • Discounts and promotions — the coupon code that got them to buy

When you strip all of that out, your 4x ROAS campaign might be generating $0.12 of actual profit per dollar of ad spend. Or it might be negative.

The insidious part: you'll never know unless you do the math.

A Concrete Example: When 4x ROAS Loses Money

Let's walk through two campaigns side by side. Both spend $5,000. Both generate $20,000 in revenue. Both have a 4x ROAS.

Campaign A: High-Revenue, Low-Margin Products

Metric Value
Ad Spend $5,000
Revenue $20,000
ROAS 4.0x
Average Order Value $100
Orders 200
COGS per order $65
Shipping per order $8
Transaction fees per order $3
Total cost per order $76
Gross margin per order $24
Total gross margin $4,800
Profit after ad spend -$200
POAS 0.96x

Campaign B: Lower Revenue, High-Margin Products

Metric Value
Ad Spend $5,000
Revenue $12,000
ROAS 2.4x
Average Order Value $80
Orders 150
COGS per order $15
Shipping per order $5
Transaction fees per order $2.50
Total cost per order $22.50
Gross margin per order $57.50
Total gross margin $8,625
Profit after ad spend $3,625
POAS 1.73x

Read that again. Campaign A has a 4x ROAS and loses $200. Campaign B has a 2.4x ROAS and makes $3,625 in profit.

If you're optimizing for ROAS, you'd scale Campaign A and cut Campaign B. You'd be scaling your losses and cutting your profits.

This is not an edge case. This is the default outcome for any brand selling products with varying margins — which is almost every e-commerce brand.

Why This Matters More Than You Think: The Algorithm Problem

Here's where it gets worse.

When you set a target ROAS in Google Ads or Meta, the algorithm optimizes for that signal. Google's Smart Bidding and Meta's Advantage+ campaigns are sophisticated machine learning systems. They will find the users most likely to generate the conversion value you're telling them to optimize for.

If you're sending revenue as your conversion value, the algorithm learns to find people who buy high-priced items. Not high-margin items. Not repeat customers. Not customers who don't return products. Just people who generate the biggest dollar amount in cart.

The algorithm is doing exactly what you told it to do. The problem is what you told it to do.

When you switch to sending profit data as your conversion value, the algorithm's behavior changes fundamentally:

Signal Sent Algorithm Optimizes For
Revenue (ROAS) Highest cart value, regardless of margin
Profit (POAS) Highest profit per order, factoring in real costs

This means the algorithm starts finding customers who buy your high-margin products. Customers who don't use heavy discount codes. Customers who buy products that don't get returned. The entire targeting shifts toward what actually makes you money.

What Is POAS and How Does It Work?

POAS — Profit on Ad Spend — replaces revenue with gross profit as the conversion value sent to ad platforms.

The formula is straightforward:

POAS = Gross Profit / Ad Spend

Instead of telling Google "this conversion is worth $100" (the sale price), you tell it "this conversion is worth $62" (the actual profit). The algorithm then optimizes its bidding to maximize total profit, not total revenue.

A POAS above 1.0x means you're making money after ad spend. Below 1.0x, you're losing money. There's no ambiguity, no hidden costs masking the real picture.

POAS Value What It Means
0.5x Losing $0.50 for every $1 spent on ads
1.0x Breaking even on ad spend
1.5x Making $0.50 profit for every $1 spent
2.0x Making $1.00 profit for every $1 spent
3.0x+ Highly profitable — scale aggressively

How to Implement Profit-Based Bidding

Switching from ROAS to POAS involves three steps:

Step 1: Calculate Gross Profit Per Order

You need to know the true cost behind every order. At minimum, this means tracking:

  • COGS: What you paid for each product (including variants/sizes)
  • Shipping costs: Actual per-order shipping, not averages
  • Transaction fees: Payment processor fees (typically 2.9% + $0.30)
  • Discounts applied: The actual amount discounted, not the coupon face value

For most stores, COGS is the hardest part. If you have hundreds of SKUs with different suppliers and seasonal pricing, maintaining accurate COGS data takes real effort.

Step 2: Send Profit as Conversion Value

Instead of sending order revenue to Google Ads and Meta via their conversion APIs, you send the gross profit amount.

For Google Ads, this means modifying your conversion tracking to send the profit figure instead of (or alongside) the revenue figure. For Meta, you update the value parameter in your Conversions API events.

If you're doing this manually, you'll need:

  • Server-side tracking that has access to your COGS data
  • Logic to calculate profit per order in real-time
  • Integration with Google Ads API and Meta Conversions API
  • Ongoing maintenance as COGS change

This is where most brands get stuck. The engineering effort to build and maintain this pipeline is significant.

Step 3: Set POAS Targets Instead of ROAS Targets

Once profit data is flowing, you switch your bid strategy targets. Instead of "Target ROAS: 400%", you set "Target ROAS: 150%" (where the "ROAS" is now actually POAS, since you've changed the conversion value).

A 1.5x POAS target means you want $1.50 of profit for every $1.00 of ad spend. That's real, bankable profit — not revenue that might or might not cover your costs.

Start conservative. Set your POAS target slightly below your current average POAS to give the algorithm room to learn the new signal. Then gradually increase it as performance stabilizes.

Common Objections (and Why They're Wrong)

"Our margins are pretty consistent, so ROAS is fine."

Are they? Check your actual margin distribution across SKUs. Most brands are surprised to find a 30-50 percentage point spread between their highest and lowest margin products. Even a 10-point spread matters at scale.

Also consider: are your margins consistent across discount codes, bundles, and promotions? What about shipping cost variation by destination? Returns?

"This is too complicated to implement."

It used to be. Building a custom profit tracking pipeline is a serious engineering project. But the tooling has matured. Platforms like GetPOAS now automate the entire flow — they connect to your e-commerce platform, pull COGS data, calculate profit per order, and send the profit signal to Google Ads and Meta via their conversion APIs. Setup takes hours, not months.

"Won't sending lower conversion values mess up the algorithm?"

No. The algorithm doesn't care about absolute values — it cares about relative values. If you send $62 profit for one order and $19 profit for another, the algorithm learns that the first type of order is 3x more valuable. That's exactly the signal you want it to have.

"Our ROAS targets are working fine."

Define "fine." If you don't know your actual profit per campaign, you don't know if it's working. You know your revenue per campaign. That's a different thing.

The Bottom Line

ROAS was the best metric available when we didn't have the tooling to track profit at the order level. That era is over.

Every dollar you spend on ads based on ROAS is a dollar optimized for revenue, not profit. For some campaigns, those align. For many, they don't. And without profit visibility, you're flying blind.

The switch to POAS doesn't require a bigger budget or better creatives. It requires better data. Give the algorithm the right signal — actual profit — and it will find the right customers.

Stop optimizing for revenue. Start optimizing for what you actually keep.


Want to automate profit tracking for your e-commerce ads? GetPOAS connects to your store, calculates real profit per order, and sends profit signals to Google Ads and Meta automatically. Works with Shopify, WooCommerce, Magento, BigCommerce, and PrestaShop. Plans start at EUR 29/month.

Top comments (0)