One Reorder Point in Every Building
Stock balancing suggests moving stock from where there is too much to where there is too little. Both judgements are made against one number held on the item — so the same threshold is applied independently in every building, and on the default of zero, nowhere is ever short.
Read this first
The balancing suggestion engine is sound in its arithmetic and precise about one thing most implementations get wrong — it decrements the surplus as it allocates, so two short locations are never offered the same stock twice. What decides whether it is useful to you is a single column. There is one reorder point, held on the item, and it is compared against the quantity at each location separately. So a threshold you set thinking about total cover is applied in full at every branch that holds the item. And the column defaults to zero, which makes the arithmetic degenerate: nowhere can be below zero, so nothing is ever short, and every stocked location is classified as having a surplus. An unconfigured catalogue produces an empty list — correctly, and for a reason no screen explains.
The suggestion list is empty, the stock is unevenly spread, and both of those things are true at once for a reason that is arithmetic rather than a fault.
What the engine does
It reads every item-location holding in the workspace and sorts each one into a category. A location holding less than the item's reorder point is short. A location holding more than it has a surplus. Then, for each short location, it looks for surplus of the same item somewhere else and proposes a movement.
The proposal names both ends — warehouse and location, at source and destination — the item, the quantity, and a priority. Priority is high when the destination holds nothing at all, and medium otherwise, which is a sensible distinction: an empty shelf is a different problem from a low one.
It suggests. It does not move anything.
The output is a list a person reads. Nothing is transferred, no stock changes, and no transfer is created. That is worth stating plainly because an engine described as "balancing" invites the assumption that it balances, and this one advises. The same suggestions are available on a page, as a JSON response and through the API, all from one implementation.
The allocation detail worth crediting
One part of the arithmetic is done properly in a way that is easy to get wrong.
Suppose three branches are short of the same item and one central store has a surplus of ten. A naive implementation offers all three branches a movement from the central store, because it evaluates each shortage independently against the same surplus. Follow all three suggestions and you have promised thirty units from a store holding ten.
This engine reduces its working copy of the surplus as it allocates. The first branch is offered what it needs, the surplus falls, and the second branch is offered what is left. The suggestions add up.
A list of individually reasonable suggestions that cannot all be followed is worse than a shorter list, because somebody follows them.
The one number in every building
Now the shape that decides whether any of this is useful.
The reorder point is a single column on the item. There is no reorder point on a location and none on a warehouse. Both tests in the engine — short, and surplus — compare a location's quantity against that item-level number.
Set a reorder point of a hundred, and every location holding the item wants a hundred. With five branches, the workspace is asking to carry five hundred before anything counts as adequately stocked. Anything above a hundred at any one branch is a surplus available to be moved away.
One item, a reorder point of 100, four locations
The workspace holds seven times the reorder point and the engine still reports two locations short — correctly, on its own terms. Branch B genuinely has nothing on the shelf, and no amount of stock in the main store puts it there. Whether Branch A being five units below a threshold designed for the whole business is worth a movement is the judgement the single column cannot make for you.
Read that table twice, because it contains both the criticism and the defence. Per-location measurement is what makes the engine useful at all — the whole point is that stock in the wrong building does not help the building that is out. And the threshold it measures against was almost certainly chosen with the whole business in mind.
What zero does
The reorder point column defaults to zero, and zero makes both tests degenerate.
Short means holding less than the reorder point. Less than zero is not a quantity any location has. So with the default, nowhere is ever short and there are no destinations.
Surplus means holding more than the reorder point. More than zero is every location with any stock at all. So with the default, everywhere with stock is a donor.
Sources and no destinations produces an empty list. The engine is working exactly as written and reporting nothing, and the reason is a column nobody filled in.
This is the useful diagnosis, and it applies well beyond here
An empty result from an analytical feature has two causes that look identical: there is nothing to report, or the input it depends on has never been configured. Both render as a page saying nothing needs attention. Whenever a report or a suggestion engine is quietly empty, check what it reads before concluding it is telling you good news.
How to make it work for you
-
Set reorder points on the items that matter
Not the whole catalogue. The fast movers and the ones whose absence stops work. Everything left at zero is invisible to the engine, which is a reasonable way to keep the list short on purpose.
-
Set the number as a per-location figure
This is the mental adjustment that makes the rest work. Ask what one branch should have on the shelf, not what the business should hold in total. The engine will apply your answer at each location, so an answer meant for the total reads as a demand at every site.
-
Expect the main store to look like a permanent donor
A central store deliberately holding bulk will exceed a shelf-level threshold by a wide margin and be offered as a source for everything. That is correct behaviour and it will still feel odd on the list, so know it in advance rather than concluding the figures are wrong.
-
Treat high priority as the real list
A destination at zero is out of stock, which is a fact rather than a judgement about a threshold. Those entries are worth acting on whatever you think of the number that produced the medium ones.
What AWRA OpsHub does today
- Transfer suggestions computed across every item-location holding in the workspace, comparing each location against the item's reorder point.
- Surplus decremented as it is allocated, so several short locations are never offered the same stock and the suggestions add up to something that can actually be followed.
- A priority distinguishing a destination that is completely out from one that is merely below its threshold.
- Both ends of a proposed movement identified by warehouse and location, by name for the reader and by identifier for whatever acts on it.
- The same suggestions available on a page, as a JSON response and through the API, all from one implementation so the three cannot disagree.
- Suggestions strictly advisory — nothing moves stock, so a wrong threshold produces a wrong list rather than a wrong warehouse.
- Holdings grouped per item, warehouse and location, matching the uniqueness the stock table already enforces.
More we can add to your workspace
- A reorder point per location, so a main store, a branch and a van can each carry the level that suits them rather than sharing one figure.
- A maximum level per location, so surplus means "above what this place should hold" rather than "above the reorder point", which is the change that would stop a central store reading as a permanent donor.
- A note on an empty suggestion list explaining that no reorder points are set, so a quiet page distinguishes good news from an unconfigured one.
- Reorder points derived from consumption, so the figure follows what a location actually uses rather than being set once and left.
- Movement cost or distance in the ranking, so a suggestion prefers the nearer source when two could serve.
- Creating the transfer from a suggestion, turning an advisory list into an action rather than a set of figures to re-enter.
Where we point you to a specialist
- We hold that balancing stays advisory. A system that moves stock between buildings on its own is making a logistics decision with a cost attached, and the person who signs for the vehicle should be the person who decided it was worth sending.
- Where stock is held under a licence, a bond or a controlled-substance regime that governs which premises may hold it, that regime governs and we point you to your own advisers on what it permits. A suggestion engine reading only quantities will happily propose a movement your licence forbids.
- We would decline to derive a reorder point automatically and apply it without being asked. A threshold that changes on its own alters what counts as a shortage, and a buyer who cannot say why the figure moved stops trusting the list.
A reorder point and a maximum level per location are one piece of work between them, and together they turn a single shared threshold into a real stocking policy. If you run more than two locations, they are the pair to scope.
From one threshold to a stocking policy
The engine's arithmetic is already correct. What it lacks is somewhere to record that different places should hold different amounts, which is the fact that makes multi-location stock interesting in the first place.
A level per location
A minimum and a maximum for each place that holds the item, so a bulk store and a service van stop being measured by the same number.
An explained empty list
The smallest item here: a page reporting nothing to balance should say whether that is because nothing is short or because no thresholds are set.
A suggestion you can act on
Creating the transfer from the suggestion, with both ends already chosen, rather than reading the figures off one screen and typing them into another.
We publish scope, not dates.
Scope multi-location stockingFour questions for any multi-location stock system
Is the reorder point per item or per location?
A good answer sounds like
Per location, with an item-level default.
What ours actually is
Per item, applied at every location. Ask it in exactly those words — "we support reorder points" is true of both answers and they behave completely differently across five branches.
What counts as surplus?
A good answer sounds like
Above a maximum set for that location.
What ours actually is
Above the item's reorder point, which makes a bulk store a permanent donor. Worth knowing before reading the list rather than while puzzling over it.
If two branches are short, can they both be offered the same stock?
A good answer sounds like
No, allocation is deducted as it goes.
What ours actually is
No. The surplus is decremented as it is allocated. This is a good question for any suggestion engine and a surprising number get it wrong.
Does an empty list mean nothing needs moving?
A good answer sounds like
It distinguishes the two cases.
What ours actually is
Not necessarily — with no reorder points set, the list is empty by arithmetic. Ask it of any analytical screen you rely on, because a quiet page and a good result look identical.
Check one column before you judge the feature
Open your ten fastest-moving items and look at the reorder point on each. If they are all zero, the balancing list has been empty for a reason that has nothing to do with your stock, and ten minutes of typing changes that.
Talk through your stocking levelsFrequently asked questions
Why is my balancing suggestion list empty?
Most often because no reorder points are set. The column defaults to zero, and the arithmetic then makes it impossible for anywhere to be short: a location is short when it holds less than the reorder point, and no location holds less than zero. Every stocked location is simultaneously classified as having a surplus. Sources with no destinations produces an empty list, and the engine is working exactly as written.
Is the reorder point per item or per location?
Per item. There is one reorder point column, on the item record, and both tests in the engine compare a location's quantity against it. So the same threshold applies independently wherever the item is held — with five branches, a reorder point of a hundred means the workspace is asking to carry five hundred before nothing is reported as short.
Why does my main store always appear as a source?
Because surplus is defined as holding more than the reorder point, and a central store deliberately carrying bulk will exceed a shelf-level threshold by a wide margin. It is correct on the engine's own terms and it does feel odd. A maximum level per location is what would fix it properly, by letting surplus mean "more than this place should hold" rather than "more than the reorder point".
Can I follow every suggestion on the list?
Yes, and that is a deliberate property rather than a coincidence. The engine reduces its working copy of a source's surplus as it allocates, so if three branches need the same item from one store, each is offered a share of what is actually there rather than all three being offered the full amount. A list of individually reasonable suggestions that cannot all be followed is worse than a shorter list, because somebody follows them.
Does it move stock automatically?
No. The output is a list of suggestions that a person reads and decides about, available on a page, as a JSON response and through the API. Nothing is transferred and no transfer is created. We hold that this should stay advisory: moving stock between buildings has a cost attached, and the person who signs for the vehicle should be the one who decided it was worth sending.
How should I choose the number, given it applies everywhere?
Set it as the figure one location should have on the shelf, not the total the business should hold. That is the mental adjustment that makes the rest behave sensibly. And set it only on the items that matter — the fast movers and the ones whose absence stops work — because everything left at zero stays invisible to the engine, which is a reasonable way of keeping the list short deliberately.