Home / Guides / Measurement

Measurement

How to calculate true profit from Shopify ads

Ad spend is only one of six costs between a sale and a profit. Here is the full waterfall, the cost fields to fill in Shopify, and the break-even ROAS each product actually needs.

Updated 25 Sep 2026 · ~2728 words · David Smith

Ads Manager says 3.1. Google says the Shopping campaign is your best performer. Shopify says sales are up on last month. Then the accountant sends the quarter and you are flat, or slightly down, and nobody can point at the line that did it. The question is not whether ROAS is lying. It is which four costs it never had access to in the first place.

Direct answer: True profit is net sales after discounts and refunds, minus the cost of goods actually shipped, minus fulfilment, minus payment fees, minus every pound of ad spend, minus fixed overhead. ROAS sees the first item and the fifth and nothing in between. Enter Cost per item on every selling variant in Shopify, price fulfilment from the carrier invoice rather than the rate card, and work out a break-even ROAS per product. Most apparel brands find that number sits between 2.2x and 4.6x depending on the return rate, not at the one blended target they have been managing to.

Why a 2.4x blended ROAS can be a loss

ROAS is a ratio of revenue to ad spend. It has no opinion about what the revenue cost you to produce, pack, post or take back. That would be fine if the gap were small and stable. It is neither. Between the order confirmation and the money staying in your account sit five separate deductions, and in fashion two of them move week to week.

There is a second problem underneath the first. Platform ROAS is measured against platform-attributed revenue, and Meta and Google will both happily claim the same order. If Meta reports £41,000 of attributed revenue and Google reports £14,000 on a month where Shopify recorded £60,000 of net sales, you have £55,000 of claims against £60,000 of reality, and no way to split it fairly. The fix is not better attribution software. The fix is to stop using per-platform ROAS as the profit test and use blended spend against Shopify net sales instead. Per-platform numbers stay useful for deciding which creative or which hour to back. They are not evidence about the bank balance.

The costs ROAS cannot see

Write these down before you open a spreadsheet, because the argument about which platform gets credit is a distraction until they are all priced.

A worked month, in full

Here is a UK apparel brand doing 750 orders in a month at an £80 average order value, all figures excluding VAT. Blended ROAS is 2.4x, which on most calls would be described as fine.

LineWorkingAmount
Net product revenue750 orders × £80£60,000
Shipping charged750 × £3.20£2,400
Refunds90 returns (12%) × £80-£7,200
Net revenue£55,200
Cost of goods shipped750 × £26-£19,500
COGS recovered on resellable returns72 units × £26 (80% resellable)+£1,872
Outbound carriage750 × £4.90 actual invoice-£3,675
Packaging750 × £0.65-£488
Return carriage90 × £4.20-£378
Payment fees1.5% of £62,400 plus 20p × 750-£1,086
Contribution before ads53.2% of net product revenue£31,945
Ad spend, Meta and Google combined£19,000 plus £6,000-£25,000
Contribution after ads£6,945
Fixed overheadShopify plan, apps, storage, part-time studio-£7,400
Net result-£455

The instructive part is how close it is. Contribution runs at 53.2% of net product revenue, so the ads-only break-even is 1 divided by 0.532, which is 1.88x. Comfortably beaten. Add the £7,400 of fixed cost and the month needed £32,400 of contribution, which means net product revenue of about £60,900 at that rate. They did £60,000. The whole loss is a £900 revenue miss on a £60,000 month, or a 1.5% shortfall, and it was completely invisible in a dashboard reporting 2.4x against a 2.0x target. The target was set from a feeling. The correct target was 2.44x.

Break-even ROAS belongs to the product, not the account

One blended target across a mixed catalogue is where the money quietly goes. A tee and a boot do not carry the same margin, do not cost the same to post, and absolutely do not come back at the same rate. The same 2.4x that is fine on knitwear is a slow bleed on footwear. If you have just banked your first order, the same logic applies before you spend on ads, as set out in what to do after your first Shopify sale.

