InsightStock control

Cycle counting: how to find a stock error in weeks, not months

Your stocktake came back wrong and nobody can say why. Counting a few lines at a time, all year, is how you get an answer while the pallet is still remembered.

Marz Allan · Co-founder · Scale2026-10-148 min read
TL;DR
  • A cycle count is a small scheduled count of a few lines run while the warehouse keeps shipping, so a wrong number surfaces within weeks of the mistake instead of eleven months after it.
  • When the count disagrees with the system, the count wins. The stock is what is on the shelf; the system is a claim about the stock.
  • A stock adjustment is worth something later only if it carries the item, the site, the quantity in the unit stock is held in, a reason code from a closed list, the counter's name and the time. It must never be a silent edit of the on-hand figure.
  • One correction tells you nothing. A hundred of them, sorted by reason code, by site and by person, tell you where the process leaks.
  • An external auditor is not testing whether your stock figure is right to the pack. They are testing whether it can be supported.

Why does the warehouse keep a second stock list?

Somewhere in most Cambodian warehouses there is a notebook, or a spreadsheet on one person's laptop, recording what is actually on the racks. It is kept because the system has been wrong before and nobody could say why. An inventory management system has done its job on the day that notebook is closed and nobody feels any need to open it again.

The symptom is specific enough to name. A physical count disagrees with the screen. It is found at month end, when someone finally has to value the stock, and it is settled the only way it can be settled under time pressure: believe the count, edit the system to match, move on.

Nobody records why the two differed. The next count then starts from a figure that was typed rather than earned, the gap comes back, and after two or three rounds of that the warehouse stops treating the screen as evidence at all. The notebook is not laziness. It is a rational response to a number nobody can account for.

For one record to be worth trusting, the system has to be able to say where every number came from. That means each movement is a row of its own: a receipt, a transfer, a pick, an adjustment, each carrying who did it and when. On-hand is not a field anyone sets; it is the sum of the rows.

Nothing is edited in place. A mistake is corrected by posting a counter-movement that names the person correcting it and the reason, so the correction joins the history instead of replacing it. A stock figure that can be typed over will be typed over, and the second list exists because someone on the floor worked that out years ago.

Which leads to the question most owners are really asking: an ERP, or just inventory software? The split is about which number is failing you.

Take one order of 200 packs through the eight stations it passes: purchase order, shipment, goods receipt, put-away, pick, pack, dispatch, invoice. Four of them write a row in the stock ledger.

The goods receipt adds 200 packs on hand; put-away moves them from one bin to another for no net change; the pick moves them from on hand to allocated; the dispatch takes them out and recognises the cost of goods sold. The other four write nothing at all, and two of those are the documents management actually looks at.

Between the purchase order and the goods receipt the stock is on order: paid for, and not countable. Between the pick and the dispatch it is allocated: countable, and not sellable. Most arguments about stock figures are really arguments about which of those two states somebody was looking at.

Scale Inventory is how we build that record: purpose-built, against the way you move stock, because that is usually where a distributor competes. Whether a build is worth it for your operation is a discovery question rather than a sales one, and the comparison at the end of Moving stock off a spreadsheet sets out what separates it from a spreadsheet and a packaged WMS.

  • If the stock number and the money number disagree and month end is where you find out, the problem is the ledger, not the counting. A stock module inside one ledger is the fix, and how one ledger carries purchasing, inventory, sales and accounting sets out what that means structurally.
  • If the books already close cleanly and the failure is physical (several sites, goods moving between them, counts done on the floor by people who never open the accounting system), a standalone stock system is enough, and it is the cheaper of the two by a wide margin.
  • If you are actually replacing three systems and the spreadsheets between them, this is the smaller half of that decision. What an ERP replaces in a Cambodian business is the page to read before scoping anything here.
  • If the pain starts before the stock arrives (supplier lead times, what a container really cost by the time it cleared), that is the buy side, and it is covered in purchase orders, landed cost and goods receipt.
