July 30, 2026 · CostSentry

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

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 same order · report view vs. bank-account view
Net sales (after 10% discount)$36.00
Recorded cost−$22.00
Gross profit per report$14.00 · 38.9%
Payment fee (2.9% + 30¢)−$1.34
Shipping label−$6.50
Packaging−$0.60
Actual contribution$5.56 · 15.4%

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.

A useful habit: think of Shopify's gross profit as a ceiling, not an estimate. Real contribution is always below it, and the distance grows with discounts, free shipping and small order values. If a SKU looks marginal in the profit report, at the bank it has already gone.

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.

The flattering direction, always. Note the asymmetry: missing costs inflate profit, stale costs inflate profit (suppliers rarely lower prices quietly), and every omitted expense inflates profit. There is no error in this system that makes your margins look worse than they are. A profit report that has drifted from reality has drifted upward — which is exactly why nobody notices until the annual accounts do.

Reading the reports honestly

  1. 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.
  2. 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%.
  3. 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%."
  4. 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 ↗
Runs in your browser. Nothing uploaded, no account.