Keeping cost per item right when your buying price moves
Shopify holds one cost per variant, it never changes on its own, and your profit reporting uses whatever it said on the day each sale happened. That combination is why margins drift quietly after a price rise — and why the question "who updates cost per item now" has no good native answer since Stocky closed.
Nothing in Shopify updates your cost per item. Not receiving stock, not a price rise from your supplier, not the invoice you just paid. Shopify says both halves of that in two consecutive sentences: "Each product variant has a single static Cost per item field. This cost stays fixed when you receive a purchase order or transfer."
That would be a small annoyance on its own. What makes it worth a page is the second half: your profit reporting uses the cost that was recorded at the moment of each sale.
"Profit is reported only for products and variants that had cost recorded at the time they were sold."
"The Cost per item field contains static data, which means that the data in your profit reports is only relevant to a specific point in time."
So a cost that has gone stale does not produce an error or a blank. It produces a margin figure that looks fine and is wrong, for every sale from the day it went stale — and correcting the number later does not reach back — measured, not assumed (see below).
What Stocky did, and what replaced it
Stocky kept its own weighted average, recalculated every time goods arrived — and wrote it into Shopify's Cost per item only if you switched that syncing on:
"Every time you receive a purchase order, your average unit cost is updated."
Its formula was the ordinary one — old stock at old cost, plus new stock at new cost, divided by the total units — and the new cost in it was the landed cost, freight included. Nothing in Shopify does this now, and Shopify says so rather than implying otherwise:
"For weighted-average costing or landed cost allocation, use a third-party inventory app that integrates with Shopify's product cost data."
That sentence is the whole state of play. There is no setting to turn on.
Buying price moved and nothing updated? Describe what should happen instead →
Three ways to be right, and you have to pick one
Most merchants have never had to name their costing method, because a system was doing it for them. Now it is a decision.
Last price paid. Whatever you most recently paid becomes the cost. Simple, and it moves the whole of your stock's value the moment one delivery arrives at a new price — including the units you bought cheaper last month.
Weighted average. The blended cost of what you actually hold. Steadier, and what most merchants mean when they say "our cost". This is what Stocky kept, and it is arithmetic somebody has to do now: the number depends on the quantity you held and what you paid, which is not knowable from the product page alone.
Landed cost. The unit price plus freight, duty and fees spread across the delivery. The truest number and the most work — and Shopify does hold the pieces, since freight and duty can be added to a shipment after the fact, where the costs are actually known.
And freight added to a delivery does not reach the variant either (its own page). Cost adjustments live on the transfer, where Shopify totals them so you can compare what you agreed to pay with what the goods actually cost to receive. Useful — but it is a comparison on the transfer, not a new unit cost on the product.
What you can do natively
- Edit the field. On the variant, one at a time.
- Change many at once. Cost per item is a column in the product CSV, which is how most merchants handle a supplier's annual price list. (The bulk editor's own Columns menu is worth a look too, though Shopify's help does not list the field among its examples.)
- Let a purchase order remember. When you order from a supplier you have used before, Shopify fills the cost in from your last order with them: "the Supplier SKU, Cost, and Tax values are auto-filled from your previous purchase orders" — and otherwise from the variant's cost.
- Put freight where it belongs. "Shipping costs, customs duties, and other fees often aren't known when you create a purchase order. You can add these as cost adjustments to individual shipments on the linked inventory transfer."
What none of these do is notice that the number has moved. They are all ways for a person to type a better number, faster.
Where it actually hurts
Margin reporting that is quietly wrong. The reports keep working. They just describe a business you do not have.
Stock value. Shopify's month-end inventory value report is cost per item multiplied by the quantity at month end, for products that have a cost — so a stale cost moves the number your accountant is given, and a missing one leaves the product out of it altogether.
Decisions made from both. Which products to promote, what to discount, which lines are carrying the shop — all of it is computed from a field nothing maintains.
And the correction does not travel backwards. Shopify's wording is that cost is recorded at the time of the sale, and its finance report keeps a permanent bucket for sales made without one. What happens to a cost that was wrong rather than missing is not in the help, so we tested it on 15 October 2026: after the cost was edited and the report refreshed, a recorded sale kept its original cost and gross profit. That was one store and a same-day order, not a closed month — the page on cost that was wrong for months has the numbers and a test for your own history.
The worse case: no cost at all
A stale cost gives you a wrong number. A missing cost gives you no number, and that is easier to miss. Shopify states it twice over: "The report only takes into consideration the variants that have product cost information at the time of sale", and "Only Net sales with cost recorded are included in your Cost of goods sold report, and count toward your Gross profit."
So a variant with an empty Cost per item does not appear as zero margin. It quietly leaves the profit report, and everything you conclude from that report is about the part of your business that happened to have the field filled in.
This is worth ten minutes before anything else on this page, and Shopify shows you the size of the blind spot directly: the finance summary carries a figure called net sales without cost recorded. Read that number first. Merchants who imported a catalogue, or who added products through an app, are usually the ones who find something there.
Which route is yours
| Your situation | What to do |
|---|---|
| Prices change once a year | A product CSV when the price list arrives |
| Prices move per delivery, and last price paid is good enough | Type it when you receive, or import after each delivery |
| You need a weighted average like Stocky kept | Not native — an inventory app, or built for you |
| You need freight and duty inside the unit cost | Add the costs to the shipment; the allocation itself is yours |
| You need past months corrected | Nothing in Shopify's reporting offers it — cost is recorded at the time of the sale |
What Shopivibe does
You describe it in your own terms: "whenever I tell the store what a delivery cost, put that cost on the right variants and keep it there."
Two halves to this, and the split is worth being exact about.
We write the number and keep it written. Once a cost is known for a variant, it goes into Shopify's Cost per item — on every variant it applies to, on a schedule if that suits — without a person opening each product.
What you paid still has to reach the store, each delivery. This changed in autumn 2026 and the old answer here was that nothing could read it: since Shopify's October 2026 API version a purchase order's lines can be read, unit cost included — though nothing can create a purchase order in the first place, so this helps only where somebody raised one in the admin. If your prices arrive by email or on an invoice rather than through a Shopify purchase order, nothing has changed for you: the price you were charged arrives one way, as a row you keep in your own admin, one line per delivery or per supplier price. That part no rule removes. What it does remove is the second step — somebody opening each affected variant and typing the number in.
The method is yours to state. Last price paid is a row and a rule. A weighted average or a landed cost also needs what you held and what the freight was, and those arrive on the same rows — a person sets the shape of that up with you, and after that each delivery is one row rather than a spreadsheet.
What this does not do is rewrite history: Shopify's reports keep the cost each sale had when it happened, so the months already reported keep their old answer. From the day it is running, the number stops drifting.
Shopivibe solves the problem in your store and keeps what it adds maintained, including when Shopify changes something underneath. If the app cannot complete your request on the spot, somebody at Shopivibe takes it on straight away and has it working in your store within 24 hours, included in the plan at no extra charge. Shopivibe is free during early access, with 3,500 credits included. Credits beyond the included 3,500 cost $0.06 each.
Know your real cost but not what Shopify thinks it is? Describe how it should be kept →
Checked against Shopify's documentation and the App Store on 20 September 2026.