Platform · Inventory
A spa does not sell products. It uses them.
Retail inventory is easy and every system does it. What almost none of them do is the back bar — the oil, the clay, the linen consumed by treatments — which is where a spa’s stock actually goes and where its margin is actually decided.
The reason this module exists
Finishing the treatment is what posts it.
A Deep Tissue 60 consumed thirty millilitres of argan oil. In most spas that is discovered in March, as a variance nobody can account for, in a count that takes two people a full day and produces a number the owner does not believe.
Here it is deducted and costed at the moment the therapist closes the treatment — because that is the only moment the consumption is genuinely known, and because a stock system that depends on somebody remembering to record something is a stock system that is wrong by the second week.
- The margin on a treatment is known per treatment. Revenue less what it actually consumed, not revenue less an estimate spread across a month.
- The ledger receives a real entry, debiting cost of treatment and crediting back-bar stock, so this is accounting rather than a report.
- Nobody performs an extra action. It happens because the work finished.
Finishing the treatment is what posts it. This is the reason the module exists.
On hand
There is no on-hand column.
The figure is summed from the movements every time it is asked for. That is slower to build and it is the only design in which a stock number cannot become quietly wrong and stay wrong — because there is nothing to drift out of step with.
- Every figure is explainable. Walk any number back to the receipts, treatments, transfers and counts that produced it.
- Costed per base unit, not per bottle. A bottle price on a per-millilitre item makes every treatment recipe wrong by the bottle — an error that survives audits because the total still looks plausible.
- Retail and back bar are different classes, because a jar sold and a jar used are two different transactions with two different accounts behind them.
- Weighted average costing, with each movement freezing the cost it was struck at — so a price rise in June does not silently restate what February cost.
| Item | On hand | Unit cost | Value |
|---|---|---|---|
| Argan oil per ml | 4,200 ml | 0.021 | 88.200 |
| Rose clay per g | 0 g | 0.014 | — |
| Hammam soap per bar | 18 | 1.150 | 20.700 |
Costed per base unit. A bottle price on this row would make every recipe wrong by the bottle.
What to order
Ordered by days of cover, not by quantity.
A reorder list sorted by how little is left tells you about the gift boxes. A list sorted by how long what is left will last tells you about the rose clay that ran out this morning and cancelled two treatments.
The detail that matters: an item with no consumption has infinite cover, not zero. Almost every system gets this backwards and sorts dead stock to the top of an urgency list, which is how staff learn to ignore the list.
- Consumption is real, not forecast — taken from what treatments and sales actually used.
- Out of stock is shown against the treatments it affects today, so it is an operational problem rather than a purchasing one.
- Lead time is part of the calculation, because four days of cover is a crisis if the supplier takes a week.
An item nobody uses has INFINITE cover. Sorting it to the top of an urgency list would be wrong.
Counting
The counter never sees both sides.
Expected is derived on the server and is never sent up with the count. It sounds like a small implementation detail. It is the whole integrity of a stock count.
Let the person counting supply the expected figure as well as the counted one and the variance can be made to disappear — quietly, without malice, by somebody who assumes the system is simply wrong. The one thing the count exists to find is then the one thing it can no longer find.
- Shrinkage and overage are totalled separately. Netting them to a single number hides both, and they almost never have the same cause.
- Variances post to the ledger with a reason, so a write-off is answerable to a person and a date.
- Counts can be partial — one shelf, one class, one room — because a spa that can only count everything counts nothing.
| Item | Expected | Counted | Variance |
|---|---|---|---|
| Argan oil | 4,200 ml | 3,950 ml | −250 |
| Hammam soap | 18 | 19 | +1 |
| Shrinkage | 5.250 | ||
| Overage | 1.150 |
Totalled separately. Netting them to 4.100 would hide both.
Buying
What is committed, not just what arrived.
The figure a buyer chases is the outstanding one: ordered, not yet received. It is computed on the server from the orders and the receipts rather than kept as a field somebody has to maintain.
- Partial deliveries are normal, so an order is not either open or closed — it is open by an amount.
- Receiving updates stock and cost together, and the cost that arrives is the cost the next treatment is struck at.
- Goods received without an invoice are visible, which is where suppliers are most often overpaid.
| Order | Ordered | Received | Outstanding |
|---|---|---|---|
| PO-1184 · Aromatics Co | 2,140 | 1,880 | 260 |
| PO-1187 · Levant Supply | 960 | — | 960 |
| Total | 3,100 | 1,880 | 1,220 |
Across the property
Locations, transfers and who has what.
Stock sits in more than one place — the retail shelf, the back bar, the store room, the second property — and a transfer between them is a movement like any other, with a person and a date attached.
- Each location has its own position and its own reorder behaviour.
- Transfers do not create or destroy value, they move it, and the ledger reflects that.
- Group properties see their own stock and the group’s, so a shortage in one spa can be answered from another rather than ordered again.
Why it matters commercially
Most spas do not know what a treatment costs.
They know the price. They know roughly what they spend on product each quarter. What they cannot do is put those two facts in the same sentence — so the question "which of our treatments is actually profitable" is answered with instinct, and the menu is priced on instinct too.
This module exists to make that question answerable without anybody doing extra work. The therapist finishes the treatment. The oil leaves the shelf, at a real cost, into a real account. By the end of the month the margin on every treatment on the menu is a fact somebody can act on, and the count in March is a confirmation rather than a discovery.
Questions
Stock and the back bar, answered.
Where does the on-hand figure come from?
It is summed from the movement history, every time it is asked for. There is no stored on-hand column, which means there is no such thing as a stock figure nobody can explain — every number on the screen can be walked back to the receipts, treatments and counts that produced it.
How does back-bar consumption get recorded?
The therapist completing the treatment posts it. Thirty millilitres of oil leaves the back bar, costed at what it was actually bought for, and lands in the ledger as a cost against that treatment. Nobody counts anything to make this happen — it is a consequence of finishing the work, which is the only version of stock control that survives a busy month.
Why is the reorder list not sorted by quantity?
Because four hundred of something nobody uses is not urgent, and three of something that sells eleven a week is. The list is ordered by days of cover. An item with no consumption has infinite cover, not zero — so it is shown as a dash and kept out of the way rather than sorted to the top of an urgency list.
Can a stock counter change the expected figure?
No. The counter enters what they counted and nothing else; expected is derived on the server and never accepted from the screen. Letting the counter supply both sides of a variance would erase the variance, which is the only thing the count exists to find.
Why are shrinkage and overage totalled separately?
Because netting them hides both. Five kuwaiti dinar of loss against one of gain is not four dinar of loss — it is a loss to investigate and a gain to explain, and they usually have different causes.
Does stock value reach the accounts on its own?
Yes. Stock is valued at weighted average, each movement freezes the cost it was struck at, and the value flows into the balance sheet without anybody producing a figure by hand at month end.
Start
See a treatment cost itself.
A guided pilot at one property, with your treatments, your therapists and your price bands — not a demo dataset.