Ask anyone who runs a café what is on the shelf and they will walk to the shelf. The count lives in someone's head, a notebook or a spreadsheet three people edit, and working out what to order means counting and guessing.
Oatley Coffee count their stock, and we built the place those counts live. It is a section inside a dashboard of ours rather than an application of its own, and it is in use every week. This piece is about one decision that shaped most of it: every line says what state it is in, in a word.
Colour is not a state
The first version of almost every stock screen is a list with red, amber and green dots. It looks finished. It isn't, for two reasons.
First, colour on its own leaves people out. Not everyone can tell red from green, and nobody can read a colour aloud. So every line in Oatley's list carries its state as a word, with the coloured dot beside it rather than instead of it.
Second, colour hides the difference between states that need different actions. Red might mean out, or oversold, or simply not counted for a while. Those are three different jobs: reorder, look at what the till has been selling, go and count. The list uses a separate word for each: fine, low, out, oversold and waiting on a count. A summary line at the top says how many lines are in each.
Old doesn't mean wrong
The trickiest case is a line that is fine but stale: the count says there is plenty, but nobody has checked it in a while.
The easy answer is to turn it amber. We didn't. A stale line keeps its own state word and picks up a quiet caption saying how long it has been since it was counted. Age never silently changes what a line is said to be. If the system starts calling a full shelf low just because time passed, people learn to ignore the word, and then the word is useless when it matters.
The needs attention filter still brings stale lines forward, alongside anything low, out or oversold. So the list can say both things at once: this is fine, and you should check it.
Count in the unit you hold it in
Every countable line sits in one list, grouped the way the shop is walked and held in the unit it is counted in: bags, bottles, boxes, units. Nobody should be converting at the shelf.
Counting is its own mode. One category fills the screen at a time, with a large stepper for each item in that item's own unit, a skip for anything not being counted today, and a progress line saying which category of how many you are on.
Nothing is sent as it is typed. The whole walk is held and posted at the end as one batch. If that batch is refused, nothing is written and the numbers stay on the screen. Half a stock count is worse than none: the list would show some lines counted today and others from last week, with no way to tell which.
Answer the question behind the count
Nobody counts stock for its own sake. They count it to answer two questions, and the list sits on top of both.
One panel costs the drinks list against what is in stock and names the single ingredient holding each drink up. Instead of a line saying one ingredient is low, you see which drinks you are about to stop being able to make, and why.
The other lists what is already ordered, from whom, and where it has got to, written in plain words rather than a status code. Opening any line shows the rest: what it uses in a day, when it was last counted and last delivered, whether it is on order and what was said about that order, and the two numbers that decide when it goes on the next one. Both of those can be changed from the same panel.
The rule we took away
If a screen exists to tell people what to do, every state on it should be a word they could say out loud, and each word should point to one action. Colour, icons and captions can sit beside the word. They shouldn't replace it.
Stock and ordering is one of the internal systems we build most often. The Oatley case study shows the whole ledger.