July 31, 2026
How to Track COGS in Shopify (and Why the Cost Per Item Field Is Not Enough)
Shopify's cost per item field is a static snapshot that quietly breaks your margins the moment supplier prices change. Here is how to track true cost of goods sold on Shopify.
Johny | Shopsterra
How to Track COGS in Shopify (and Why the Cost Per Item Field Is Not Enough)
Shopify has a field called cost per item. You fill it in on the product page, and Shopify uses it to show gross profit and margin in your reports. It looks like a complete COGS solution. It is not, and the ways it falls short are exactly the ways that quietly distort your margins.
What the cost per item field actually does
When you enter a cost per item, Shopify stores that value and uses it to calculate profit on every order containing that product. Two things about how it works matter more than most store owners realize.
First, it is a single flat number per variant. There is no room for the different components that make up your real landed cost. Second, and this is the one that causes the most damage, it is applied at the moment of the order and it does not create a historical record tied to what you actually paid at that time.
The static snapshot problem
Here is the scenario that breaks it. In January your supplier charges you $8 per unit. You enter $8 in the cost per item field. Your margins calculate correctly.
In March your supplier raises the price to $11. You update the field to $11. Shopify now uses $11 for all future orders. But it also recalculates your January and February profit using $11, because it only ever knows the current value. Your historical margins are now wrong, and they are wrong in the direction that makes past performance look worse than it was.
The reverse happens too. If your cost dropped and you updated the field, your historical margins suddenly look better than they were. Either way, the moment your costs change, your historical profit data becomes fiction. For a store doing any real volume, supplier prices move constantly, and every change silently corrupts the record behind it.
What most people leave out of the cost
Even setting the historical problem aside, the number people enter is usually incomplete. The cost per item field gets filled with the supplier invoice price and nothing else. But the true landed cost of getting a unit into your warehouse and ready to sell includes more than the invoice.
Inbound freight is the big one. If you import from overseas, the shipping and freight to get product to your warehouse can add 10 to 25 percent to the unit cost. Duties and customs charges add more. If your products need any prep, kitting, or repackaging before they ship, that is a per-unit cost too. Payment terms and currency conversion on international supplier payments quietly add a few percent that never shows up anywhere.
A unit that costs $8 on the invoice can easily cost $10.50 landed. If you enter $8, every margin Shopify shows you is inflated by the difference. On a $30 product that is the gap between a 73 percent gross margin and a 65 percent one, and that error compounds across every order and every report you look at.
How to track COGS properly
The goal is a fully landed cost per SKU that stays accurate over time. Here is the structure.
Start by building the real landed cost for each SKU. Take the supplier invoice price, then add inbound freight allocated per unit, duties and customs per unit, prep or handling per unit, and any currency or payment cost. That sum is your true cost per unit, not the invoice price.
Then handle the time dimension. When your cost changes, you want the old cost to stay attached to the orders that happened while it was in effect, and the new cost to apply going forward. Shopify's field cannot do this. The workaround is to keep a dated cost table outside Shopify: SKU, cost, effective from date. When you calculate historical margins, you match each order to the cost that was in effect on its order date, not to today's cost.
For a small catalog this can live in a spreadsheet. You export orders with their dates, keep a second sheet of dated costs per SKU, and use a lookup to attach the correct cost to each order based on when it happened. It works, but it needs maintaining every time a cost changes, and it gets heavy fast once you pass a few dozen SKUs or a few hundred orders a month.
Why this matters for the decisions you make
COGS is not a bookkeeping detail. It is the number that decides which products you scale and which you cut. If your landed cost is understated, a product looks more profitable than it is, and you pour ad spend into scaling something with a thinner real margin than your reports show. If your historical margins shift every time you update a cost, you cannot trust any trend you see, which means you cannot tell whether a product is getting more or less profitable over time.
The stores that get this right treat COGS as a living, dated dataset per SKU, fully landed, matched to orders by date. The stores that get it wrong use the Shopify field, enter the invoice price, and update it whenever they remember, and then wonder why their profit never matches their bank account.
Making it automatic
Maintaining a dated landed-cost table by hand works until it does not. Once you have real order volume and costs that move, the spreadsheet becomes its own part-time job, and a single missed update quietly poisons your margin data.
Shopsterra handles the landed cost per SKU and keeps historical accuracy intact, so when a cost changes it applies going forward without rewriting your past margins. It combines that with your ad spend, fees, shipping, and refunds to show real net profit per product, not just gross margin on an invoice price. You set your true landed costs once and the profit numbers stay honest as your costs move.
If you want to see your real margins per product with COGS handled correctly, connect your store at shopsterra.com/register. Free during beta, no credit card, about 5 minutes to connect.