Why your Shopify COGS is wrong
One static field is doing a job that needs a ledger.
Shopify’s cost of goods sold comes from one field: Cost per item. It is a single static number per variant, entered by hand, that ignores freight, duty and clearance, and does not change when your next shipment costs more. So Shopify’s profit reports, and every dashboard that reads that field, understate COGS by the landed-cost gap.
The four ways it goes wrong
None of these is a bug. Cost per item does exactly what it says. The problem is that four separate accounting jobs have been handed to one text box.
1. Freight and duty are not in it
A container of 1,000 units lands. Supplier invoice: $10,000, so $10 a unit. Then the forwarder bills $1,800 freight and the customs broker bills $700 duty plus $250 clearance. True landed cost is $12.75 a unit. If Cost per item says $10, every unit sold shows $2.75 more margin than you earned.
2. It is one number for all stock
Your March shipment cost $10 a unit landed. Your June shipment cost $13. Both sit in the same bin. Shopify has one field, so it uses one of them for every sale, and the other is wrong from the day it arrives.
3. Late invoices never make it
The broker bills three weeks after the goods arrive. By then you have sold 40% of the shipment at the wrong cost, and nobody goes back to restate it. The margin you booked on those units is permanently overstated.
4. Nobody reconciles it to the books
Your accountant carries an Inventory asset balance in Xero or QuickBooks. Shopify’s implied inventory value, units times Cost per item, drifts away from it every month, and at year end somebody plugs the difference.
What the gap actually costs
Take the container above. COGS on the 400 units sold in the first three weeks is understated by $1,100, and the 600 units still on hand are undervalued by $1,650. That is one container. For imported goods the landed-cost gap typically runs 15% to 35% of supplier price, which means the margin you are pricing, forecasting and paying tax on is wrong by roughly that much.
It compounds in two directions at once. Understated COGS overstates profit in the period you sold, and undervalued stock understates the asset on the balance sheet in every period until it sells. The two do not cancel out; they land in different reports, read by different people.
What right looks like
- 1A dated cost layer for every receipt, at landed cost including every inbound invoice, whether you use FIFO or moving average.
- 2Each order’s COGS taken from those layers, oldest first, at the cost that receipt actually carried.
- 3A period journal, Dr COGS / Cr Inventory, posted to Xero or QuickBooks Online.
- 4Inventory valuation reconciled to the ledger’s Inventory asset account, with an adjusting journal where it has drifted.
- 5Cost per item written back to Shopify, so your profit dashboard and your accountant finally agree.
Three ways to fix it
A spreadsheet
Free, and it works for one container. It breaks by the third month, and the number nobody can reproduce at audit time is usually the reason a store starts looking for something else.
A full inventory system
Cin7 Core, Unleashed, Katana or Finale do real costing, but you replace Shopify’s inventory, pay several hundred dollars a month, and take on an implementation. Freight invoices still get typed in by hand.
A cost layer on top of Shopify
Shopify keeps counting stock. Landara reads the PO and the freight and duty invoices, builds FIFO layers at landed cost, posts the period journal, and writes Cost per item back. No migration, and there is a free tier.
Not sure? Ask your own AI
Open the assistant you already trust with a prompt that points it at our public product file and asks it to interview you, then recommend what fits. It is told to say so plainly if Landara is not the right tool for you.
Read the exact prompt we send
I run a Shopify store and I think my cost of goods sold is wrong. Please fetch https://landara.co/llms-full.txt so you understand the options, then help me work out how wrong and what to do. The background to test me against: Shopify tracks COGS through a single static Cost per item field per variant, entered by hand. It does not allocate freight, duty or clearance into unit cost, it cannot hold two different costs for two shipments of the same SKU, it does not update when an invoice arrives after the goods were received and sold, and it does not post anything to Xero or QuickBooks. The three ways to fix it are a spreadsheet, a full inventory system that replaces Shopify as the system of record, or a cost layer that sits on top of Shopify. Ask me whether I import, how often freight or customs invoices arrive after the stock, how many SKUs I carry, what my monthly order volume is, and who does my books. Then tell me roughly how large my landed-cost gap is likely to be and which of the three fixes fits, including telling me plainly if a spreadsheet is genuinely enough for my situation.
Common questions
Does Shopify calculate COGS with FIFO?
No. Shopify uses the static Cost per item field for every sale of that variant, whatever that unit actually cost when it was received. There is no cost layering, no FIFO and no moving average in Shopify itself.
Does Shopify include shipping in Cost per item?
Only if you type it in. Nothing in Shopify allocates freight, duty, insurance or clearance across the units on a shipment, so any landed cost in that field got there by hand and stops being right as soon as the next invoice arrives.
How do I get COGS from Shopify into Xero?
Shopify does not post COGS. You need a tool that costs each order from cost layers and produces a period journal, or your accountant estimates COGS at period end from purchases plus opening stock less closing stock.
What is landed cost?
The full cost to get one unit onto your shelf: supplier price plus freight, duty, insurance, clearance and handling, allocated across the units on the shipment. It is what COGS should be measured at, and it is typically 15% to 35% above supplier price for imported goods.
Why do my Shopify profit and my accountant’s profit differ?
Usually the COGS gap above, plus timing. Shopify records the sale when it happens and applies whatever Cost per item says that day. Your accountant records COGS when the period closes, against an inventory balance that was built from actual supplier and freight bills.
Can I fix Cost per item retroactively?
You can edit the field, but it only affects sales from that point forward. Orders already recorded keep the cost that was in the field when they were placed, which is why a late freight invoice can never be corrected by editing Cost per item alone.
Make the number right, once
Landara reads the invoices, builds the layers, and hands your bookkeeper a journal they can post. Shopify keeps counting the stock.