Shopify Profit Reports: What COGS Includes — and What It Silently Misses
Shopify's profit reports do exactly one subtraction: net sales minus the cost you recorded. That's a perfectly honest calculation of a number that is not your profit. The report never lies about what it computes — it just computes far less than the word "profit" makes you expect, and the gap is always in the flattering direction.
What the report actually computes
The machinery is simple. For each line sold, Shopify takes the cost per item recorded on the variant and multiplies by units. That's the entire cost side. The revenue side is net sales:
net sales = gross sales − discounts − returns
gross profit = net sales − (recorded cost × units)
margin = gross profit / net sales
Two things about this are done well, and worth knowing. Discounts reduce the revenue side, so a heavily discounted sale correctly shows a thinner margin rather than a fictional full-price one. And returns come out of net sales, so a refunded order doesn't inflate the top line.
Everything else about your cost of doing business is absent — not estimated, not approximated. Absent.
What never enters the number
- Payment processing fees. The percentage plus the fixed fee on every order. They're deducted from your payouts, and they appear in your finance reports — but the profit reports don't subtract them. On small orders the fixed part alone is a visible slice of margin.
- Outbound shipping you pay for. If you offer free or subsidized shipping, the label cost exists only in your carrier bill. The profit report has no idea it happened.
- Packaging and pick-pack. Boxes, void fill, labels, the minutes someone spends packing. Small per order, structural in aggregate.
- Everything between the supplier's price and your landed cost. Freight in, duty, brokerage, currency spread — unless you deliberately bake them into the cost field, the report runs on the bare price-list number. We covered how big that gap gets in the landed cost guide — 10–30% is normal for importers.
- Chargebacks and their fees. A disputed order takes back the revenue and adds a penalty on top. Neither appears in profit by product.
- Apps, storage, advertising, overhead. Obvious, but worth stating: "gross profit" upstream of all of it.
One order, two verdicts
Take a product retailing at $40.00 with a recorded cost of $22.00 — a healthy 45.0% catalog margin. A customer uses a 10% discount code and qualifies for free shipping.
The report says $14.00 and 38.9%. The order actually contributed $5.56 before a cent of overhead. Neither number is wrong — they answer different questions. The trouble starts when you make pricing decisions with the first number while your bank account lives on the second.
The two silent failure modes on the cost side
The subtractions above are at least predictable — you can mentally deduct a fee percentage. Two other distortions are worse, because they're invisible and per-SKU.
1. Lines with no recorded cost
The report can't invent a cost you never entered. A variant with an empty cost field contributes its full net sales with nothing set against it, so every blended profit figure that includes it is inflated — and nothing in the report is flagged. Catalogs assembled over years by imports, apps and manual entry almost always carry a band of costless variants. If you've never checked, export your products and count the empty cost cells before trusting any aggregate margin number.
2. Costs that were true last quarter
Shopify captures the cost at the time of the sale. That has a brutal corollary: updating the field later fixes the future, not the past. Every sale that went out between the supplier's increase and your update is recorded at the old cost forever.
Concretely: your supplier raises a $22.00 cost by 12% to $24.64 on June 1st. You get to updating the field on July 15th. At 40 units a week, roughly 240 units sold in between — each recorded $2.64 too cheap. Your profit reports for June and half of July are overstated by about $634 on that one SKU, and no later action will restate them. Multiply by every SKU on that supplier's price list.
This is the structural weakness of the single cost field — one number, no history, silently stale — which we took apart in Shopify's cost per item: one number, no history. The profit report is only ever as honest as that field was on the day of each sale.
Reading the reports honestly
- Keep the cost field current, dated to reality. Update costs the day a new price list takes effect, not the day you get around to it. Every day of lag is permanently mis-recorded history. If updating is painful, that's a process problem — see bulk-updating cost per item for the mechanics.
- Close the empty-cost gap once. Export, filter for blank costs, fill them — even approximate numbers beat blanks, because a blank is an exact error of 100%.
- Know your deduction stack. Work out payment fees, average label subsidy and packaging as a percentage of net sales for your store. It's usually stable. Then read every report margin with that percentage mentally subtracted: "the report says 38%, so contribution is around 24%."
- Reconcile quarterly against money. Take a quarter's reported gross profit, subtract the real fee and shipping totals from your finance reports and carrier invoices, and compare with what actually accumulated. The residue is your report's personal distortion — and its trend tells you whether your costs are drifting stale.
The part Shopify cannot know
Every limitation so far is arithmetic you can compensate for. The one you can't compensate for after the fact is the input itself: the report only knows the cost you told it, and your supplier doesn't update that field when they reprice. The moment a price list changes, every report downstream starts overstating profit — quietly, per sale, until you notice. The fix isn't a better report; it's catching the cost change the week it happens, as laid out in the five-step response to a price increase.
Check the input before trusting the output
Your profit reports are only as good as the costs behind them. Drop your latest supplier price list and your Shopify export into the free Supplier Price Margin Checker and see which recorded costs are already out of date — and what that does to your real margins.
Open the free checker ↗