POASCalculationforShopifyBrands:TheFormula,theInputs,andtheGotchas
Most Shopify brands calculating POAS get it wrong because they pull "profit" straight from the Shopify dashboard. Shopify's profit number excludes payment fees, return processing, fulfilment costs, and item-level discounting. That makes it useful for a quick directional read and dangerous as a bidding signal. This article shows the real formula, where each input lives in a typical Shopify stack, the five inputs brands almost always miss, and how to feed corrected POAS into Google Ads.
A quick note before we start: POAS is a registered trademark of ProfitMetrics. We use the term throughout as the now-standard industry shorthand for "profit on ad spend." If you want a full primer on the metric itself, start with our POAS explainer.
Why Shopify's "profit" number misleads you
Open your Shopify admin, go to Analytics, and you will see a "gross profit" column on the Sales report. This number is calculated as revenue minus the cost-per-item value you have entered against each variant. That is it.
What it does not include:
- Payment processing fees (Shopify Payments takes 1.5–2.5% plus 20p per transaction in the UK)
- Return processing costs (refunded items, return shipping, restocking, depreciation on used returns)
- Discount value at the item level (especially for promo codes that apply variably across baskets)
- Shipping costs (inbound from supplier, outbound to customer, packaging materials)
- Fulfilment labour or 3PL pick-and-pack costs
- Subscription revenue lag (relevant if you sell on subscription)
For a brand with 25% blended gross margins and 30% returns, Shopify's "profit" can overstate reality by 40% or more. If you optimise Google Ads bidding against that overstated number, you are systematically over-investing in the wrong campaigns.
This is not a Shopify failing. The Sales report was built for a directional revenue view, not a CFO-grade margin view. The problem is brands treating it as the second when it was built as the first.
The real POAS formula
POAS divides actual profit (not revenue, not Shopify "gross profit") by ad spend over the same period.
POAS = (Revenue − COGS − Shipping − Payment fees − Discounts − Returns cost) / Ad spend
Each input must be tracked at the same time grain as the ad spend you are dividing by — usually the campaign period, often weekly or monthly. If you are pulling ad spend from Google Ads for July and revenue from Shopify for July, every other cost input needs to be July as well.
A POAS of 1.0 means you broke even after ad spend. A POAS of 2.0 means you made £2 of contribution per £1 of ad spend. What constitutes a "good" POAS is entirely category-dependent.
Where each input lives in a Shopify stack
Pulling POAS correctly means pulling from several systems. Here is the typical map:
| Input | Source | Notes |
|---|---|---|
| Revenue | Shopify Admin → Reports → Sales | Use "Net sales" not "Gross sales" — net excludes refunds and gift cards |
| COGS per unit | Shopify Admin → Products → Variant cost field | If not populated for every variant, your POAS is wrong before you start |
| Shipping (outbound) | Shopify Shipping or your 3PL invoices | Easiest source is the per-order shipping cost from Shopify Shipping label data |
| Payment fees | Shopify Payments → Payouts | Shows actual fees withheld per payout — pull monthly |
| Discounts | Shopify Admin → Reports → Sales → "Discounts" column | Item-level, includes promo codes and automatic discounts |
| Return costs | Shopify Returns + 3PL invoices | Most brands estimate as a blended % of revenue — see gotchas below |
| Ad spend | Google Ads → Reports → exported by campaign | Pull same date range as revenue |
For a more rigorous setup, layer in Polar, ProfitMetrics, or Triple Whale to automate the data joining. For a small or mid-size brand, a monthly spreadsheet pulling from each source is enough to get started.
The five inputs most brands miss
These are the categories almost every Shopify POAS calculation we audit gets wrong:
- Payment fees on refunded orders. Shopify Payments takes its fee at the point of payment and (usually) refunds the fee when you refund the order. But your refund processing still costs you — the customer service time, the warehouse handling, the depreciation. Most brands forget to subtract any refund-related cost from "profit," inflating their POAS by 5–15% depending on return rate.
- The variable cost of free shipping. If you offer "free shipping over £50" but pay £4.50 per outbound shipment, that £4.50 is a real per-order cost that does not appear in Shopify's gross profit calculation. For brands averaging £80 AOV with 25% margins, free shipping can eat 6 percentage points of POAS unaccounted for.
- Promo code stacking. Shopify's discount reporting captures individual promo codes but can mis-attribute when codes stack (a customer applying both a 10% off code and free shipping). The item-level discount value reported sometimes excludes the shipping portion. Cross-check Shopify's discount total against your monthly revenue reconciliation.
- Returns at variant level. Average return rate across your catalogue is a starting point. A 70% margin shirt with a 15% return rate has very different economics from a 25% margin pair of shoes with a 45% return rate. If you are optimising bids per SKU (which is what BOI™ is built around), you need return-adjusted profit at the variant level, not blended.
- Subscription customer lifetime value lag. If you sell on subscription (supplements, food, beauty), the first month's POAS will look terrible because all the acquisition cost is loaded against just the first order's revenue. The right way to calculate POAS for subscription is to use predicted-LTV-based conversion values in Google Ads. Hard to set up, transformative for bid decisions.
A worked example — anonymised Shopify brand, one month
Apparel brand, 1,200 orders, July 2026. The Shopify dashboard says gross profit of £62,400. The reality:
| Line | Amount |
|---|---|
| Net sales (Shopify) | £124,800 |
| COGS (Shopify variant costs) | £62,400 |
| Shopify-reported gross profit | £62,400 |
| Less: payment fees (2% + 20p × 1,200) | (£2,736) |
| Less: outbound shipping (£4.50 × 1,200 × 85% non-free) | (£4,590) |
| Less: return processing (18% × £85 × £6 handling) | (£1,652) |
| Less: promo code value (Shopify discounts column, validated) | (£8,400) |
| True contribution margin | £45,022 |
| Google Ads spend (July) | £20,000 |
| POAS (corrected) | 2.25x |
| POAS (using Shopify's reported "profit") | 3.12x |
In this example the agency was reporting a POAS of 3.12x because they were dividing Shopify's reported gross profit by ad spend. The real number was 2.25x — a 28% overstatement. The practical effect: bid signals targeting 3.0x POAS were actually delivering closer to 2.0x. Two SKUs being "profitable" against the agency's reporting were actually break-even. Months of scaling spend on the wrong products before the correction caught up with the P&L.
How to feed corrected POAS into Google Ads bidding
Once you have true contribution margin per order, the next move is getting Google Ads to bid against it. Three options, ordered by accuracy:
Option 1: Conversion value rules (fastest setup, blunt). Use Google Ads' built-in conversion value rules to apply a fixed multiplier to revenue based on category or product. Quick to set up, only works at coarse granularity. Use when you have 2–3 broad margin bands rather than per-SKU variation.
Option 2: Offline conversion imports (most common, weekly cadence). Export your true profit per order from Shopify weekly, upload to Google Ads as offline conversions, and bidding learns against the profit signal. Most mid-size brands run this. Requires a process and someone reliable to run it.
Option 3: Server-side custom values at conversion time (most precise, requires dev). Calculate true profit at order completion and send it as the conversion value via server-side Google Ads conversion tracking. Real-time accurate, scales infinitely, harder to implement.
We have a longer breakdown of feeding margin data into Google Ads covering each option in implementation detail.
When Shopify's built-in reporting is "good enough"
Three scenarios where the time cost of building a corrected POAS calculation outweighs the value:
- Single-category catalogues with uniform margin (everything is the same product, same supplier, same shipping cost)
- Sub-£10k/month ad spend, where directional accuracy beats precision
- Brands not yet doing margin-aware bidding in Google Ads — the corrected POAS is only useful if you are bidding against it
If you are spending £10k+/month on Google Ads with a mixed-margin catalogue, the gap between Shopify's reported profit and your true POAS is almost certainly costing you more than the time cost of fixing it.
Frequently asked questions
Why does my Shopify POAS look different from my Google Ads ROAS?
Because they measure different things. ROAS is revenue divided by ad spend — it does not deduct cost of goods, fees or discounts. POAS divides actual contribution margin by ad spend. A campaign showing a healthy 5x ROAS can deliver a 1.5x POAS on a low-margin product, which means most of that 'return' is gross revenue that disappears into product cost before you see any profit.
Can I just trust the gross profit number in Shopify Analytics?
For a directional view, yes. For Google Ads bidding decisions, no. Shopify's gross profit excludes payment fees, fulfilment costs, return processing and several other categories that materially affect actual contribution margin. The gap is usually 15–40% depending on category, returns, and fulfilment model.
How often should I recalculate POAS?
Weekly is the cadence we run for clients. Monthly is the minimum for any brand spending £10k+/month on Google Ads. Daily POAS is mostly noise unless you are running very high-volume campaigns.
Do I need a tool like ProfitMetrics, Polar or Triple Whale?
Useful but not required. For brands spending under £30k/month on ads, a monthly spreadsheet pulling from Shopify, Google Ads and your 3PL is usually enough. Above that spend level, a dedicated POAS platform pays back its cost quickly through faster bid decision cycles and fewer manual errors.
What POAS should I be targeting?
Entirely category-dependent. Most apparel brands target 1.8–2.5x. Supplements with strong LTV can run at 1.2x first-order POAS profitably. Home goods often target 2.0–3.0x.
How do I handle subscription products in POAS?
The right answer is to use predicted lifetime value as the conversion value in Google Ads rather than first-order revenue. Practically, that means feeding LTV predictions into the bidding signal. Without it, your acquisition campaigns will always look unprofitable on first-order POAS even when they are highly profitable on lifetime POAS.
Next steps
Want help building a corrected POAS calculation against your Shopify data? We audit ecommerce Google Ads accounts spending £10k+/month and show you exactly where ROAS is hiding unprofitable spend.
Book a Profit ReviewBy Chris Avery, Founder, JudeLuxe. Speaker at HeroConf and PerformanceMCR 2026 on POAS-led PPC for DTC brands.
POAS is a registered trademark of ProfitMetrics.