When inventory is adjusted in Shopify, a reason goes with it. The list is fixed rather than freeform, which is the point: a month later, the reason is the only thing that makes the adjustment history readable.
The reasons, grouped by what they are for
Counting and correcting
correction— an inventory error, or a general adjustment when nothing else fitscycle_count_available— a discrepancy found between the actual quantity and the recorded one. This is the stocktake reason.
Goods moving
received— inventory the merchant receivedmovement_created,movement_updated,movement_received,movement_canceled— a transfer or purchase order at each stage
Units leaving, or held back
damaged— removed because the unit is damagedshrinkage— actual levels are less than recorded, through theft or losspromotion— removed for a promotion or donationquality_control— on hand, but in inspection and not sellablesafety_stock— held back to guard against oversellingreservation_created,reservation_deleted,reservation_updated— units temporarily set aside
Returns
restock— add a returned unit back to available inventory so it can be resold
Everything else
other
Shopify documents the full list under managing inventory quantities and states.
Which ones a small store actually uses
In practice most stores touch six: correction, cycle_count_available after a count, received on new stock, damaged and shrinkage for losses, and restock when a return comes back. The rest belong to transfers and reservations, which smaller catalogues rarely run.
The reason that does not exist
Read the list again with one question in mind: which reason covers more stock on the shelf than the admin says?
shrinkage is explicitly the other direction — actual less than recorded. There is no counterpart for actual more than recorded. That direction has no name in Shopify's vocabulary, so when it turns up it gets logged as a correction, alongside every unrelated typo and fat-fingered count.
This matters because the direction without a name is not rare. It is what a store gets when a refund is issued with the Restock box left unticked: the customer is paid, the unit returns to the stockroom, and the count is never touched. And because inventory was never adjusted, there is not even a correction to find — nothing is written at all until someone notices and corrects it by hand.
So the loss that has no reason code also leaves no row. It is the one kind of inventory problem you cannot audit from the adjustment history, and that is precisely why it persists.
StockReclaim finds these by comparing refunds against the adjustments that answered them, and lists each case with its order, value and age. The headline figure is free; see how the audit works or the plans.