Live inventory across three branches, expiry write-offs cut by 60%
A pharmaceutical distributor running three branches on separate stock registers moved to one live inventory, with batch expiry visible before it became a write-off.

Stock that only existed on paper, and expiry nobody saw coming
Stock, batch expiry and field-sales orders were tracked manually at each of three branches. Each branch knew its own shelves and nothing about the other two.
Expiry was the expensive symptom. Batches near their date sat in one branch while another branch ordered the same product fresh, and the near-date stock was discovered when it was already a write-off.
Field sales made the same problem worse from the other direction. An order taken on a phone call was confirmed against a stock figure that was hours or days old, so dispatch regularly discovered it could not fill what had been promised.
Constraints
- Branch staff worked from handwritten registers and would not adopt anything slower than writing a line by hand.
- Field sales operate on phones, often on weak mobile data, and needed stock figures they could trust while standing in front of a customer.
- Batch and expiry tracking is a regulatory requirement, so the system had to be auditable from day one, not after a later phase.
Discuss, Design, Develop
Three steps, applied to a distributor whose stock could not be paused for a stocktake.
Discuss
A week split across all three branches and two days riding with field sales. We traced a single product from purchase order to customer delivery and counted every point where a quantity was rewritten.
What you get
- Stock and order flow map, three branches
- Write-off analysis by cause
- Phase order agreed with the owner
Design
One stock ledger with batch and expiry as first-class fields, branch views on top of it, and a field-sales view that works on a phone. Expiry alerts were designed around the reorder decision, not as a report nobody opens.
What you get
- Batch-level inventory model
- Branch and field-sales screens
- Expiry alert thresholds set with the owner
Develop
Goods-in and stock transfer went live first, because that is where the ledger becomes true. Order taking, dispatch and expiry alerting followed once branch figures reconciled for a full month.
What you get
- Three branches on one live ledger
- Field-sales ordering against real stock
- Expiry and batch audit trail
One ledger, three branches, expiry visible early
Goods-in, transfers, orders and dispatch write to the same batch-level stock ledger, and near-date stock surfaces while it can still be sold or moved.



Screenshots require written client permission and may need supplier names, pricing and margin figures redacted.
What changed, measured
−60%
Expiry write-offs
Value of stock written off on expiry, against the preceding year.
−2 days
Order to dispatch
Median time from order taken to goods leaving the branch.
3
Branches on live stock
One ledger, with transfers between branches recorded as they happen.
Built to be right on a weak connection
Application
- React
- Node.js
Data
- PostgreSQL
- Batch-level audit log
Field use
- Mobile web
- Queued writes on reconnect
We used to find out about expiry when we threw the box away. Now we see it early enough to move the stock, and the branches finally agree on what we have.
How this work is delivered
Tell us what you are trying to do. We will scope it.
Priced per project or per engagement, no public rates. A 30-minute call is enough to tell whether we are the right fit.