POAS (Profit on Ad Spend): Formula, Calculator and Targets

What POAS (profit on ad spend) is, how it differs from ROAS, how to calculate it by hand or with ChatGPT, Claude and Claude Code, and how to get Google Ads and Meta to bid on profit instead of revenue.

savvy.so · Updated October 28, 2026

POAS stands for profit on ad spend: how much gross profit you make for every dollar you put into ads, after paying for the product, shipping, payment fees and the other costs that revenue hides. The POAS formula is POAS = gross profit from ads ÷ ad spend. A POAS of 1.0 means your ads paid for themselves and nothing else; above 1.0 you're making money, below 1.0 you're buying revenue at a loss. If you've ever hit a "great" ROAS and still watched your bank balance shrink, POAS explains why. Here's how to calculate it by hand, how to do it in minutes with AI, and how to get Google Ads and Meta to bid on it.

Key takeaways

  • POAS = (revenue − product cost − shipping − fees − other variable costs) ÷ ad spend. Break-even is always 1.0, whatever your margins.
  • ROAS can't tell a 70%-margin sale from a 15%-margin sale. Two campaigns with the same ROAS can have opposite POAS.
  • Break-even ROAS is 1 ÷ margin. At a 35% contribution margin you need a 2.86 ROAS just to not lose money.
  • You can calculate POAS in a spreadsheet today with Shopify's "cost per item" field and your ad spend exports, or let ChatGPT or Claude build the sheet.
  • To make platforms bid on profit, send margin instead of revenue as the conversion value. Google Ads supports it via value rules and custom conversion values; Meta is rolling out Profit optimization based on a `net_revenue` parameter.

What POAS means and how the POAS formula works

ROAS divides revenue by ad spend; POAS divides profit by ad spend. Only the numerator changes, but it flips a lot of decisions.

POAS = Gross profit attributed to ads ÷ Ad spend

Gross profit for an order is:

  • Order value after discounts, excluding sales tax or VAT you pass on
  • minus cost of goods sold, including inbound freight and packaging if you track them
  • minus shipping cost you pay the carrier, net of what the customer paid for shipping
  • minus payment processing fees (Shopify Payments, PayPal, Stripe)
  • minus other variable costs of that order: returns, marketplace commissions, fulfillment, free gifts

Not subtracted: the ad spend itself and fixed costs (rent, salaries, software). POAS is a contribution margin metric: it answers "did this ad dollar add money to the pile that covers fixed costs?", not "is my business profitable?".

A worked POAS example

A Google Shopping campaign spent $2,000 last week and drove $8,000 in revenue before tax. ROAS = 4.0. Looks fantastic. The costs behind that revenue:

  • Cost of goods: $4,400 (55%; this store sells electronics accessories)
  • Shipping paid to carriers, net of shipping charged: $600
  • Payment fees: $270
  • Returns and damaged items: $330

Gross profit = 8,000 − 4,400 − 600 − 270 − 330 = $2,400. POAS = 2,400 ÷ 2,000 = 1.2.

A 4.0 ROAS turned out to be a thin 1.2 POAS: 20 cents of real profit per ad dollar. You'll see POAS written as a ratio (1.2) or a percentage (120%); the ratio is handier because break-even sits at 1.0 and it maps directly onto target ROAS fields once you feed the platforms profit values.

POAS vs ROAS: why ROAS lies to you

ROAS treats every dollar of revenue as equal. That creates two problems for a business that lives on margin, and the bidding algorithms make both worse: Smart Bidding and Meta's value optimization chase whatever value you send them, so revenue in means revenue-hunting out.

Same ROAS, opposite profit

Two campaigns each spend $1,000 and return $3,000 in revenue (ROAS 3.0):

  • Campaign A sells a private-label skincare line at a 70% margin. Gross profit ≈ $2,100. POAS = 2.1.
  • Campaign B sells branded headphones at a 20% margin with free shipping on a bulky box. Gross profit ≈ $450. POAS = 0.45.

Through ROAS, both look identical and the algorithm happily funds B. Through POAS, B loses 55 cents per dollar and A is where you scale.

Break-even ROAS depends on margin

Because POAS = ROAS × margin, your break-even ROAS is 1 ÷ contribution margin:

| Contribution margin | Break-even ROAS |

|---|---|

| 20% | 5.0 |

