A colour service is not a time slot. And that is where your calendar breaks.
Forty minutes of work and thirty minutes of processing are not seventy minutes of occupancy. Why software that misses that difference leaves your chairs empty, and how to model it properly.
Ask any developer to build a calendar and you get three fields: start, end, staff member. That is the shape of nearly every calendar in the world, and for nearly every trade it fits. For a hair salon it does not.
At the salon we measured in August 2026, the menu held 34 services. Twelve of them carry a processing time. That is more than one in three, and they are not the cheap ones.
What actually happens
A colour service is not a block of seventy minutes. It is two blocks, and they are different in kind.
| Part | Duration | Who or what is occupied |
|---|---|---|
| Application | 40 minutes | The stylist and the chair |
| Processing | 30 minutes | The chair only |
| Rinse and finish | 20 minutes | The stylist and the chair |
Those middle thirty minutes are the whole difference. The stylist is with someone else then — not as a trick, but as the normal course of business in any salon that colours. Software that writes one ninety-minute block against that stylist is lying about those thirty minutes. And across a day of twenty appointments over four columns, it adds up.
Why a "gap inside the appointment" is not enough
The half solution you often see is a service with a "waiting time" attached: the calendar then draws a lighter block in the middle. It looks right and it helps when planning by hand, but it does not solve the real problem, because the question is not what it looks like. The question is what the software is allowed to answer to "is this stylist free at two o'clock?"
As long as the appointment is one thing with one staff member attached, the answer is no. And then your online booking will not offer that half hour, and there is a gap in your day that did not have to be there.
An appointment as a series of blocks
The model that does work is one where an appointment is not a time slot but a series of blocks. Each block is one of two kinds:
- A work block occupies the staff member and the place.
- A waiting block occupies only the place.
The start and end of the appointment are then no longer entered values but the range of its blocks: from the earliest to the latest. That sounds like a detail and it is the foundation — because once it holds, the availability question can be answered per kind of block. The chair is occupied, the stylist is free, and the free-slot finder is allowed to put something there.
Almost everything else follows from that model. A cabin or a wash basin simply becomes a place you can occupy, like a chair. One appointment can hold several services and several staff members and still produce a single bill. And a junior who takes longer over the same service simply gets a longer work block — not an average for the whole team.

The price of the wrong model
The awkward thing about choices like this is that you cannot correct them afterwards. A calendar that started life as a time slot does not get out of it with a setting; that is a rebuild of the data model and of everything hanging off it — availability, online booking, occupancy reporting.
That is why in our case this is not on a roadmap but in the first table. It is exactly the sort of decision a hairdresser never notices when it is right, and runs into every day when it is wrong.
The rest of the calendar is described on the features page.