Guides
Nobody Has Updated That Cost Field in Two Years
A unit cost entered at launch never throws an error. It just keeps telling your reports what a product cost the last time anyone checked.
Nothing flags an old cost
The cost field on a product gets filled in once, when the product is created or a catalog is imported. After that, nothing in the normal running of a store asks anyone to look at it again. Orders go through, stock moves, and the number sits where it was left.
It isn't idle, though. Two Shopify reports read Cost per item. Profit reports use it to work out margin on each sale, and the month-end inventory value is calculated as cost per item multiplied by the ending quantity for each variant. Both reports take whatever is in the field at face value. Neither can tell a cost you checked last week from one copied off a supplier quote the day the product went live.
A blank cost fails differently, and worse. Shopify only reports profit for variants that had a cost recorded when they sold, so sales of a variant with no cost simply drop out of the profit report. The report is just quietly smaller than your sales.
What should go into the field in the first place, the unit price plus freight, duty and the rest, is covered in What a Unit Actually Costs: Landed Cost on the PO Line. This post is about what happens to that number after it's entered.
Which cost basis to plan with
At least four different figures can end up in the cost field, and they don't age the same way. Some move on their own as you buy; others stay put until a person changes them.
| Cost | What it reflects | When it changes | Risk if never refreshed |
|---|---|---|---|
| Quoted at setup | The price on the table when the product was created | Only when someone types in a new one | Describes a deal that may no longer exist |
| Standard | A fixed figure you chose on purpose | When you deliberately revise it at a review | The gap to real purchase prices keeps widening unnoticed |
| Weighted average | A blend of every receipt so far | Recalculated on each receipt | Lags a real increase, because older, cheaper receipts dilute it |
| Last paid (from the PO) | What the most recent receipt actually cost | Each time a purchase order is received | Low, as long as the refresh actually happens after each receipt |
Four cost bases and how each one ages between refreshes.
If you keep a standard cost, the gap between what you paid and the standard is the purchase price variance. A large unfavorable variance is often the first sign the standard is out of date.
For planning, last paid is usually the honest choice. The next order will cost roughly what the last one did, not what was quoted when the product was set up. That is a planning decision only. Which costing method your books use is a separate question for your accountant, and nothing here should change it.
How a cost drifts while nobody touches it
Staleness doesn't need anyone to make a mistake. Suppliers raise prices. Freight rates swing. A currency moves against you, a supplier's tax treatment changes, you switch suppliers, or a new minimum order quantity or pack size changes what a unit costs to bring in. Each of these moves the real cost while the field stays exactly where it was.
Shopify records the cost at the time of sale, so correcting the field today fixes reports from today forward. It does not rewrite the margin on orders you've already sold. When prices are rising, the gap widens with every month since the last refresh, and every sale in that stretch keeps the old, higher margin for good. That is the argument for refreshing on a schedule.
gross margin = (price − unit cost) ÷ price
A SKU sells at $40. The cost field says $14, so margin reads as ($40 − $14) ÷ $40 = 65%. The last purchase order landed at $17, which puts real margin at ($40 − $17) ÷ $40 = 57.5%. Margin on that product reads 7.5 percentage points too high, and each unit received on that order is valued $3 below what it cost. (Illustrative numbers.)
Which SKUs to check first
You don't have to audit the whole catalog to remove most of the risk. Work in order of how much is at stake. Start with your highest-revenue SKUs, since a per-unit error there repeats across the most sales. Next come the SKUs with the most stock on hand, because they carry the most weight in inventory value. Then anything whose supplier or currency has changed since its cost was entered. Then every variant with a blank cost, because those are missing from profit reports entirely.
Add one more group: products you haven't reordered in a long time. Their cost may be a quote that has never been tested against a real order.
Assisty's AI Report Builder can produce the first two lists. Ask Atlas for a sales report by product or variant over the last 90 days to rank by revenue, or an inventory levels report to rank by stock on hand. The other three groups are lists you put together yourself. The check is the same for every SKU on any list: find what you last paid, compare it with the field, and update the field if they differ.
Refresh against the last purchase order
Tie the refresh to two triggers. The first is receiving a purchase order, because that is the moment you know what the stock actually cost. The second is a periodic sweep, quarterly being a sensible default, since standard costs are typically reviewed quarterly or annually, to catch products the first trigger misses.
In Assisty, the purchase order you received against carries tax types and landed cost on each line. The landed unit cost on that line is the figure to put in Cost per item. Copying it there is the step this guide is about.
The two triggers cover different products. Refreshing on receipt keeps fast movers current, because they are reordered often. The sweep is for everything else, which is why it is worth running from a list rather than from memory. Adjust the interval to how fast your costs move: if suppliers reprice often or you buy in a foreign currency, check the top of the list more often than once a quarter.
A list that arrives on its own removes the hardest part of starting. Save a sales report by product or variant and schedule it for monthly email delivery. Each month, a revenue-ranked list to start from lands in your inbox, so the quarterly sweep never starts from a blank page.