Designing an Inventory System: The Real Reason Your Stock Numbers Are Wrong
"The inventory in the system doesn't match what's actually in the warehouse." It's the most common complaint about inventory systems, and most owners' first reaction is to blame people: the clerk forgot to scan, the warehouse staff got lazy, the stocktake was sloppy. Having operated our own inventory-and-orders SaaS for years — supporting the daily purchasing, shipping, and retail sales of a physical franchise network — we can say this with confidence: when inventory is wrong, nine times out of ten it's a process-design problem, not a people problem. Build a system on the premise of "people will be diligent," and the numbers are destined to drift.
This article shares the design principles we've distilled after stepping in the holes ourselves. Whether you're commissioning custom development or evaluating an off-the-shelf system, treat these as a checklist.
Principle one: inventory must be computed, never typed in
The most fundamental rule. Inventory should not be a directly editable field — it should be the sum of all movement records: opening balance + purchases − sales − write-offs ± adjustments = current stock. Every movement has a document, a timestamp, and a responsible person.
Why insist on this? Because the moment you allow "just edit the stock number," you can never again explain how the current number came to be. When numbers don't match, all you can do is shrug and recount; under a movement-ledger model, you can lay out the records for any period and find the exact day — the exact document — where the divergence happened. It's simply accounting's "debits must equal credits" logic, applied to goods.
Systems with inaccurate inventory all share one trait: somewhere, someone is allowed to "just change the number." Leave one back door open, and eventually everyone uses it.
Principle two: every kind of goods movement gets its own document type
In practice, goods move in far more ways than "in" and "out": supplier purchases, store replenishment orders, inter-store transfers, customer returns, defect write-offs, promotional giveaways, internal use. An early mistake of ours was letting different kinds of movement share one document type — for example, recording giveaway shipments as ordinary sales with the amount set to zero. Fine in the short term; ruinous for reports in the long term: margins can't be computed correctly, sales statistics are distorted, and at month-end close nobody can explain what those zero-dollar orders were.
We learned our lesson: each kind of movement is its own document, with its own fields and rules. A giveaway is a giveaway slip, a write-off is a write-off slip, a transfer is a transfer slip (one side decremented, the other incremented, completed on the same document — no "goods in transit that exist on neither side" vacuum). Having more document types is fine; the system can guide the clerk through them. But the data layer must stay cleanly separated, because reports grow out of data — mix the data, and even the prettiest report is fiction.
Principle three: a stocktake is a calibration, not a reset
Many systems implement stocktaking as "type the new number, overwrite the old one." That amounts to deleting history and starting over at every count — you'll never know what the variance was or why.
The correct design: a stocktake produces a variance, and the variance itself is a recorded adjustment movement — how much over, how much short, confirmed by whom. That way the monthly report shows "we came up N units short this month," and if the same item runs short several months in a row, you know to investigate whether receiving is skipping scans or goods are genuinely being lost. Stocktake variance is the most honest health indicator: a good inventory system doesn't aim to eliminate stocktakes — it aims to make each count's variance smaller, with every discrepancy explainable.
Principle four: build the guardrails into the moment of input
Numbers go bad almost exclusively at the point of entry. So when designing our own system we hold one internal standard: "clerks should be able to use it without training." Concretely:
- Select, don't type: items get picked or scanned — never hand-keyed names or codes.
- Block at the moment, don't chase afterward: if a shipment exceeds current stock, prompt before saving — don't let stock go negative and send someone to investigate later.
- Sanity-range checks: purchases are normally two digits and this one is four? Confirm first. An extra zero is the most common — and most expensive — mistake.
- Make anomalies visible: negative stock, long-dormant items, abnormal costs should surface themselves, not wait for someone to remember to look.
How these details land in an actual admin interface is a separate article — Admin UX: interfaces clerks can use without training — if you want to keep reading.
Settle the process first, then talk systems
Finally, the old refrain: a system can only lock a process in — it can't invent one. If your team currently has no consensus even on "does a return go back into stock," hold the meeting and settle the rules first, then talk systems; the order can't be reversed. When we take on these projects, phase one is always mapping out every path goods can travel with the client, making sure each path has a name and an owner — only then do we start building. You can see how we approach this in our custom systems and SaaS services. And if your inventory numbers have already drifted beyond rescue, talk to us — starting from one properly recorded stocktake, variance usually starts converging within three months.
We solve these problems on our own products every day
Free 30-min discovery call · No hard sell · Reply within one business day
Keep Reading