| 30% | 3.33 |

| 40% | 2.5 |

| 50% | 2.0 |

| 60% | 1.67 |

A store with a blended 30% margin that celebrates a 3.0 ROAS is losing money on paid traffic. Generic "good ROAS" benchmarks ignore this, which makes them useless without your own margin figure.

POAS calculator: how to calculate POAS by hand, step by step

Your first POAS number needs three exports and a spreadsheet, nothing more. Doing it manually once is also the best way to understand what any tool does under the hood.

Step 1: Get product costs into Shopify

  • In Shopify admin → Products, fill in Cost per item for every variant (under Pricing). Shopify's profit reports and most profit tools read this field.
  • For a big catalog, Products → Export, fill the `Cost per item` column (VLOOKUP by SKU against your supplier price list) and re-import.
  • Include inbound freight and packaging: a $10 product with $2.50 freight and $0.60 of boxing is a $13.10 cost.

Step 2: Export the orders

  • Orders → Export, last 30 days, CSV. Keep order ID, date, subtotal after discounts, shipping charged, line item SKU, quantity, refunded amount.
  • Add net revenue = subtotal + shipping charged − refunds. Leave sales tax out; it isn't yours.

Step 3: Add the costs per order

  • COGS = quantity × cost per item, looked up by SKU
  • Shipping cost = what the carrier charged you; no per-order data yet? Use your average label cost by zone and refine later.
  • Payment fees = net revenue × processor rate + fixed fee per transaction (check your plan)
  • Other variable costs: returns processing, 3PL pick-and-pack, marketplace fees
  • Gross profit = net revenue − COGS − shipping − payment fees − other variable costs

Step 4: Attribute orders and pull ad spend

  • Assign each order to a campaign using Shopify's Marketing → Attribution reports, the UTM in the order's landing site field, or the conversion reports inside Google Ads and Meta. No method is perfect; pick one and stick to it.
  • Export spend by campaign for the same dates from Google Ads and Meta Ads Manager.

Step 5: Calculate POAS per campaign

POAS = SUM(gross profit of attributed orders) ÷ spend

| Campaign | Spend | Revenue | ROAS | Gross profit | POAS |

|---|---|---|---|---|---|

| Shopping – Best sellers | $3,200 | $11,500 | 3.6 | $4,100 | 1.28 |

| Search – Brand | $600 | $4,800 | 8.0 | $2,300 | 3.83 |

| Meta – Prospecting | $2,900 | $7,400 | 2.55 | $1,900 | 0.66 |

| Meta – Retargeting | $700 | $3,100 | 4.4 | $1,350 | 1.93 |

Meta prospecting is the campaign to fix first, even though its ROAS doesn't look alarming.

What's a good POAS?

  • Below 1.0: you lose money on every order the ads bring in. Only acceptable on purpose, for example buying first orders from customers who reliably reorder.
  • 1.0: break-even on variable costs; ads cover themselves but contribute nothing to overhead.
  • 1.3–1.5: a common target for stores in growth mode.
  • 2.0 and up: profit-first; typical for mature accounts, brand campaigns and retargeting.

The right number comes from your fixed costs: if overhead is $20,000 a month and ads drive most sales, you need enough ad-driven contribution margin to cover that and leave something over.

Calculate POAS faster with AI

Once you understand the manual steps, let an assistant do the spreadsheet work.

A ChatGPT or Claude prompt you can copy

Upload the three exports (orders, products with cost per item, campaign spend) and paste:

```

You are an ecommerce finance analyst. I've uploaded:

1. orders.csv – Shopify orders export (one row per line item)

2. products.csv – Shopify products export with "Variant SKU" and "Cost per item"

3. spend.csv – ad spend per campaign and day from Google Ads and Meta

Calculate POAS (profit on ad spend) per campaign for the date range in orders.csv.

Rules:

- Net revenue = subtotal after discounts + shipping charged − refunds. Exclude taxes.

- COGS = quantity × cost per item, matched by SKU. Flag SKUs with no cost.

- Shipping cost: $6.40 per order for US domestic, $18 for international.

- Payment fees: 2.9% of net revenue + $0.30 per order.

- Attribute each order to a campaign using utm_campaign in the landing site field. Orders without a UTM go to "Unattributed".

- Gross profit = net revenue − COGS − shipping cost − payment fees.

- POAS = gross profit ÷ spend. ROAS = net revenue ÷ spend.

Output a table with campaign, spend, revenue, ROAS, gross profit, POAS, sorted by POAS descending, plus the data problems you found, and tell me which campaigns are below break-even.

```