PHYSICAL AND DOCUMENTPurchase orderno rowShipmentno rowGoods receipt+200 on handPut-awaybin → binPickon hand → allocatedPackno rowDispatch−200 · COGSInvoiceno rowWHAT THE STOCK LEDGER SAYSTHE GAP BETWEEN THE TWOOn orderpaid for, not countableAllocatedcountable, not sellableone order · 200 packs · four rows written, four documents that write none
PHYSICAL AND DOCUMENTPurchase orderno rowShipmentno rowGoods receipt+200 on handPut-awaybin → binPickon hand → allocatedPackno rowDispatch−200 · COGSInvoiceno rowWHAT THE STOCK LEDGER SAYSTHE GAP BETWEEN THE TWOOn orderpaid for, not countableAllocatedcountable, not sellableone order · 200 packs · four rows written, four documents that write none
fig. 01 · the eight stations of one order, and the four that write a stock row

A stocktake that comes back wrong is rarely one mistake. It is a year of small ones arriving together, and by the time you are looking at the number, the receipts, picks, transfers and returns that caused it are most of a year behind you. The alternative is counting a few lines at a time, all year, so that the difference is small enough to trace while somebody still remembers the pallet.

What is a cycle count, and why does it beat the annual shutdown?

A cycle count is a small, scheduled count of a few lines while the warehouse keeps shipping. It beats the annual shutdown because an error surfaces within weeks of the mistake, not eleven months after it.

The annual shutdown has one advantage: it is simple to organise. Everything else about it is bad. You lose two days of shipping, you count with people who do not count for a living, and when the number comes back wrong you are looking at a difference that built up across twelve months of receipts, picks, transfers and returns. There is no way to trace it, so it gets posted as one large correction and the cause is never found. The following year it happens again, usually in the same direction, and by then the correction has become a line item people expect.

A cycle count is the opposite shape. On an ordinary Tuesday at Phnom Penh · Node 3, one person is given a short list of locations, counts what is in them, and enters what they found. The site is not frozen. The lines being counted are locked for the few minutes the count takes, or the count is timestamped and reconciled against the movements posted while it was open, and the rest of the warehouse ships as normal. Spread across a quarter, the counts reach the same shelves the shutdown reaches without costing you the two days, and every one of them lands close enough to the mistake that somebody can still tell you what happened.

MeasureAnnual stocktakeCycle count
Shipping downtimeOne or two days, whole site frozenNone, counts run mid-shift
How long an error hidesUp to eleven monthsDays to a few weeks
Traceability of the causeGone, twelve months of movements to siftNarrow window, the pallet is still remembered
Who does the countingEveryone available, most of them once a yearA small trained group, every week
What the auditor seesOne large year-end correctionDated adjustments with reason codes and names
Effect on the valuationOne shock at year endSmall, continuous, already explained
Cost of getting it wrongRepeats next year in the same directionProcess fixed the same month
Annual stocktake against cycle counting, on the things a finance manager gets asked about.

How do you decide which lines get counted how often?

Rank every line by the value that moves through it, not the value sitting on the shelf. The top class gets counted often, the tail rarely, so the effort lands where an error costs money.

Weighting is what makes a cycle count work. A handful of lines are counted at a time, with the fast-moving class A lines coming round most often and the slow tail left on a longer loop. A class A line might be counted monthly, a class B line quarterly, and the class C tail once a year. Those intervals are yours to set, and the only wrong answer is one you set once and never revisit.

To build the classes, take twelve months of issues for each item, multiply units moved by the cost the item is carried at, sort the list descending, and draw two lines down it wherever the value stops being interesting. Do it per site rather than once for the company. The mix at Sihanoukville · Port is not the mix at Kampot · Cross-dock, and a line that is class A on the coast can be class C inland. Then recalculate every quarter. A class list built two years ago is counting the products you used to sell.

Value is not the only axis. Add anything that goes missing quietly: small high-value units, packs that get broken open to sell loose, and items that pass through many hands. Add anything with a safety or contractual consequence when the number is wrong, which is where lot and expiry traceability earns its keep. And add triggers that ignore the calendar entirely: count a line the moment it hits zero, count it when the system goes negative, count it the day after a large variance on a neighbouring line, and count it before it goes out on an order big enough to hurt.

What happens when the count disagrees with the system?

The count wins. The stock is what is on the shelf; the system is a claim about the stock. What happens next is that you decide whether the shelf was counted properly, before you let the claim be rewritten.

