Shopify COGS: tracking cost of goods sold without fooling yourself
How Shopify COGS works — the cost per item field, the native profit reports, what they leave out, and a spreadsheet method for true landed cost.
InventoryX is in development and not available today. ClearStock is the live Shopify app.
Short answer: Shopify tracks cost of goods sold through the Cost per item field on each product and variant. Fill it in and Shopify's native profit reports (Analytics → Reports → Profit Margin) will show gross profit by product, by variant, by POS location, and margin by order. Leave it blank and those reports silently exclude the affected sales — you get numbers that look like reports and mean nothing.
The catch most stores miss: the cost per item field holds one static number per variant. What you paid last shipment — including freight, duty, and the supplier's price change since spring — is not what the field says. This guide covers how the native setup works, where it drifts from reality, and a spreadsheet method for keeping a truer cost number next to the one Shopify holds.
How COGS works in Shopify (as of October 2026)
Shopify does not have a "COGS" setting. It has per-variant costs, and the reporting builds up from there:
- Cost per item lives in the Price section of each product. For a reseller, Shopify's own guidance is to enter what you paid the manufacturer, excluding taxes, shipping, or other costs (Shopify Help Center, "Profit reports," accessed October 2026). For products you make, it's labor plus materials.
- Costs are per variant. If a product has variants, each variant needs its own cost entered — no product-level inheritance.
- Profit reports require costs at sale time. Profit is reported only for products that had a cost recorded at the time they were sold. Add a cost field this month and your profit reports stay empty for everything sold before it. This is the single most common reason a store's Gross profit by product report comes back mostly blank.
Once costs exist, the Profit Margin report category in Analytics gives you: Gross profit by product, Gross profit by product variant, Gross profit by POS location, Average profit margin by market, and Profit margin by order. Margin in these reports is (net sales − cost) ÷ net sales — so discounts and refunds pull reported margin below the margin shown on the product page, which always uses full price. Sell a $20 item at $15 with a $10 cost and the report shows 33%, not 50% — Shopify's docs use exactly that arithmetic.
Why COGS discipline feeds every inventory decision
Cost is not just an accounting field. Every inventory decision that matters is downstream of it:
- Reorder urgency. A SKU running low with a 55% margin and one running low at an 18% margin are not the same emergency. Without a trustworthy cost per variant, you can't rank which low-stock situation is bleeding the most gross profit — you're ranking by units.
- Dead stock severity. 200 units of slow-moving stock at $3.80 a unit and 200 units at $26 a unit are the same shelf problem and completely different cash problems. (For the disposal side, see how to deal with dead stock.)
- Margin-turn math. Gross margin return on investment — the metric that combines margin and inventory turns — is undefined without cost. If you've never run it, the GMROI walkthrough is the natural next step once your cost fields are real.
- Carrying cost. The money tied up in stock is valued at cost, not at retail (the full formula is in the carrying cost guide). Any carrying-cost estimate built on retail prices overstates the burn by your markup multiple.
What the native COGS numbers leave out
Three gaps, all verifiable in the admin and Help Center as of October 2026:
1. The cost field is static. Shopify's own documentation says the Cost per item field "contains static data," and points stores that need dynamic costing toward an ERP, accounting system, or reporting app. In practice: you typed $9.20 in March, the supplier raised to $10.05 in July, and every profit report since July has been quietly overstating margin by $0.85 a unit until someone remembers to edit the field.
2. The field excludes freight and duty — by design. The guidance is to record what you paid the manufacturer, excluding shipping and other costs. That's fine for a US-wholesale buy where freight is trivial. For imported goods, freight and duty can add 10–25% to the true unit cost (treat that range as an assumption to check against your own invoices, not a law) — and none of it appears in your Shopify margin.
3. No landed-cost build-up and no full contribution margin. Shopify's profit reports show gross profit, not the fully-loaded number after ad spend, pick-pack labor, and payment fees. The native reports were never trying to do that — but know which question you're asking before you trust the answer.
One more trap: changing a cost field doesn't restate history. Past orders keep the cost that was recorded when they sold, which is correct behavior for profit reporting — and a reason to not "clean up" costs casually without noting the change date somewhere.
A spreadsheet method for true landed COGS
Keep the landed build-up in a spreadsheet keyed by SKU. The full landed-cost formula is its own deep dive; here we'll just show the discipline with one SKU.
Worked example — a dog harness variant, HAR-NIM-M, bought from an overseas supplier, illustrative numbers:
| Component | Value | Where it comes from |
|---|---|---|
| Invoice unit cost | $11.40 | Supplier invoice, per unit at 200-unit qty break |
| Freight per unit | $0.95 | Shipment invoice $190 ÷ 200 units |
| Duty per unit | $0.60 | Duty paid at customs ÷ 200 units |
| True landed cost | $12.95 | Sum |
| Shopify Cost per item | $11.40 | Invoice cost only |
Retail at $39.00. Shopify's profit report says gross margin is (39 − 11.40) ÷ 39 = 70.8%. On landed cost it's (39 − 12.95) ÷ 39 = 66.8%. Four points of margin that exist only in the spreadsheet — and a reorder decision that looks better in Shopify than it is on your bank statement.
The maintenance routine that keeps this honest, for a 100–1,000 SKU catalog:
- One row per variant: SKU, supplier, invoice unit cost, freight per unit, duty per unit, landed total, date last updated, PO number.
- Update landed cost once per PO cycle, when the shipment's real freight and duty are known — not at reorder time from stale numbers.
- Sync the Shopify cost field on the same schedule (the product CSV import can carry the
Cost per itemcolumn in bulk). Shopify's number stays "invoice cost"; your spreadsheet stays "truth"; you know which one each report is using. - When a supplier changes price, update the spreadsheet immediately and the Shopify field at the same import — the drift between the two is how margins quietly erode for a quarter.
If your costs have drifted for months and you want the profit picture recomputed properly, Shopify's own docs point to reporting apps or external accounting for dynamic costing — the inventory cost-tracking guide covers that app landscape, and the inventory reports guide maps what the native analytics can and can't answer.
Common questions
Where do I enter COGS in Shopify? In the Price section of each product, in the Cost per item field — it must be entered per variant, not per product. Shopify Help Center, as of October 2026. Enter what you paid the manufacturer, excluding taxes and shipping; profit reports only populate for sales made after the cost was recorded.
Why is my Shopify profit report missing orders? Profit is reported only for variants that had a cost recorded at the time of sale. Orders sold before you filled in Cost per item are excluded from Gross profit by product and variant. Backfill costs and the reports start filling in for sales going forward, not retroactively.
Does Shopify cost per item include shipping? No. Shopify's guidance is to record the manufacturer's price excluding taxes, shipping, and other costs. For imported goods, add freight and duty in a separate landed-cost calculation — otherwise your reported margin overstates reality by whatever freight adds per unit.
Does Shopify have a COGS report? Yes — the Profit Margin report category in Analytics includes Gross profit by product, by variant, by POS location, and Profit margin by order, all built from the cost per item field (as of October 2026). There's no separate "COGS ledger"; the cost column in those reports is your COGS per unit sold.
Does changing cost per item affect past orders? No. Past orders keep the cost recorded when they sold, so profit history stays stable. Current profit reports use the current field value, which is why a stale cost silently overstates margin until you update it — worth putting the update on your PO-receiving routine.
Next step: open your Profit Margin reports today and check what's actually populated. If Gross profit by product is mostly blank or the margin column looks suspiciously good, you've found the two costs worth fixing this week — backfill the variants missing costs, and start a landed-cost column for anything you import.