Swap in your own cost assumptions. The "flag SKUs with no cost" line matters: most first-run POAS numbers are wrong because part of the catalog has an empty cost field, which makes those products look like pure margin.

A repeatable flow with Claude Code

For a weekly version, have Claude Code build a script:

```

Build a Python script that reads orders.csv, products.csv and spend.csv from ./data,

applies the cost rules in RULES.md, and writes poas_by_campaign.csv and poas_by_product.csv.

Print top 5 and bottom 5 campaigns by POAS and any SKU missing a cost.

Use pandas, add a --since YYYY-MM-DD flag, and write tests for the margin calculation.

```

Keep cost rules in `RULES.md` so they're versioned. Swapping the CSVs for the Shopify Admin API and the ad platforms' reporting APIs is the natural next step, and Claude Code can do that too.

How to make Google Ads and Meta bid on POAS

Calculating POAS tells you what happened. The bigger win is getting the algorithms to chase profit at auction time by sending each order's gross profit as conversion value.

Google Ads: three ways to get profit into bidding

1. Conversions with cart data for profit reporting. Google Ads can receive the items in each order with the purchase conversion; if your Merchant Center feed includes the optional `cost_of_goods_sold` attribute, Google Ads reports gross profit by campaign and product. You need `cost_of_goods_sold` in the feed (Shopify's Google & YouTube app doesn't send it by default, so use a supplemental feed) and cart parameters (`items`, `merchant_id`, `feed_country`, `feed_language`, `discount`) on the purchase tag via a Shopify custom pixel, Google Tag Manager or a server-side container. Check the conversion's diagnostics tab for cart data warnings; mismatched item IDs are the usual culprit. Pro: native and free. Con: it's reporting, not bidding.

2. Conversion value rules. Under Tools → Conversions → Value rules you can multiply conversion values by conditions such as location, device or audience. The crude version of POAS bidding is one rule that multiplies revenue by your blended margin. Pro: five-minute setup. Con: one margin for everything, so it doesn't fix the problem across products.

3. Send gross profit as the conversion value. The real fix. Create a separate purchase conversion whose value is the order's gross profit, computed at checkout from cost per item, shipping and fees (on Shopify, a custom pixel, a server-side setup or a tool that does it for you). Then switch the campaign to Target ROAS (since June 2026 Google labels it as a standalone strategy again rather than "Maximize conversion value with a target ROAS") and set the target to your target POAS. A 1.5 target on profit values means "bid for $1.50 of gross profit per $1 of spend". Pro: every product's margin is reflected in every auction. Con: it's technical, and changing the value definition triggers a re-learning period, so keep the revenue conversion as a secondary action for comparison. Later, conversion adjustments let you correct an order's value once returns come in.

Meta Ads: value optimization and the new Profit option

  • Value optimization on a Sales campaign bids toward purchase value, which by default is revenue. If you must bid on revenue, set your ROAS goal to target POAS ÷ margin: a 1.4 POAS target at a 40% margin is a 3.5 ROAS goal.
  • Profit optimization. Meta announced in June 2025 that value optimization would expand to profit, and in 2026 a Profit option (next to pLTV) started appearing in Ads Manager beside the standard Value option for accounts with access. It relies on a `net_revenue` parameter sent with purchase events through the Conversions API, alongside the normal `value`. Availability is limited (it has been described as a closed beta), so check your Ads Manager and your CAPI partner; Stape and Aimerce, among others, document how to send `net_revenue`. If you don't see it, the ROAS-goal workaround still works.
  • Keep `value` as revenue and use the separate profit field for optimization; mixing them makes Meta's ROAS column meaningless.

The AI shortcut for the setup work

The slow part is the plumbing: calculating gross profit at purchase and sending it in the right format. Claude Code handles this glue work well:

