Shopify Profit Tracking for Ads: From ROAS to POAS
Priya Raghunathan
E-commerce Performance Manager
Shopify profit tracking for ads means joining two sets of numbers that never sit in the same place: what your ad platforms spent, and what your Shopify orders actually left you after discounts, refunds, product costs, shipping and fees. ROAS skips the second half. POAS, profit on ad spend, puts it back. This guide walks through where each number lives in Shopify, how to combine it with spend from several platforms, and how to turn the result into rules you can act on.
If you want the concept first, our explainer on why your ROAS doesn't match your profit covers the gap in depth, and the reported vs true ROAS framework shows how to rebuild ROAS from order data. This article is the practical Shopify version: the fields, the formula, a worked example and the decisions that follow.
Quick answer
To track profit from ads on Shopify, add a cost per item to every product and variant, take net sales (after discounts and refunds) from Shopify's reports, subtract COGS, shipping you paid, payment fees and other variable costs to get contribution margin, then divide that by total ad spend across every platform. That ratio is POAS. Above 1.0, your ads paid for themselves in profit; below 1.0, they did not, whatever ROAS says.
Put this guide to work
Launch, test and scale campaigns on six ad platforms from one place, with Wavo, the AI copilot, at your side. Free for 14 days.
Why ROAS misleads a Shopify store
ROAS is revenue divided by spend. It is a useful speed reading, but on a Shopify store it overstates how well ads are doing in at least six ways:
- Discounts. A 20 percent code lifts conversion rate and ROAS can hold steady, while the margin on every order shrinks.
- COGS. Two products with the same price and the same ROAS can carry very different landed costs. ROAS treats them as equal.
- Shipping. If you offer free shipping, the label cost comes out of your pocket on every order, and ROAS never sees it.
- Payment fees. Every card payment carries a processing fee. Small per order, large across a month.
- Returns and refunds. The ad platform counted the purchase when it happened. The refund three weeks later does not flow back into its ROAS.
- Taxes such as VAT. Depending on what your pixel sends, the conversion value reported to the ad platform can include tax that was never yours to keep.
Add platform attribution on top, where several platforms can each claim the same order, and the number on your dashboard drifts further from the bank account. Our list of signs you can't trust your ROAS number is a good self-check before you start.
The POAS formula and contribution margin
Start with contribution margin, the money each order leaves after the costs that rise and fall with sales:
Contribution margin (before ads) = net sales − COGS − shipping costs − payment fees − other variable costs
Then:
POAS = contribution margin before ads ÷ total ad spend
On this convention, break-even is 1.0. A POAS of 1.3 means every euro of spend came back as 1.30 of contribution, leaving 0.30 towards fixed costs and profit.
Some teams use a second convention: profit after ad spend divided by ad spend, where break-even is 0. Both work. Pick one, write it down and never mix them in the same report.
From the same inputs you get the two other numbers you need:
- Contribution margin % = contribution margin before ads ÷ net sales
- Break-even ROAS = 1 ÷ contribution margin %
If 45 percent of net sales is left after variable costs, break-even ROAS is about 2.2. Any channel below that is losing money on every sale it drives, even if its ROAS looks respectable.
Where each number lives in Shopify
Here is where to find each input. Shopify's reports and plan features change over time, so check the current version of your admin and Shopify's plan comparison before you build anything on top.
COGS: the cost per item field
Each product and variant in Shopify has a cost per item field. This is your COGS input, and it matters more than most merchants realise. Shopify's profit reports documentation is explicit: "Profit is reported only for products and variants that had cost recorded at the time they were sold." It also says the field contains static data, so profit figures reflect the cost that was recorded at that point in time.
In practice that means two things. Products with no cost entered quietly drop out of profit reporting, which makes margins look better than they are. And if your landed cost changes, update the field promptly, because past orders keep the old value.
Net sales, discounts and returns
Shopify's finance reports split sales into separate lines, including gross sales, discounts, returns, net sales, shipping and taxes, as its finance reports page lists. Net sales is the figure to build on: Shopify's profit reporting terms define it as gross sales with discounts and returns removed, and the profit reports page confirms that "discounts and refunds affect your net sales and profit margin." Keep taxes out of revenue, since that money belongs to the tax authority.
Profit reports
Shopify offers profit reports such as gross profit by product, gross profit by product variant and profit margin by order. Gross profit there is net sales minus recorded cost. That is a useful base, but it does not include your ad spend, and it does not cover every variable cost on its own. Which reports you see can depend on your Shopify plan, so check what your plan includes before relying on them.
Shipping and payment fees
What you charge customers for shipping and what you pay carriers are two different numbers. Take the cost side from your shipping label invoices or carrier statements. Payment fees come from your payment provider's payouts or statements. If you cannot pull them per order, a well-tested average percentage per order is better than leaving them out.
Other variable costs
Packaging, pick-and-pack fees from a fulfilment partner, app fees charged per order: anything that scales with orders belongs in contribution margin. Rent and salaries do not; they are fixed costs you cover from contribution, and they come back in when you set a target POAS.
Joining ad spend from several platforms with Shopify orders
Shopify knows the orders. Meta, Google, TikTok, Taboola, Snapchat and Outbrain each know their own spend. To get POAS you need both in one table, with the same date range, the same currency and the same time zone.
A workable routine:
- Export spend per platform for the same period, converted to your store currency. Mixed currencies are a classic source of error; our guide to why multi-currency ROAS doesn't add up covers the fixes.
- Pull Shopify net sales and costs for the same period, ideally per order and per product.
- Calculate blended POAS first: total contribution margin divided by total ad spend. This number does not depend on attribution, so it is the one to trust most.
- Then split by channel using UTM data on Shopify orders, if your tagging is consistent. Our walkthrough of keeping UTMs clean from ad to Shopify order shows how a DTC brand made that work.
- Finally split by product, because blended margin hides the SKUs that lose money. The per-SKU profit leak teardown shows what that can uncover.
If you manage several platforms day to day, this join is part of a bigger operating habit, covered in our framework for managing ads across multiple platforms.
Attribution caveats
Channel-level POAS is only as good as the attribution behind it. Keep three caveats in mind:
- Platforms overlap. Meta and Google can both claim the same order. Summing their reported revenue double counts. Use Shopify orders as the single source of revenue, and spend from each platform.
- UTMs miss some orders. Orders that arrive from a saved link, a direct visit or another device will often lack a campaign tag. Leave them in an "unattributed" bucket rather than spreading them by guesswork.
- Upper-funnel channels look weak on last click. Native placements on Taboola and Outbrain, or awareness work on TikTok, often start journeys that close elsewhere. Judge them on blended POAS over a longer window, not only on last-click POAS.
The safest rule: make decisions on blended POAS, use channel POAS to rank, and do not cut a channel on a single week of last-click data.
A worked example
The numbers below are hypothetical, chosen to show the method, not taken from any real store. One month, three ad platforms, prices shown excluding VAT.
What the ad platforms report
| Platform | Spend | Reported revenue | Reported ROAS |
|---|---|---|---|
| Meta | €6,000 | €18,000 | 3.0 |
| €3,000 | €9,000 | 3.0 | |
| TikTok | €1,000 | €4,000 | 4.0 |
| Total | €10,000 | €31,000 | 3.1 |
What Shopify and your invoices say
| Line | Amount |
|---|---|
| Gross sales | €25,000 |
| Discounts | −€2,000 |
| Returns | −€1,500 |
| Net sales | €21,500 |
| COGS (cost per item) | −€8,600 |
| Shipping you paid | −€1,800 |
| Payment fees | −€650 |
| Packaging and other variable costs | −€350 |
| Contribution margin before ads | €10,100 |
Now the maths:
- Blended ROAS on Shopify net sales: €21,500 ÷ €10,000 = 2.15, not 3.1.
- Contribution margin %: €10,100 ÷ €21,500 = 47 percent.
- Break-even ROAS: 1 ÷ 0.47 = about 2.13.
- POAS: €10,100 ÷ €10,000 = 1.01.
The dashboard says 3.1. The store is at break-even on advertising, with nothing left over for salaries, software or rent.
Split by UTM on Shopify orders, and assuming the same margin across channels for simplicity, the picture sharpens. Say Meta-tagged orders brought €12,000 of net sales, Google €6,500, TikTok €1,500, with €1,500 unattributed. At 47 percent contribution margin, Meta returns about €5,640 on €6,000 of spend (POAS 0.94), Google about €3,055 on €3,000 (POAS 1.02) and TikTok about €705 on €1,000 (POAS 0.71). TikTok had the best reported ROAS and the worst POAS. In a real account you would also apply each channel's own product mix, since COGS differs by SKU.
Decision rules: break-even ROAS and target POAS
Once the numbers exist, turn them into rules your team applies every week.
Rule 1: know your break-even ROAS per store, and ideally per product line. Anything below it loses money on each sale. In the example, that line is about 2.1.
Rule 2: set a target POAS that covers fixed costs. If fixed costs are €2,000 a month and you plan to spend €10,000, you need €12,000 of contribution, so the target POAS is 1.2. Recalculate when spend or overheads change.
Rule 3: scale above target, hold between break-even and target, cut below break-even. Apply it to blended POAS first, then to channels and products, with the attribution caveats above.
Rule 4: give upper-funnel channels a longer window. Review them on a 30-day blended view before cutting.
Rule 5: watch margin per SKU, not only per campaign. A campaign selling a loss-making product will never reach target POAS, however well it is optimised.
Common mistakes
- Leaving cost per item empty. Products without a recorded cost fall out of Shopify's profit figures and flatter your margin.
- Using gross sales instead of net sales. Discounts and refunds are real money out.
- Counting VAT as revenue. It inflates both ROAS and POAS.
- Summing platform-reported revenue. Overlapping attribution double counts orders.
- Mixing POAS conventions. A POAS of 1.2 means opposite things depending on whether ad spend was already deducted.
- Forgetting shipping and fees. They are often the difference between break-even and profit.
- Judging on one week. Refunds and delayed conversions land later; review on a rolling window.
Where Wevion fits
Doing this by hand works, but the spreadsheet goes stale the day after you build it. Wevion's Profitability Analytics, in beta, connects your Shopify or WooCommerce store, syncs cost per item from it, and lets you set shipping and fees once in Settings. It then subtracts COGS, shipping, payment fees, extra costs and ad spend from net sales to show profit, margin and POAS, with your break-even POAS worked out and margin broken down for every SKU.
Spend comes from Meta, Google, TikTok, Taboola, Snapchat and Outbrain, synced into one view about every 15 minutes, so the join between orders and spend is already done. You still decide what to scale and what to cut; the difference is that you decide on profit rather than on ROAS.
Key takeaways
- ROAS ignores discounts, COGS, shipping, payment fees, returns and tax, so it overstates ad performance on a Shopify store.
- POAS divides contribution margin before ads by total ad spend; on that convention, break-even is 1.0.
- In Shopify, COGS comes from the cost per item field, and profit is only reported where a cost was recorded at the time of sale.
- Use Shopify net sales as the one source of revenue, and each platform only for spend.
- Decide on blended POAS, rank channels and SKUs with attributed POAS, and set a target that covers fixed costs.
Want to see profit and POAS for your own store next to spend from all your platforms? Start a 14-day free trial of Wevion on the Pro plan, no card needed.
Explore more in
Ads Management Platform
Read the curated pillar page with every guide in this topic, ordered from foundations to advanced.