ProductPriceUnit COGSOther variableReturn rateContribution after returnsBreak-even ROAS
Logo tee£26.00£7.80£5.106%£11.67 (44.9%)2.23x
Sand hoodie£68.00£24.50£7.2012%£30.26 (44.5%)2.25x
Leather boot£180.00£96.00£14.6030%£38.92 (21.6%)4.63x

Other variable is carriage net of the shipping charged, plus packaging and payment fees. Contribution after returns applies the return rate to the gross contribution and then charges the round trip carriage and a 20% write-off on returned units. The boot needs 4.63x and the tee needs 2.23x. If you are running a 3.0x target across both, you are underfunding a product that prints money and overfunding one that does not. This is the same logic as looking at spend by variant rather than by campaign, which is covered in variant-level ad spend.

A margin you have not entered is not a margin you have, it is a margin you are hoping for.

Getting cost into Shopify without losing a week

The field is called Cost per item and it lives on each variant. For a handful of products, open Products, click the product, scroll to the pricing block and type it in. For a real catalogue, go to Products, filter by a collection or by product type, tick the header checkbox, click Bulk edit, then use Columns to add Cost per item and fill the grid. For thousands of variants, use Export to pull a product CSV, fill the Cost per item column in a spreadsheet, and re-import with Import, overwriting existing products.

Do not fill it for everything at once. Sort your sales report by units sold over the last 90 days and do the top 100 variants first. Those will cover the overwhelming majority of both revenue and ad spend, and you can get them done in an afternoon with a supplier invoice open in the other window. The long tail can wait.

Once costs are in, Analytics, Reports gives you margin and profit reports built on that field. Report availability varies by plan, so if the profit report is not in your list, the cost data still exports and still works in a spreadsheet. Two things the built-in reports will not do for you: they do not know your carrier invoice, and they do not know what a returned item was worth when it came back scuffed. Those stay manual, which is fine, because they are monthly numbers rather than daily ones.

One habit worth forming. When landed cost changes because the container price moved or the pound did something, update Cost per item on the day the new stock lands and write the date in a note. Reporting will not model two costs for the same variant, so the date note is what stops you arguing with yourself in March.

Do it yourself first

0 of 7 done. Ticks stay on this device. When they are all ticked you know exactly what a desk would be doing for you.

Do it yourself first

Block two hours. You want one closed month, not a rolling window, because refunds settle late and a rolling window will flatter you. Before you even open a spreadsheet, though, it's worth checking whether the store itself is converting at all, which is covered step by step in why your Shopify store has traffic but no sales.

  1. Enter Cost per item for the top 100 selling variants using Bulk edit. Landed cost, including inbound freight and duty.
  2. In Analytics, Reports, Sales over time, pull the month. Take net sales after discounts and returns, exclude VAT, and note the order count and the shipped order count separately.
  3. Export ad spend from Ads Manager under Reports, and from Google Ads under Campaigns with the CSV download. Add them together and ignore both revenue columns.
  4. Open the carrier invoice for the month. Divide the total by parcels shipped. That is your real outbound cost. Add packaging per parcel from your last consumables order.
  5. Pull the returns list. Count refunded value, count return labels used, and ask the person who processes them what share went back on the shelf. If nobody knows, count it this month and use the real figure next month.
  6. Build the waterfall from the table above. Divide contribution before ads by net product revenue to get your contribution rate, then divide one by that rate for your ads-only break-even ROAS.
  7. Add fixed overhead, divide by the contribution rate, and you have the revenue the month has to hit. Put that number at the top of the spreadsheet in bold.
  8. Repeat the per-unit version for your five biggest sellers and set each campaign a target that matches its own product, not the account average.

If you want to sanity check a single decision before you finish the whole thing, the pause ads decision tool and the days of cover tool run in the browser with no login.

Where Ralph fits

Ralph's reporting puts the P&L next to the ads, so contribution and spend sit on the same screen instead of in a spreadsheet you rebuild every month. Separately, he holds stock and catalogue truth next to paid media, which is a different view answering a different question. The mechanics of the profit side are set out in Shopify P&L that matches how money moves. The honest limit: Ralph does not invent COGS, so a variant with a blank Cost per item shows as missing rather than estimated, and no reporting layer can price your carrier invoice or your resell rate for you. Ralph is also not open for self-serve yet, it is a private beta waitlist.