```

Build a Shopify custom pixel (web pixel API) that, on checkout_completed:

- Reads each line item's variant ID and quantity

- Looks up cost per item from a JSON map at /cogs.json (variant_id → cost)

- Computes gross_profit = subtotal − $6.40 shipping − 2.9% × subtotal − $0.30 − SUM(cost × quantity)

- Fires a Google Ads conversion for label PROFIT_PURCHASE with value = gross_profit, transaction_id = order id, and cart data parameters (items, merchant_id, feed_country, feed_language)

- Leaves the standard revenue conversion unchanged

Skip the profit event if any cost is missing.

```

Test it with Google Tag Assistant and don't ship until the profit numbers in Google Ads match your spreadsheet for a few days. For targets, paste last month's POAS table into ChatGPT or Claude and ask for a proposed Target ROAS per campaign now that value means gross profit; treat the answer as a draft.

Tools for tracking POAS, fairly compared

  • Spreadsheet. Free and transparent. Cons: manual exports, no bidding integration, fragile.
  • Google Ads cart data + COGS in Merchant Center. Free, native profit reporting. Cons: Google only, reporting rather than bidding, feed and tag must match perfectly.
  • ProfitMetrics, smec, Channable and similar profit-feed tools. Send SKU-level profit values to Google Ads and Meta. Pros: purpose-built for POAS bidding. Cons: another subscription, setup effort, often geared to larger accounts.
  • Analyzify, Stape and other tracking/CAPI tools. Send richer data (COGS, `net_revenue`, cart data) server-side. Pros: fix tracking and profit together. Cons: you still define costs elsewhere.
  • Triple Whale, Northbeam and attribution suites. Blend profit, spend and attribution across channels. Pros: one place for everything. Cons: pricier, and attribution is a model, not ground truth.
  • savvy.so. Profit per order and POAS per channel and campaign, with profit sent as conversion value to Google Ads and Meta (details below).

Start with the spreadsheet for a month, then pick a tool based on whether your pain is reporting (seeing POAS) or bidding (making platforms act on it).

Where POAS can mislead you

  • It ignores lifetime value. A consumables brand can rationally run prospecting at 0.8 POAS if reorders arrive without ad cost. Track new-customer POAS separately with a lower target.
  • It's only as good as your cost data. Missing cost per item, stale supplier prices and averaged shipping all distort it. Audit inputs quarterly.
  • Returns arrive late. In apparel, checkout POAS can be well above the number you get once returns settle. Restate values later or apply a category return rate up front.
  • Attribution still applies. A brand search campaign with a 3.8 POAS would have captured much of that profit anyway. Pair POAS with holdout or geo tests, and watch how organic and AI-driven traffic shift the baseline (AI Overviews Explained covers that side).
  • Fixed costs aren't in it. POAS above 1.0 means ads are contributing, not that the business is profitable.

How savvy.so does it

savvy.so computes the real profit of every Shopify order (price without tax minus product cost, shipping, payment fees and other expenses) and rolls it up by product, category, campaign and channel, with a P&L on the Home screen. It shows POAS per channel and campaign for Google Ads, Meta Ads and Idealo, and sends each order's profit to Google Ads, Meta and GA4 as a conversion so bidding chases margin instead of revenue, without building the pixel yourself. It also pairs Search Console with orders and profit per page, so organic profit sits next to paid. There's a free trial if you want to compare its POAS with your spreadsheet.

FAQ

What does POAS stand for?

Profit on ad spend: gross profit from ad-driven orders divided by ad spend. A POAS of 1.5 means $1.50 of contribution margin per $1 of ads.

What's the difference between POAS and ROAS?

ROAS uses revenue in the numerator; POAS uses profit after product cost, shipping, payment fees and other variable costs. ROAS tells you how much you sold, POAS how much you kept. POAS = ROAS × contribution margin.

What is a good POAS?

Break-even is 1.0. Many stores aim for 1.3–1.5 while scaling and 2.0 or higher when they prioritize profit, but the right target depends on your fixed costs and repeat purchase rate.

How do I convert a POAS target into a ROAS target?

Divide the POAS target by your contribution margin. A 1.4 POAS target at a 35% margin is a 4.0 ROAS target. It's the quickest way to apply POAS thinking while you still send revenue as the conversion value.

Can Google Ads and Meta optimize for POAS directly?

Yes, if you send profit as the conversion value. In Google Ads, use a purchase conversion with profit values and set Target ROAS to your POAS target. Meta's Profit optimization (`net_revenue` via the Conversions API) is limited to some accounts; otherwise use value optimization with a margin-adjusted ROAS goal.