StoresFlow
The good biscuits are reserved
A sequel to the coffee mug. This time the cupboard knows what's in it, and it won't let me near Thursday's biscuits.

Last time, I built a system to keep my coffee mug full. It had one weakness, and I admitted it at the time: it had no idea what was in the cupboard. When the jar ran out halfway through a scoop, I said that was the shopping list's job.
The shopping list is a whiteboard on the fridge. Nobody has written on it in months.
So the cupboard got a system too.
The shopping. When the shopping arrives, I scan each thing out of the bags. Anything without a barcode the system knows, like the eggs from the farm shop, gets a label printed for it. Nothing goes in the cupboard without something to scan. Nothing counts yet, though. Until it's put away, the system treats the shopping as still arriving: it can't be promised to anyone, and it can't be eaten.

The sniff test. Anything chilled gets checked on the way in. The new milk, with next week's date, goes in the fridge behind the carton that's already open, so the older one gets used first. Except the open carton smells odd, so it goes straight on hold.
Putting it away. I wrote the house rules once, and someone else in the house had to approve them, because you can't approve your own. Now the system says where everything lives: coffee on the shelf by the kettle, biscuits on the top shelf, out of my reach for reasons I'd rather not discuss. Milk lives in the fridge door, which makes a natural queue: new cartons go in at the back, so the oldest is always at the front. I scan the shelf as I put each thing on it, so the system knows where it went, not just where it was meant to go.

Three numbers. For every item, the system keeps three numbers apart: what's on the shelf, what's spoken for and what's on hold. Only what's left over is mine to use.
Spoken for. Two visitors are coming round on Thursday. On Monday I reserved a packet of the good biscuits for them. The packet is still in the cupboard. It's just not mine any more.
The incident. On Tuesday at three o'clock, I scanned the good biscuits. The screen said no: that packet is reserved for Thursday's visitors, and there are none available. It didn't say it unkindly. It didn't have to.

On hold. The odd-smelling milk is still in the fridge, on hold, with a reason attached. It doesn't count as milk I can use, and the system won't take it off hold by itself. Someone has to look at it and decide. So I scanned the carton to bring up its hold, sniffed it again and recorded what I found. It wasn't the milk. It was half an onion at the back of the fridge. The milk came off hold, with "onion" as the reason. The onion went in the bin without a record, because it had never been scanned in with the shopping.

Oldest first. When I take milk out, the system picks the carton that goes off first: the open one at the front, now it's off hold. It goes by the date, not the position: the queue in the door usually agrees, but when it doesn't, the date wins. A carton past its date can't be picked at all, however nicely I ask.
Taking it out. Thursday comes. I take the reserved biscuits through to the living room, and the system records where they went. It's careful about one thing: taken out is not eaten. As far as it's concerned, the biscuits left the cupboard for the living room. What happened in there is between me and the visitors.
The ones that came back. Four biscuits came back from the living room. They can't just go back in the tin, because they've been out in the world, on a plate, in front of company. They come in through the front door like new shopping, go on hold, and someone decides whether they're still good. (Me again. They were.)

Counting. Once a week I count the teabags. The system thought there were 40. There were 12. It doesn't simply take my word for it, either: the difference goes to the supervisor with a reason before the number changes. The supervisor is me. The reason was "made tea without scanning". I'm not proud of it.

Running low. When the coffee drops below one jar, the system raises a request: we're low on coffee. The request goes to the purchasing side, where someone has to approve the order before anything is bought. That someone is me, with a code from my phone, which feels excessive for coffee. It still doesn't talk to the mug system from last time. The two have never met. I carry the news between them.

Everything above is stock control, the job a factory's stores does every day for screws, glue, packaging and parts.
| In my kitchen | In a factory stockroom | What it's called |
|---|---|---|
| Scanning the shopping out of the bags | Booking in a delivery | Receiving |
| The sniff test | Checking suspect deliveries before they're used | Goods-in inspection |
| Each thing on its own shelf, scanned in place | Each part in its own bin, with a location scan | Put-away |
| The good biscuits, kept for Thursday | Parts set aside for a known job | Reservation |
| The odd-smelling milk | Material kept apart until someone decides | Quarantine, or a hold |
| Oldest milk first, out-of-date milk never | Earliest expiry first, expired lots blocked | First expired, first out |
| Taking the biscuits through to the visitors | Sending parts to the line for a job | Issue (not consumption) |
| The biscuits that came back | Unused parts coming back from the line | A return |
| Counting the teabags | Counting a few locations at a time | Cycle count and variance review |
| "We're low on coffee" | A minimum level that raises a purchase request | Reorder point |
The number that matters most is the one left over: what's on the shelf, minus what's spoken for, minus what's on hold. Factories call it available stock. In a lot of small factories, that sum happens in a spreadsheet, or in somebody's head, on the morning it's needed.

Full disclosure
The cupboard system is StoresFlow, which we make for factory stockrooms. I pointed it at a cupboard.
In my kitchen, the shopper, the cupboard-keeper and the supervisor are all me. In a factory they're goods-in, the stores team and a supervisor, and the good biscuits are a batch of adhesive set aside for Thursday's job. The visitors are the customer. Then the jokes become the point. Material that's spoken for stays spoken for. Suspect stock stays out of use until somebody decides. A count changes a number only after someone has looked at why.
StoresFlow runs as an invited trial for one stockroom at a time. Here's how it handles reserving and issuing material for each job.
It doesn't value your stock or talk to your ERP. Buying belongs to SmartFACT Purchasing, which it passes low stock to when they're connected. And it still won't let you have the good biscuits.
P.S. The visitors were my parents-in-law. They take their tea black and strong, two bags a mug, which accounts for 16 of the 28 missing teabags. Whether my father-in-law had three of the good biscuits is between him and his conscience.

The photographs in this post were generated with AI.
