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.
On this page
Section titled “On this page”- 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
Choosing the cost basis
Section titled “Choosing the cost basis”On reports where it applies (Products, Low stock, ABC analysis, Stock on hand), a Cost basis control sits in the toolbar with two options:
| Option | What it reads |
|---|---|
| Shopify cost | The cost per item stored on the Shopify variant — the Cost price value. |
| Supplier cost | The 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.
What each column means
Section titled “What each column means”- Margin % —
(price − cost) ÷ price × 100 - Markup % —
(price − cost) ÷ cost × 100 - Gross profit / unit —
price − cost, per unit - Gross profit (stock) —
available quantity × (price − cost), for everything currently on hand - Stock cost —
available quantity × cost
Hover any of these cells to see the exact formula and the operands it used, unrounded.
Tax-exclusive retail prices
Section titled “Tax-exclusive retail prices”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.
A cost of zero
Section titled “A cost of zero”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.
Reading the numbers on a grouped row
Section titled “Reading the numbers on a grouped row”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.
See also
Section titled “See also”- Editing prices in a report — changing the Price or Compare-at price a margin is calculated against.
- Reporting — grouping, filters, columns, and export.
- Settings → Tax rates — the “Margins use tax-exclusive retail prices” setting.