Counting

Shopify inventory not matching the shelf? 9 causes and checks

Shopify and your shelf disagree for a short list of reasons. Nine causes, a check for each, and a 15 minute routine to run on one product.

The Binly team10 min read
Two stacks of sealed cardboard boxes on a table, four high on the left and three on the right with a magnifying glass resting on top, and a blank white card standing between them
In this article

Shopify and your shelf disagree for one of three reasons. Stock moved without a record. A record landed in the wrong place. Or a count was applied the wrong way. Below are nine concrete causes inside those three, a check for each, and a 15 minute routine for one product.

Read the numbers first. Many apparent mismatches are two different numbers set side by side.

Read the numbers right first#

Shopify splits the quantity at a location into states. Its help center page on inventory states defines them like this:

  • Available is what you can still sell.
  • Committed is set aside for orders you have not fulfilled, plus draft orders and transfers marked ready to ship.
  • Unavailable is held for reasons like damage, quality control or safety stock.
  • On hand is every unit at the location: committed plus unavailable plus available.
  • Incoming is on its way from a transfer or purchase order. It cannot be sold until it is received.

Now the example. Say a product shows 14 available, 3 committed and 2 unavailable at your shop.

On hand = 3 + 2 + 14 = 19

Physically you have 14 units on the shelf, 3 packed orders waiting at the pack station, and 2 chipped units in the damaged bin. What you compare with what decides whether the numbers agree.

Same stock, three comparisons. Only one of the three is wrong.
You countYou getCompare withResult
The shelf only14On hand (19)"5 missing", which is false
The shelf only14Available (14)Match
Everything in the building19On hand (19)Match

Different screens and tools can show different states, so it is easy to compare the wrong pair. Before you hunt for a cause, write down which state you are comparing and what you counted.

Which way is the gap?#

Gap means counted minus Shopify. A gap of minus 6 means the shelf has 6 fewer than Shopify says. The sign narrows the search.

A starting point, not a verdict. Several causes can sit behind one gap.
GapShopify isLook first at
NegativeToo highDamaged or lost stock, bundle parts, stock carried to another location
PositiveToo lowDeliveries not booked, returns not restocked
EitherWrong in both directionsManual edits, apps, barcodes, counts applied by overwrite

Nine causes, with a check for each#

1. A delivery was not booked, or was booked wrong#

Shopify ends up too low. A box is opened, shelved and sold, and nobody added it in Shopify. Or someone booked cartons as units: 4 cartons of 12 entered as 4.

4 cartons x 12 units = 48 units arrived. 4 were booked. Gap = 48 - 4 = 44.

Check: take your last three packing slips. For each one, find the matching increase in the variant's inventory history on that date. A missing increase, or one that is far too small, is your answer.

2. A return was never restocked#

Shopify too low again. When you refund an order, Shopify's refund screen has a restock option. Per Shopify's refund help page, it is selected by default and available only when you track inventory for the items. It is easy to untick it while you wait to inspect the goods, and then the unit never comes back on paper. A swap handled outside Shopify never restocks anything.

Check: list last month's refunds. For each returned unit that went back on the shelf, look for a matching increase in the history.

3. Damaged or lost stock was never adjusted#

Shopify too high. The cracked mug goes in the bin and Shopify still counts it as sellable. Shopify has a place for this: unavailable stock is held for reasons like damage.

Check: look in your damaged bin and returns pile. Every unit there that Shopify does not show as unavailable is part of the gap.

4. Stock was carried to another location without a transfer#

Either direction at each location, and the two cancel. You carry 10 units from the back room to the shop floor. Shopify still shows them in the back room.

Check: add the counts of both locations for the product. If the back room is 10 low and the shop is 10 high, the total is right and only the places are wrong.

-10 + 10 = 0

5. Someone edited the quantity by hand#

Either direction. A person types 40 where they meant 4, or edits on hand to make a report look right. Some edits are honest and still wrong.

Check: open the variant's adjustment history. Shopify's changelog says the table on product and variant pages covers 180 days. Look for round numbers and for changes with no order or delivery behind them.

6. An app or sales channel is writing quantities#

Either direction. Anything with permission to write stock can overwrite your numbers or lag behind them: a marketplace connector, a warehouse app, a second store.

Check: make a list of every installed app that touches stock. Then look for changes in the history that arrive in a pattern, such as every night at the same hour. A pattern means a machine.

7. A bundle did not take its parts#

Shopify too high on the parts. A bundle sells as one product. Whether the parts leave stock depends on how the bundle was built. If it is a separate product with its own quantity, the parts never move.

Check: compare sales with movement. Say you sold 20 bundles of 3 mugs.

20 bundles x 3 mugs = 60 mugs should have left stock.

If the mug quantity fell by 5, the bundle is not drawing from it.