So there is a step between the count and the adjustment. Anything above a variance threshold you set gets recounted, by a different person, before anything is posted. Most of what survives the first count dies at the second: a pallet counted twice, a location skipped, a 24 x 330ml case counted as 24 units. Then check the paperwork that has not landed. A delivery received at the gate but not posted, a pick staged at the door but not confirmed, and above all a transfer in transit. A load that left Phnom Penh · Node 3 for Battambang · Depot yesterday is not stock at either end today, and if your system has no in-transit state, that load is being counted as a shortage at one site and a phantom at the other. The Scale Inventory build is written to hold that in-transit quantity as a row in its own right, with a dispatch row and a receipt row, for exactly this reason.

Only what is left after all of that is a real variance, and it gets written as a stock adjustment: a dated movement carrying the item, the site, the quantity in the unit stock is held in, a reason code, and the name of the person who counted. It is never a silent edit of the on-hand figure.

Counta slice, not the whole siteclass A often · slow tail rarelyComparecounted against expectedboth figures in packsAdjustthe count winsa movement, never an editnext cycle: weeks, not eleven monthsWHAT THE ADJUSTMENT ROW CARRIESCounted vs expectedReason codeWho countedValue effectApproval above a levelBelieve the count, edit the system to match, move on.no reason, no name, and the gap comes back next quarterThe silent edit.Nothing records why the two differed.
Counta slice, not the whole siteclass A often · slow tail rarelyComparecounted against expectedboth figures in packsAdjustthe count winsa movement, never an editnext cycle: weeks, not eleven monthsWHAT THE ADJUSTMENT ROW CARRIESCounted vs expectedReason codeWho countedValue effectApproval above a levelBelieve the count, edit the system to match, move on.no reason, no name, and the gap comes back next quarterThe silent edit.Nothing records why the two differed.
fig. 04 · the count-to-adjustment loop, and the silent edit it replaces

What has to be on a stock adjustment for it to be worth anything later?

It has to say what, where, how many, why, who and when. Strip any one of those out and you are left with a number that closes a gap and explains nothing. It has a second consequence people forget: the valuation moves, so the difference reaches the books as shrinkage. The controls below are the short list worth insisting on.

  • Counted and expected shown side by side in the same unit, so nobody is comparing 12 cases to 288 bottles in their head.
  • A reason code from a short closed list (damage, miscount, short delivery, mispick, sample, write-off) rather than a free-text box.
  • The counter's name and the time they stood in the aisle, taken from the system clock rather than typed in the following morning.
  • The value effect on the valuation, in the currency the books run in, calculated at the cost the item is carried at, visible to finance in the period the warehouse made it.
  • A blind count sheet that does not show the expected quantity, because a sheet that shows it collects confirmations rather than counts.
  • An approval step above a variance threshold you set, expressed in units and in value, whichever bites first.
A stock-taker counting cartons on steel shelving in a small Phnom Penh stockroom, a paper notebook open on the trolley beside her.
fig. 03 · the shelf a count has to agree with. illustration, generated.

One correction tells you nothing. A hundred of them, sorted by reason code, by site and by person, tell you where the process leaks. Damage in the aisle, short deliveries from one supplier, picks entered against the wrong line, packs broken open to sell loose units: all of those look identical on the on-hand figure and completely different in the reason codes. That is the whole return on the discipline. The adjustment closes the gap; the reason code is what stops the gap opening again, and a report you can group by supplier is what turns "we keep losing stock" into one specific conversation about one route. Scanning at the count face helps here too, because a scanned line cannot be a transcription error, and barcode inventory in a Cambodian warehouse covers what that actually takes to run.

What does an external auditor actually test?

An auditor tests whether your figure can be supported, not whether it is right to the pack. A valuation you can walk through line by line, with adjustments that each name a reason and a person, is a short conversation.

In practice they sample in both directions. They pick lines off your valuation and ask to see them on the shelf, then pick items off the shelf and ask to find them in the valuation. They test cut-off, meaning whether goods received on the last day of the period landed in that period and not the next one. They ask how the cost was arrived at and whether the method was applied the same way all year. And they look at your adjustments in bulk. A valuation that arrived as one round correction at year end is a long conversation. A twelve-month run of small dated adjustments, each with a reason code, a counter and an approval above the threshold, is a control they can test and then rely on.

