Keeping a stock list, working out what to order, and counting the shelves against it
This article explains what each of the eight fields on a stock line is for, why reorder level and reorder quantity are two different numbers that people constantly merge into one, how the two reorder policies give different answers on purpose, and how the counting side works — including the one rule that keeps a half-finished stocktake from wrecking your figures.
Four low lines in the sample list, and the order behind each
Press Load the example and a twelve-line coffee shop stockroom appears. Every figure in it is fixed, so you can check the tool against a calculator. The dashboard reads 12 stock lines, 95 units on hand and £469.40 of stock. That last one is only quantity times unit cost, summed. Coffee: 18 bags at £3.40 is £61.20. Paper bags: 11 packs at £7.40 is £81.40. Add the other ten lines and you land on £469.40.
Four of the twelve sit at or below the point where they should be bought again. The test is on hand less than or equal to the level. Less than or equal, so a line resting exactly on its level is flagged as well. Milk holds 9 against 12. Lids hold 3 against 6. Syrup holds 2 against 3. Sanitiser holds 0 against 2, which also makes it the only line marked out of stock.
Now the buying rule. With whole packs picked, the tool starts at one pack. It keeps adding packs while the result would still land at or below the level. Milk comes in cases of 24. One case lifts 9 to 33, which clears 12, so the search stops there. The order is 24 at £1.15 each, or £27.60.
Topping up works down from a ceiling instead. The most you want is the level plus the pack size, and you buy the gap. Milk again: 12 plus 24 is 36, less the 9 held, so 27. That is £31.05. Over the four flagged lines, whole packs come to £117.90 and topping up comes to £144.55. The extra £26.65 buys stock that lasts longer.
The pack search only runs past one when a single pack is too small. Say a line holds nothing, the level is 20 and the pack is 6. One pack reaches 6, two reach 12, three reach 18, and each of those is still at or below 20. So it takes four packs and the order is 24. The search gives up for good at 1,000 packs, so a daft level cannot lock the page up.
Leave the pack size blank and there is nothing to multiply. Both rules then do the same thing: bring the line back up to the level. Hold 3 against a level of 6 and the answer is 3 either way. A line resting exactly on its level with no pack size gives an order of zero, so it stays flagged with nothing to buy. The note under the reorder table counts how many lines are stuck like that.
There is a tick box for whole units. It rounds the order up, never down, so 3.5 becomes 4. It also shaves a billionth off first. That stops a figure which is really 4, but stored as a hair more, from creeping up to 5.
- Milk: 9 on hand, level 12, cases of 24. One case, £27.60. Topping up, 27 units, £31.05.
- Lids: 3 on hand, level 6, sleeves of 10. One sleeve, £39.00. Topping up, 13 sleeves, £50.70.
- Syrup: 2 on hand, level 3, packs of 6. Six bottles, £33.60. Topping up, 7 bottles, £39.20.
- Sanitiser: 0 on hand, level 2, packs of 6. Six sprays, £17.70. Topping up, 8 sprays, £23.60.
- Whole packs: £117.90 for the four. Topping up: £144.55.
What the sums round off, and where they stop being safe
Two lines in the example arrive already counted, which is enough to show the count maths. Milk expects 9 and was counted at 7. That is 2 short, and at £1.15 each it is £2.30. Cups expect 14 and were counted at 15. That is 1 over, and at £4.25 a sleeve it is £4.25. The dashboard keeps them apart: £2.30 missing, £4.25 found, a net of £1.95 in your favour, 2 lines not matching, and minus 1 unit overall. Each of those is a gap in units times that line's own cost.
Rounding is shallow on purpose. Quantities are held to three decimal places with trailing zeros stripped, so 1.500 shows as 1.5 and anything under a thousandth is gone. That suits weights without pretending to lab accuracy. Money follows the currency you pick. Twelve of the thirteen on offer use two decimal places. The yen uses none, since it has no minor unit, and giving it pennies would make every figure look tiny. One small guard: a value that rounds to zero never prints with a minus sign in front of it.
Some fields are clamped and some are not. The level, the pack size and the unit cost are all lifted to zero if you type a negative. Quantity on hand is left as you typed it, so a negative holding stands. It usually means something was issued twice, and hiding it would not help you find that. Anything the tool cannot read as a number becomes zero. A blank counted cell is the one exception. It stays blank, and that is the rule the whole count rests on. A fresh list starts on pound sterling, day/month/year dates, whole packs, blind sheets and today's date.
The date is only ever text. It is kept as year-month-day and reshaped for display, and no sum uses it. There is no ageing, no usage rate and no forecast. The sort named cover is on hand minus the level, measured in units, not in days. Nothing here knows how fast anything sells, so the tool cannot tell you whether a level is set well. It can only tell you when you have crossed one. Date checking is loose too: any day from 1 to 31 passes for any month.
Column matching on import is generous, and generous can be wrong. A column headed Max or Maximum is read as the pack size. Under the topping-up rule that is headroom above the level, not the ceiling itself. So a sheet with Min 12 and Max 24 gives you a ceiling of 36, not 24. Either halve that column or switch to whole packs. Numbers are read the English way as well. The cost cell keeps only digits, dots and minus signs, so a price written as 1.234,56 arrives as 1.23456.
Two lines are allowed to share a SKU. Saving a repeat earns you a warning in the message that pops up, and nothing more. It matters because an import matches on the SKU and stops at the first line it finds. The second copy is never touched, so it quietly goes stale. The log of posted counts holds the last 50 entries and drops the older ones. Each entry keeps the date, the reference, how many lines were posted, how many disagreed, and the net value. The lines themselves are not kept. If you may want to know which item was wrong three months from now, save the variance CSV before you post.
- Quantities round to three decimals. Money uses two, or none for the yen.
- Level, pack size and unit cost cannot go below zero. On hand can.
- The pack search gives up at 1,000 packs.
- The count log holds the last 50 postings, with no line detail in them.
- A Max column becomes the pack size, which topping up then adds to the level.
- Costs written with a decimal comma come in wrong.
What a stock list is actually for
Most small businesses do not have a stock problem. They have a knowing problem. The cupboard is not empty, but nobody can say what is in it without going to look, and by the time someone looks, the thing they needed has run out.
A stock list fixes that by writing down two things per item: how many you hold, and how few is too few. Everything else the tool does grows out of those two numbers. The value on the shelf is quantity times cost. The reorder flag is quantity compared with the too-few line. The order quantity is the gap between the two, worked out under whichever buying rule you follow.
The list is only worth keeping if it is true, and a written list drifts away from reality within weeks. Deliveries get put away without being recorded. Things get used, broken, given away, or quietly taken. So the second half of the tool is the count: the process of walking round with a printed sheet, writing down what is really there, and dragging the list back to the truth.
The eight fields, and what each one earns
SKU is the code on the shelf label. It does not have to follow any standard, it just has to be unique and short enough to write on a label. It is what the CSV import matches on, so a consistent scheme pays for itself the first time you import a supplier list.
Description is what the thing is, written for a human. Someone who has never worked in your stockroom should be able to find it from the description alone, because that is exactly who ends up doing the count when you are short-staffed.
Location is where it lives. This is the field that makes counting practical, because you can filter to one room and print a sheet for that room only. Locations can be as broad as Chiller or as narrow as Aisle 3, Bay B.
Unit is what one of it is: a 250g bag, a box of 2000, a litre, a sleeve of 50. Getting this wrong is the single most common cause of a count going haywire. If the list says 14 and the unit is a sleeve of 50 cups, the person counting must write down sleeves, not cups. Spelling the unit out on the sheet is the only defence.
Quantity on hand is what the list believes you have. Reorder level, reorder quantity and unit cost are covered below, and Notes is a free field for lead times, supplier names, or a warning about the box that looks full but is not.
Reorder level and reorder quantity are not the same number
These two fields get merged more often than any other pair in stock control, and merging them produces either constant emergencies or a stockroom full of money.
The reorder level is a trigger. It answers: at what point do I need to place an order? The right value depends on how fast the item goes out and how long the supplier takes to deliver. If you use ten a week and the supplier takes a week, ten is your bare minimum, and a sensible reorder level is a bit above that so a late delivery does not leave you at zero.
The reorder quantity is a size. It answers: when I do order, how much do I buy? That depends on pack sizes, minimum order values, how much space you have, and how much cash you want tied up. A supplier who only sells cases of 24 has made the decision for you.
The tool keeps them apart because they move for different reasons. If your supplier gets slower, the level goes up but the quantity does not. If the supplier changes case size, the quantity changes but the level does not. Storing one number for both means every change breaks something.
Two reorder policies, two different answers
Once a line is flagged, how much should you buy? There are two answers in common use and they genuinely differ, so the tool asks rather than choosing quietly.
Buying whole reorder quantities suits anyone whose supplier sells in fixed packs. You cannot order two thirds of a case, so the order is one case, or two if one is not enough to get you back above the trigger. Hold three, level six, case of ten: the order is one case of ten, which takes you to thirteen. It is the simplest rule to follow and it produces tidy purchase orders.
Topping up suits anyone who can order any amount. Here the reorder quantity is read as headroom above the trigger, so the most you want on the shelf is the level plus the quantity. Same numbers as before: hold three, level six, headroom ten, maximum sixteen, so the order is thirteen. That caps the money sitting on the shelf, which is why it is popular with anyone watching cash rather than paperwork.
Both policies can leave a flagged line with nothing to order. That happens when the reorder quantity is blank and the item is already sitting right on its level. The tool keeps the flag but tells you in the note under the reorder table how many lines are in that state, because the fix is to fill in the missing number rather than to ignore the warning.
Stock value is a cost figure, not a price list
The unit cost field wants what you paid, not what you charge. This trips people up because the sale price is the number they know by heart.
The difference matters twice. First, the stock value at the top of the page is what your accounts call stock or inventory, and accounts carry it at cost. Putting sale prices in inflates the figure, sometimes by a factor of three, and it will not reconcile with anything.
Second, it distorts every variance. If eight sleeves of cups go missing and you costed them at the price you charge for a coffee, the loss looks enormous and you will spend an afternoon on it. Costed properly, it might be thirty pounds and a note to check who is taking cups home.
Lines with no cost at all are allowed. They still count correctly in units, they simply contribute nothing to the value figures. The dashboard tells you how many lines are in that state, so a suspiciously low stock value has an obvious explanation rather than being a mystery.
Counting: blind sheets and the blank-is-not-zero rule
Switch the Mode control to Stock count and the table grows two things: a box to type what you found, and columns showing the difference in units and in money.
One rule governs everything here. A blank box means not counted. A zero means counted, and the shelf is bare. They are stored differently and treated differently the whole way through, which is why you can count one aisle on Tuesday, leave the rest blank, and post safely. Software that treats blank as zero will write off every line the counter never reached, and it does it silently.
The printed sheet is blind by default: it lists the SKU, the description and the unit, with a tick box and a space to write, but no expected quantity. This is not the tool being unhelpful. If the counter can see the number they are supposed to find, a half-counted shelf becomes the expected number, and the count stops proving anything. There is a second sheet that does show the expected figure, which is the right choice for a recount when you already know something is wrong and want to find where.
There is also a Recount column on the sheet. Use it only for a line that was genuinely checked twice. Keeping the first figure visible next to the second is what stops a recount becoming a rubber stamp.
Reading a variance before you believe it
As counts go in, the dashboard splits the discrepancy three ways: stock missing, stock found, and the net of the two. That split is deliberate.
A net variance of nothing across a hundred lines is not a clean count. It is far more likely that two mistakes cancelled each other out. Netting them off hides both. Shown apart, a count with fifty pounds missing and fifty pounds found is obviously a count with two problems in it, and usually the problems are next to each other on the shelf: two similar items swapped, or one line counted onto the wrong row.
Sort by variance value and the money floats to the top. Fifty missing screws and one missing laptop are both a single line in the list, and only one of them deserves your afternoon. Sorting by units would put the screws first, which is why the tool sorts by value instead.
Before treating a variance as real, check the unit. A line that is out by exactly a factor of the pack size, twelve or twenty-four or fifty, is almost never theft. It is somebody counting singles onto a line measured in boxes. This single check explains most of the alarming variances people find on their first count.
Posting the count
Posting is the moment the count becomes the truth. Every line with a number in the counted box has that number written into quantity on hand. The counted column is then cleared, ready for next time.
Lines you did not count are left exactly as they were. That is what makes a rolling count possible: do the chiller this week, the dry store next week, post each one, and the list stays accurate without ever shutting the place for a full inventory.
The confirmation box tells you what you are about to do before you do it: how many lines will change, how many of them currently disagree, and the net value of the adjustment. Read it. It is the last point at which a miscount is free to fix.
Posting cannot be undone, so take the JSON backup first on anything larger than a spot check. Each posted count is recorded with its date, its reference and its net value, which gives you a short history of how far the shelves have drifted from the paperwork over time. If those net figures keep pointing the same way, the problem is a process, not a counter.
Getting data in and out
The import accepts any CSV with a header row and matches column names loosely. Qty, Quantity and On hand all land in quantity on hand. Min, Minimum and Reorder point all land in reorder level. Cost, Unit cost and Cost price all land in unit cost, and currency symbols and thousands separators are stripped rather than being read as zero.
Rows are matched on SKU. A SKU already in the list is updated, a new one is added, and nothing is ever deleted by an import. That makes it safe to re-import a supplier price list to refresh costs without touching your quantities.
A column named Counted is treated specially: it loads into the counted column, not into quantity on hand. This is what makes a spreadsheet round trip work. Export the count sheet, send it to whoever is counting, let them type into the Counted column, then drop the file back and every variance appears without a single figure being retyped.
Going out, there are four exports and four printable sheets. The exports all follow whatever filters you have set, so narrowing to one location gives you that location's data and nothing else. The JSON backup ignores filters on purpose — a backup that only saved part of your list would be worse than no backup at all.
Where this tool stops
It is a stock list, not a stock system. There is no receiving, no issuing, no order history and no link to sales. Quantity on hand changes when you edit it or when you post a count, and at no other time. For a business turning over a few dozen lines, that is enough and the simplicity is the point.
One SKU is one line in one place. If you hold the same item in two locations, give each its own line, because you count them separately and an import matches on SKU. Batch numbers and expiry dates are not modelled either. If those matter to you legally, as they do for food or medicines, you need more than a list like this.
The valuation is quantity times unit cost, flat. There is no first-in-first-out, no weighted average, and no allowance for stock that is damaged, expired or simply never going to sell. Your accountant may want any of those, and the export gives them the raw figures to work from.
Everything runs in your browser and the list is held in this browser's own storage. Nothing is uploaded, there is no account, and there is no shared copy for two people to edit at once. That also means clearing your browsing data clears the list, so if it matters, keep a JSON backup somewhere you trust.