8. A barcode points to the wrong thing, or to nothing#

Either direction. Two variants can carry the same barcode, so every scan lands on the first one. Another trap is a code that only looks like a barcode.

Say a shop numbered its products 10000001, 10000002 and so on, and printed them as eight-digit barcodes. Eight digits looks like EAN-8. EAN-8 has a check digit as its last digit. To test one, weight the first seven digits 3, 1, 3, 1, 3, 1, 3, add them up, and take the number that brings the sum to the next multiple of ten.

1 0 0 0 0 0 0   x   3 1 3 1 3 1 3
3 + 0 + 0 + 0 + 0 + 0 + 0 = 3
Check digit = 10 - 3 = 7

A real code that starts 1000000 would end in 7. These end in 1, so a scanner that checks the digit treats them as misreads, and the shelf and the system never get matched.

Check: export your variants to a spreadsheet and sort the barcode column. Duplicates sit next to each other. Then scan three products from the shelf and look at what comes up. If your products have no real barcodes yet, our page on barcode labels covers making them.

9. A count was applied as a total#

Either direction. If a count writes your counted number as the new quantity, any sale or delivery that happened after you counted is wiped out. Count 10 where Shopify said 12, sell 2, apply the next morning. The tool writes 10. The shelf holds 8, and Shopify is 2 too high.

Check: find your last count in the history. Look at the time of the count and the time it was applied. Any order between those two times may have been erased. Our article on counting while the store keeps selling shows how to apply a count so those orders survive.

A 15 minute check on one product#

Pick the product that annoys you most. Then:

  1. Two minutes. Open the variant. Write down on hand, available, committed and unavailable for one location.
  2. Three minutes. Count the units in the building: shelf, packed orders, damaged bin. Match what you count with the right state, as in the table above.
  3. Two minutes. Work out the gap: counted minus on hand.
  4. Four minutes. Open the adjustment history. For each entry since your last count, find the event behind it: a slip, a refund, an order. Mark entries with no event.
  5. Two minutes. Check the other locations for the product, and check its barcode for duplicates.
  6. Two minutes. Write down the gap, what you explained, and what is left.

That is 2 + 3 + 2 + 4 + 2 + 2 = 15 minutes.

Here is how it can end. Shopify shows 30 on hand and you count 24.

Gap = 24 - 30 = -6

The history looks normal. The damaged bin holds 4 units nobody adjusted, which explains 4 of the 6. Two are left.

6 - 4 = 2 units unexplained

Do not force an answer for the last two. Write them down, adjust, and count the line again next week. If it is off again, you have a pattern to chase. If not, you had noise.

Some gaps are timing, not loss#

A gap is not always a loss. You count at 10:40 and an order comes in at 10:41. A transfer is on a truck, so the units sit on neither shelf. Shopify treats them as incoming at the destination, and incoming units cannot be sold until they are received. A sync lags by minutes.

How do you tell timing from loss? Recount the same line the next day. A gap that closed or moved was timing. A gap that sits still is stock.

So skip the one and two unit gaps on a busy day. Chase the gaps that repeat.

Three habits that stop drift#

Book every delivery on the day it arrives, before the units go on a shelf. This one habit removes the biggest cause on the list.

Keep a single bin for returns and a single bin for damaged goods, and empty both into Shopify at the end of each day.

Write a reason next to every manual edit, even if it is only a line in a shared note.

What to count first, and when to count again#

Count the back room before the shop floor, because that is where deliveries wait before anyone books them. After that, count your best sellers, then the products with the biggest gaps in your last check.

Count a line again when its gap repeats, when it goes negative, or after a transfer. Our guide to counting stock in Shopify has the full routine, and the plan for counting in slices is in the article on a cycle count schedule.

Pick one product today, run the 15 minute check, and keep the note. You now have a first number to compare against next month.

Frequently asked questions#

Why does Shopify show different stock than I have on the shelf?

Stock moved without a record, a record landed in the wrong place, or a count was applied the wrong way. Compare like with like first: Shopify's on hand number includes units in unfulfilled orders and units set aside as unavailable. Then work through the causes below, starting with receiving and returns.

What is the difference between available and on hand in Shopify?

On hand is every unit at a location. Shopify's help center defines it as committed plus unavailable plus available. Available is the part you can still sell, which leaves out units in unfulfilled orders and units set aside.

Why does my stock number include units I already sold?

Units in orders you have not fulfilled yet are committed, and committed units are part of on hand. They are sold but still in your building, so a number built from on hand counts them. Available leaves them out.

How far back can I see inventory changes in Shopify?

Shopify's changelog says the inventory adjustment history table on product and variant pages covers 180 days. It was extended from 90 days on 8 November 2024. For an older gap, you need your own records, such as supplier packing slips.