Supply chain
Inventory discrepancies: where they come from and how to catch them
An inventory discrepancy is any gap between the units your systems say you have and the units on the shelf. Small gaps turn into oversold orders, reorders for stock you already own, and a month-end inventory number your accountant can't tie out.
First, agree on which number
A lot of apparent discrepancies are two people reading different numbers. Shopify splits inventory into states:
- Available: units you can sell.
- Committed: units set aside for unfulfilled orders, draft order reservations, and transfers marked ready to ship.
- Unavailable: units on site but not for sale, such as damaged stock, quality control holds, safety stock, or units held by apps.
- Incoming: units on the way that become available when received.
- On hand: everything at the location, which is available plus committed plus unavailable.
Your 3PL's count is physical, so compare it with on hand, not available. From October 1, 2026, Shopify's inventory reports measure stock by on hand instead of available, so reports from before and after that date won't line up exactly.
Where discrepancies come from
Receiving errors
The supplier shipped 480 and the PO said 500, or a carton of the medium went in as large. In Shopify, receiving happens on the inventory transfer linked to the purchase order, where you accept, reject, or cancel each line. Accepted units become available. Rejected units are logged but never become available. If the warehouse counts one number and someone accepts the PO quantity in Shopify, the gap is there from day one.
3PL sync
If your 3PL pushes inventory levels to Shopify on a schedule, the two systems disagree between syncs, and if a sync fails quietly they keep disagreeing. Watch for SKUs that exist in one system and not the other, SKU codes that changed in one place only, and units the 3PL holds in a quarantine or damaged status that it doesn't report to Shopify at all.
Bundles and kits
With Shopify's bundles, the number of bundles you can sell comes from the component with the lowest stock, divided by how many the bundle needs and rounded down. Components that aren't tracked, or that are set to continue selling when out of stock, are left out of that calculation, so a bundle can show as available when a component isn't. Kits assembled at the 3PL are worse: if the 3PL builds 100 kits and nobody records the components consumed, the components are overstated by 100 each.
Returns
When you refund an order in the Shopify admin, the restock option is selected by default for tracked items. That puts returned units back into stock before anyone has checked them. A damaged return restocked as sellable becomes a phantom unit that the next customer orders.
Oversells
Products set to continue selling when out of stock keep taking orders after available reaches zero, and that setting doesn't apply to Shopify POS orders, where staff can sell below zero. Negative available is a discrepancy you can see. The ones to worry about are oversells caused by stock that was never there.
Shrink
Theft, loss, damage in the warehouse, and samples pulled for content or influencers without a record. Shopify lets you tag manual adjustments with a reason such as theft or loss, so shrink shows up in the adjustment history under its own name.
Cycle counting
A full physical count once a year finds discrepancies months after they happened. Cycle counting checks a slice of the catalog every week, so the whole catalog gets counted over time and errors surface while someone can still trace them.
- Rank SKUs by importance. Shopify's ABC product analysis grades variants by their share of revenue over the last 28 days: A for the variants making up the first 80%, B for the next 15%, C for the last 5%.
- Count A items most often, B less often, and C least. Set the frequency by how often a miscount on that SKU costs you a sale or a wrong reorder.
- Also count any SKU that just had a receiving problem, went negative, or had a large manual adjustment.
- Count by zone or bin, so each count is a closed area rather than scattered SKUs.
- Recount before you adjust. Shopify's own guidance is to recount any variant with a variance above 5%.
If you run stores on Shopify POS, POS Pro lets you create a stock count in the admin and have staff count in the POS app, and a quick count session covers up to 1,000 variants, which suits counting one zone at a time. If a 3PL holds your stock, ask for its cycle count schedule and the variance report from each count.
Reconciling Shopify, the 3PL, and accounting
Three records should agree: Shopify's on hand, the 3PL's physical count, and the inventory value on your balance sheet.
- Shopify against the 3PL: compare on hand by SKU and location, at the same timestamp, weekly at least. List every SKU where they differ and the size of the gap.
- Explain each gap with the adjustment history. Shopify's history shows who or what changed each quantity, the staff member, app, or sales channel, and the reason recorded. It covers the last 180 days per variant; the Inventory adjustment changes report goes further back.
- Watch for paired gaps. Shopify notes that a positive variance at one location and a negative one at another often means a transfer nobody recorded.
- Shopify against the books: the Month-end inventory value report multiplies cost per item by the ending quantity for each variant. Compare its total with the inventory balance in your accounting system each month. A gap here points to wrong unit costs or quantity errors that never got written off.
Decide in advance which system wins for each field. Usually the 3PL's count wins for quantity after a recount, Shopify wins for what was sold, and accounting wins for cost.
The inventory aging report
An inventory aging report groups stock by how long it has been sitting, usually in buckets such as 0 to 30, 31 to 90, 91 to 180, and over 180 days. It's where slow movers and dead stock show up, and dead stock can be where an old discrepancy is hiding: units the system says exist that nobody has been able to sell.
Shopify's default inventory reports don't include an aging report. The closest is Inventory remaining per product, which divides ending quantity by average daily sales over the last 28 days. That measures how long stock will last at the current rate, which is useful but different from how old it is. To build a real aging report:
- Export receipts by SKU with their received dates from your purchase order transfers or your 3PL.
- Assume first in, first out: today's on hand is made up of the most recent receipts.
- Walk back through receipts until you've accounted for on hand, and bucket each layer by days since receipt.
- Multiply by cost per item to get the value in each bucket.
- Flag every SKU with stock older than 180 days, and every SKU with no sales in 90 days, and count those first.
Shopify's historical data for inventory metrics only goes back to October 1, 2023, so for older stock you'll need receiving records from the 3PL or your purchase orders.
Automated checks worth running
Most of the above can run as checks without anyone opening a spreadsheet. A useful set:
- Daily, compare Shopify on hand with the 3PL by SKU and send a list of mismatches above a threshold.
- Alert on any variant whose available quantity goes negative. Shopify Flow's Inventory quantity changed trigger can start that workflow.
- On every receipt, compare accepted quantities with the purchase order and flag lines that differ.
- Flag manual adjustments above a set number of units, and any adjustment made without a reason.
- For each bundle, check that every component is tracked and none is set to continue selling.
- Weekly, list refunds that restocked items and compare them with what the 3PL actually put back into sellable stock.
- Monthly, compare the Month-end inventory value total with the balance sheet.
Accurate counts are the input everything else depends on. The inventory forecasting template and automated purchase orders both reorder from on hand, so a wrong count turns directly into a wrong order.
Questions
What is an inventory discrepancy?
A difference between the inventory a system records and the inventory physically there, or between two systems that should agree, such as Shopify and your 3PL.
What causes inventory discrepancies?
Most come from receiving errors, delayed or failed syncs with a 3PL, bundles and kits that don't deduct components correctly, returns restocked before inspection, oversells, and unrecorded shrink.
What is an inventory aging report?
A report that groups stock by how long it has been held, usually in day buckets, with the value in each. It shows slow-moving and dead stock.
Does Shopify have an inventory aging report?
Not among its default inventory reports. You can build one from receiving dates and on-hand quantities, or use the Inventory remaining per product report as a rough proxy for slow movers.
Sources: Shopify Help Center pages on inventory states, adjustment history, inventory reports, planning an inventory count, receiving purchase orders, bundle inventory, refunds, selling when out of stock, and the Flow Inventory quantity changed trigger. Checked October 2026.