Skip to content

Margins and cost basis

Several report columns — Margin %, Markup %, Gross profit / unit, Gross profit (stock), and Stock cost — depend on which cost you’re comparing a variant’s price against. Reports that show them let you choose the cost, and name it right in the column so you always know which number you’re looking at.

  • Choosing the cost basis
  • What each column means
  • Tax-exclusive retail prices
  • A cost of zero
  • Reading the numbers on a grouped row
  • See also

On reports where it applies (Products, Low stock, ABC analysis, Stock on hand), a Cost basis control sits in the toolbar with two options:

OptionWhat it reads
Shopify costThe cost per item stored on the Shopify variant — the Cost price value.
Supplier costThe primary supplier’s mapped cost for the variant. A variant with no supplier link shows ”—”.

Switching the basis rewrites every margin, markup, gross-profit, and stock-value number on screen. To make that unmissable, the affected column headers name the basis in use — for example Margin % (Supplier cost) — so the header and the numbers underneath it always agree, in the table, in an export, and on a scheduled report’s CSV.

  • Margin %(price − cost) ÷ price × 100
  • Markup %(price − cost) ÷ cost × 100
  • Gross profit / unitprice − cost, per unit
  • Gross profit (stock)available quantity × (price − cost), for everything currently on hand
  • Stock costavailable quantity × cost

Hover any of these cells to see the exact formula and the operands it used, unrounded.

If your retail prices include tax (VAT, GST, or sales tax), the raw price-versus-cost comparison overstates every margin — the price is gross while the cost is net. An optional shop-level setting under Settings → Tax rates (“Margins use tax-exclusive retail prices”, with the tax percentage included in your prices) makes Margin %, Markup %, and the Gross profit columns divide the price by 1 + rate/100 before comparing.

When that setting is on, the affected column headers add an “excl. tax” suffix on top of the cost-basis name — for example Margin % (Supplier cost, excl. tax) — in the table, in exports, and on a scheduled report’s CSV, so the header always states both the cost and the price flavour behind the number. Cost-only columns such as Stock cost read no price and keep their plain basis label.

If a variant’s cost reads as zero — commonly because a cost wasn’t imported for it — the margin family treats that as free goods: a 100% margin, with the full retail price counted as profit. That’s mathematically correct given a zero cost, but it’s worth checking whether the zero is real or just a gap in your cost data before trusting the number.

Group a report by a dimension (supplier, vendor, and so on) and the margin-family columns still show, but as a rollup of the rows in that group — an average for Margin %, Markup %, and Gross profit / unit, and a sum for Gross profit (stock) and Stock cost. Hover a grouped cell to see which of the two it is.