What this is not

This is not attribution. Attribution tools argue about which channel deserves credit for an order that already happened. This calculation does not care who gets credit, it cares whether the order made money at all, and it works from blended spend against real net sales precisely so the credit argument never has to be settled. If you want the comparison, see Triple Whale vs Northbeam. It is also not statutory accounts. Your accountant will handle accruals, depreciation, stock valuation and the timing differences that make the year-end look different from your spreadsheet. What you are building here is a management number you can act on the same week, which is a different job to a number you can file.

Calculate true profit from Shopify ads

  1. Enter landed cost per variant. In Shopify admin go to Products, tick the variants that sold in the last 90 days, choose Bulk edit and add the Cost per item column. Enter landed cost including inbound freight and duty, not the supplier's unit price.
  2. Pull net sales for one closed month. Analytics, Reports, Sales over time. Use net sales after discounts and refunds and exclude VAT. Note the order count separately, you need it for per-order costs.
  3. Export ad spend from every platform. In Ads Manager use Reports and export account-level spend for the same dates. In Google Ads open Campaigns, set the same range and download the CSV. Add them. Ignore both platforms' revenue columns for this exercise.
  4. Price fulfilment from the invoice. Take the month's carrier invoice total, divide by shipped orders, and add packaging cost per parcel. Add the return carrier cost separately, driven by returned order count.
  5. Cost the returns honestly. Record refund value, return shipping, and the share of returned units that could not go back into saleable stock. Add that write-off back to COGS.
  6. Build the waterfall and the rate. Net revenue, minus COGS, minus fulfilment, minus payment fees, equals contribution before ads. Divide contribution before ads by net sales to get your contribution rate.
  7. Set break-even ROAS per product. Divide one by each product's contribution rate after returns. Compare each campaign against its own number rather than one blended target for the whole account.

Questions people actually ask

how to calculate true profit from shopify ads

Start with net sales after discounts and refunds, excluding VAT. Subtract cost of goods actually shipped, less any cost recovered on resellable returns. Subtract carrier and packaging costs, payment processing fees, then total ad spend from every platform. What remains is contribution. Subtract fixed overhead and you have profit. Anything that skips COGS or returns is a vanity number.

why does my roas look good but im losing money

Because ROAS measures revenue against ad spend and ignores the four costs in between. At a 53% contribution rate you need roughly 1.9x just to break even before overheads, and closer to 2.4x once rent, apps and part-time help are covered. Platform ROAS is also inflated by attribution overlap, so blended spend against Shopify net sales is the honest version.

how to add cost of goods to shopify reports

Open Products, tick the variants you want, choose Bulk edit and add the Cost per item column, or export a product CSV, fill the cost column and re-import. Cost per item drives the profit and margin reports under Analytics, Reports. Report availability varies by plan, but the field itself exists on every plan and exports cleanly.

Is there a Shopify ads profit margin calculator?

There are plenty, and a spreadsheet does the same job in twenty minutes. The calculation is not the hard part. Getting accurate landed cost per variant, a real carrier invoice and an honest resell rate on returns is the hard part. A calculator fed with a guessed 60% margin will confidently tell you the wrong answer.

Should I include fixed costs in break-even ROAS?

Run two numbers. Contribution break-even tells you whether the next order is worth buying. Fully loaded break-even, which spreads rent, apps, salaries and your own draw across forecast revenue, tells you whether the month works. Use the first for campaign decisions and the second for the monthly target.

What if I genuinely do not know my COGS?

Then say so rather than typing a plausible number. A missing cost is a known gap you can close this week with supplier invoices. An invented cost quietly poisons every product decision for a year, and you will not be able to tell which reports were wrong.

If you want stock, ads and the morning list in one place: that is what we built Ralph for. A growth operator for Shopify, with review before anything ships. Not magic. Fewer tabs. See Ralph · Docs