In the salon

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.

Published on 3 min read

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.

The same appointment, taken apart.
PartDurationWho or what is occupied
Application40 minutesThe stylist and the chair
Processing30 minutesThe chair only
Rinse and finish20 minutesThe 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 day calendar in HairConnect with four columns: for a colour service the work block and the waiting block appear as two separate blocks below one another, and inside one client's waiting block sits another client's appointment with the same stylist.
The waiting block keeps the chair occupied and leaves the stylist free. A second client fits in those thirty minutes.

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.

Read on

All articles

Curious how this works out in your salon?

A demo takes half an hour and is about your calendar, your services and your file.