Why stock counts don't match, and how to find the cause
A stock count doesn't match your records when something moved and the record didn't follow, or followed late, in another unit or under another code. The common causes of inventory discrepancies are timing gaps, unrecorded returns and damage, duplicate item codes, case-versus-unit mix-ups, transfers recorded on one side only, counting while stock moves, and shrinkage. Find the cause before you overwrite a balance, or the same gap can reopen at the next count.
The sample count in this guide
The business, people and figures here are invented sample data. Fernhollow Café Supply, a made-up wholesaler in Oakland, California, keeps cups, lids, milk and coffee in a main store and a delivery van. Cups and lids are recorded in sleeves of 50, and a case holds 20 sleeves. Oat milk is recorded in cartons, 12 to a case.
Five lines from the September 10 count at the main store:
| Code | Item (unit) | Record | Counted | Difference |
|---|---|---|---|---|
| CUP-12 | 12 oz cups (sleeve) | 240 | 228 | −12 |
| LID-12 | 12 oz lids (sleeve) | 140 | 7 | −133 |
| OAT-1L | Oat milk 1 L (carton) | 96 | 108 | +12 |
| BEAN-1K | Espresso beans 1 kg (bag) | 40 | 52 | +12 |
| ESP-1KG | Espresso beans 1 kg (bag) | 12 | 0 | −12 |
What an inventory discrepancy is, and how to measure one
An inventory discrepancy is the gap between the recorded quantity and the counted quantity at one moment. A count taken while someone picks from the same bay compares a moving shelf with a record that hasn't caught up.
Three numbers describe a count, and each tells a different story:
- Line accuracy is lines that match exactly, divided by lines counted. Score it strictly: a line off by one sleeve is wrong. If Fernhollow counts 500 lines and 470 match, line accuracy is 94.0%.
- Net value variance adds every difference at cost, so overs cancel unders. At $4.00 a sleeve of cups, $3.50 a carton of oat milk and $18.00 a bag of beans, CUP-12 (−$48), OAT-1L (+$42) and the two bean lines (+$216 and −$216) net to −$6.
- Absolute value variance adds the same differences as positive amounts: $522 for those four lines. Divide it by total stock value to compare one count with the next.
Net says the count was six dollars out. Absolute says the records missed the shelf by $522 in both directions. Report both, and recount obvious outliers like LID-12 before you add them in.
Set tolerance bands yourself, by class of item. A band decides what you investigate, not what the strict score counts as a match. You might investigate any difference on serial-numbered espresso grinders but accept one sleeve either way on cups.
Seven common causes, and the sign each one leaves
The size and direction of a difference usually point to its cause. Work through this table before anyone mentions theft:
| Cause | Sign in the count | Check first |
|---|---|---|
| Timing gap | Under by exactly one order, or over by one delivery | Movements dated around the count |
| Unrecorded return, damage or sample | Over by a returned case, or small unders | The returns shelf, the damage bin |
| Duplicate or renamed code | One code over, a similar code under by the same amount | Search by item name, not only by code |
| Case versus unit | Counted figure equals the record divided by the case size | Which unit the counter wrote down |
| Transfer recorded on one side, or not at all | One location off by the moved quantity; if neither side was entered, one under and another over by the same amount | Transfers with only an "out" or an "in" |
| Counting while stock moves | Differences cluster in bays picked during the count | Picks logged inside the count window |
| Shrinkage | Small, irregular unders on items easy to carry off | Other bays for misplaced stock, then losses |
The count itself can be wrong too: a skipped shelf, a pallet counted twice. Have a second person recount every line over tolerance. That separates count errors from record errors.
Trace each difference before you correct it
LID-12, −133. The counter wrote 7. Seven cases of 20 is 140 sleeves, which is the record. Recount in sleeves and change nothing.
CUP-12, −12. A second counter confirms 228. The movement log shows order SO-5540, 10 sleeves, picked from this bay during the count and entered afterwards. The other 2 came from a crushed case, binned unrecorded. Record the damage with its reason.
OAT-1L, +12. Twelve is one case. A café returned an unopened case on September 8, and it went back on the shelf without a return entry. Record the return with the date it arrived.
BEAN-1K +12 and ESP-1KG −12. The same bags sit under two codes. Whoever received the last delivery searched for the supplier's code, ESP-1KG, found nothing and created it as a new item. The bags went onto the BEAN-1K shelf, so the counter counted them there. Merge the codes, keep both histories, and retire ESP-1KG.
Five lines, five causes, nothing unexplained and no balance typed over.
Record movements, not just balances
A balance tells you what the record says. Movements tell you why. Separate opening stock, receipts, dispatches, returns, transfers and adjustments, and give each one an item code, quantity, unit, location, date, person and reference. Keep a count as an observation and any correction as a separate adjustment with a reason code.
The CUP-12 log for the sample period:
| Date | Movement | Location | Sleeves | By | Reference |
|---|---|---|---|---|---|
| Aug 27 | Count | Main store | 200 | Lucia Romero | C-36 |
| Sep 2 | Receipt, 3 cases | Main store | +60 | Dev Patel | PO-2291 |
| Sep 4 | Transfer out | Main store | −20 | Lucia Romero | T-118 |
| Sep 4 | Transfer in | Van 2 | +20 | Dev Patel | T-118 |
| Sep 10 | Dispatch, picked during the count | Main store | −10 | Sam Chen | SO-5540 |
| Sep 10 | Count | Main store | 228 seen | Hannah Okafor | C-37 |
| Sep 10 | Adjustment: damaged | Main store | −2 | Lucia Romero | C-37 |
The out and the in share one reference, T-118, so a transfer with a missing side shows up as open. Van 2 held no cups before T-118, so across the two locations the transfer leaves the CUP-12 total at 260.
Keep a short list of reason codes: damaged, sample, customer return, supplier return, found, count error, unexplained. After a quarter, the share of each code tells you which fix to make first. If most adjustments trace back to timing, you need a count window, not a camera.
Cycle counting vs the annual stocktake
An annual stocktake, a full physical inventory, usually stops movement while everything is counted, and it finds errors months after they happened, when the delivery note is filed and nobody remembers the crushed case.
Cycle counting covers a few lines every working day, so differences surface while the paperwork is recent. ABC classification sets how often each line comes up: rank lines by annual usage value (units used times unit cost), then count A lines most often and C lines least.
Sample arithmetic for Fernhollow's 500 lines:
| Class | Lines | How often | Counts a year |
|---|---|---|---|
| A | 50 | Monthly | 600 |
| B | 150 | Quarterly | 600 |
| C | 300 | Twice a year | 600 |
That makes 1,800 line counts a year, or about seven per working day. Add trigger counts too: count a line whenever its record reaches zero or goes negative. A negative balance is always a record problem, because a shelf can't hold minus three bags.
Reduce discrepancies without extra admin
Each change removes a step, or makes the right step the short one:
- One code per item. Search by name before creating a code, and let one person approve new ones.
- Define each case size once, then check that a count of 7 cases is saved as 140 sleeves.
- Set a count window. Nothing moves in the bay being counted, or every pick in that window is logged.
- Make damage and returns one step: a quantity and a reason, entered at the shelf.
- Count on a phone at the shelf. Typing up a clipboard later adds keying errors.
Test a stock app before you trust it
If you build an app for this, adapt a brief like Fernhollow's:
A stock app for a café supplies wholesaler with two locations, Main store and Van 2. Each item has a code, a base unit and a case size. Every change is a movement with a reference: receipt, dispatch, return, transfer (out and in) or adjustment with a reason code. A count is an observation; a person picks the reason before any difference becomes an adjustment. Warn before a new code is saved under an existing item's name. Warehouse staff and drivers sign in, and only Lucia Romero approves new item codes.
Try each scenario on the first version, then again whenever the app changes:
| Scenario | Do this | Passes when |
|---|---|---|
| Transfer | Move 20 sleeves of CUP-12 to Van 2 | Main store drops 20, Van 2 gains 20, the total holds |
| Cases | Receive 3 cases of CUP-12 | The record rises by 60 sleeves, not 3 |
| Count during a pick | Count a bay, then dispatch 10 sleeves from it | The dispatch appears beside the count difference |
| Reason required | Save a −2 adjustment with no reason | It is refused |
| Duplicate code | Create ESP-1KG with BEAN-1K's name | You are warned before it saves |
| Code approval | Signed in as Sam Chen, add a new item code | It waits for Lucia Romero or is refused |
| Signed out | Visit the app's link without signing in | No stock figures or costs appear |
Attach the delivery note or count sheet to the adjustment it explains. If the app uses Vision to help interpret a supplied delivery note, treat each item and quantity it proposes as a draft, and check it against the carton before the receipt posts. If you add an agent running inside the app, give it one job: compare counts with records, when asked or on a schedule you set, and list the lines over tolerance. Design it so a person posts every adjustment, and test that the agent cannot change a balance.
Saving movements and attachments, signing in staff, and running Vision or an agent inside the app make this an app with data. Putting it live, with its AI, needs a paid plan, and model and service usage is metered separately. Plan details are on the pricing page.
When a stock sheet should become a stock system
A spreadsheet holds stock well for one person, one location and a few hundred lines. Move when several people edit quantities, stock sits in more than one place (vans included), you track batches or expiry dates, or nobody can say who changed a figure and why.
If your stock lives in Excel today, start from the workbook you already count from. That page passes the file and your brief into Studio. The upload is a snapshot, so pick a cutover day, count, and record movements in the app from then on. The column-mapping walkthrough covers codes and lookups. If stock figures arrive as an export from another system, read what goes wrong in CSV exports first. For tools and equipment, where the question is who holds an item rather than how many remain, an asset register fits better.
When your reason codes and test table are ready, plan the inventory tracking app around them.