Two things get collapsed here that should not be. FIFO, first in first out, is a cost-flow rule: it decides which cost leaves the books when a unit ships. FEFO, first expired first out, is a picking rule: it decides which pallet the picker takes off the rack. You can cost on FIFO while picking by nearest expiry, and neither setting implies the other. Keep them separate in the system and separate in the conversation, because an auditor is asking about the first and your customer is asking about the second. Be equally clear about the scope of the system itself: it produces a valuation and a cost-of-goods-sold figure that the accounting system consumes. It files nothing with anybody.

What should you ask a vendor about counting?

Ask about the adjustment record, not the count screen. Every system can show you a screen with a quantity box on it. Far fewer can hand you twelve months of variances grouped by reason code, site and person without a consultant writing a report first.

  • Can I count a subset of locations while the rest of the site keeps shipping, or does a count require a freeze?
  • Is the count sheet blind by default, who is allowed to turn that off, and is turning it off written to the log?
  • Does every adjustment carry item, site, quantity, unit, reason code, counter and timestamp, with no other path that changes on-hand?
  • Is the reason list closed and configurable by us, or is it a free-text field with a label on it?
  • What happens to a line that moves in the middle of a count, and how is the count reconciled against movements posted while it was open?
  • Can I set a variance threshold, in units and in value, that forces a recount by a second person and an approval?
  • Can I export twelve months of variance by reason code, by site, by counter and by supplier, myself, without raising a ticket?
  • Does the count post in the unit the stock is held in, and does it show me the conversion when the count unit and the stock unit differ?

One answer you should insist on getting straight, from us as much as from anyone else. There is no inventory handheld Scale can put in a buyer's hands today. Offline scanning, where a device keeps counting through a dead spot at the far end of a shed and syncs when the connection returns, is the architecture the build is written against rather than a shipped demo you can hold. If a vendor will not draw that line for you, ask to watch someone count on the actual device, in the actual shed, with the wifi switched off. And if the stock on your floor belongs to somebody else, the record has to survive your client's audit as well as your own, which changes what the adjustment has to carry: 3PL warehouse software covers the difference.

If you are reading this because a stocktake just came back wrong, do not try to fix the whole warehouse. Take the twenty lines that carry the most value through Phnom Penh · Node 3, count them blind next week, count them again a month later, and read the reason codes rather than the totals. Twenty lines counted every month will tell you more about where your stock goes than your whole catalogue counted once a year, and the discipline you build on those twenty is the one you extend to the rest of the site.

How often should a cycle count run?
Often enough that a class A line comes round at least monthly and the slowest tail is seen once a year. In practice that is a short slot every working day, run by one or two trained people, rather than a freeze once a year. It reaches the same shelves and costs you no shipping.
Can cycle counting replace the annual stocktake entirely?
Whether you can stop the annual count is your auditor's call, not the software's. What makes it a reasonable request is a full year of dated, reasoned, approved adjustments they can sample. Ask them before you cancel the shutdown, not after.
What counts as an acceptable variance?
Set the threshold per class and in value as well as units, because a few units of a cheap consumable and a few units of a compressor are not the same event. The more useful measure is not the size of a variance but whether it carries a reason code, and whether the same code keeps appearing at the same site with the same person.
Should the person who picks the aisle be the person who counts it?
They are fastest, and they also know what the number is supposed to be. Let them run routine counts, rotate the assignment, and require that any recount above your threshold is done by somebody else. The second count is the control, so it has to be independent.
What do we do about stock we simply cannot find?
Post it as a write-off with that reason code, on the day you gave up looking, with the name of whoever looked. Leaving it open as an unexplained discrepancy is the habit that produces the one large year-end correction. A write-off you can point at is worth more than a gap you cannot.
Do we need barcodes before we can start cycle counting?
No. A blind count on paper, entered the same day, with a reason code and a name on it, beats a scanner nobody picks up. Scanning removes the transcription error and shortens the loop. It does not create the discipline, and it will not rescue a count with no reason codes behind it.
cycle-countingstock-varianceinventoryauditcambodia