How availability works
Why a free time appears or is missing — working hours, resources and duration together.
A free time is never typed in by hand. It is recomputed every time the public page opens — out of the working hours, the resources, the bookings already made and the duration of that particular service. That’s why the same hour can be free for “Haircut” and taken for “Colour”: the second one is longer.
This article walks the calculation layer by layer, in the order the system actually runs it. If what you want is a ready-made diagnosis procedure, go straight to Find out why a service shows no free times — there the board tells you the cause itself.
1. The short version
A slot is shown only when all of this is true at once:
- The service exists, isn’t archived, and is offered at the chosen branch.
- The day isn’t shut by a holiday or a closure.
- There are at least as many free resources of every required kind as the service asks for.
- Those resources work that day, at that branch, and aren’t on time off.
- The whole appointment (start plus duration) fits inside their working window.
- The appointment doesn’t cross a break.
- The appointment doesn’t overlap another booking or a class.
- The time isn’t in the past.
Miss one of the eight and the slot simply isn’t there. The public page gives no “why” — it just says No available slots for this day.
2. Layer 1: the service and the branch
First the system decides which branch we’re asking about.
- With one branch on the board, that one is implied.
- With several, the choice comes from the client (or from the filter in the admin).
- If the service is restricted to specific branches (the Locations section of the service editor) and the chosen one isn’t among them — zero slots immediately.
- An empty location list on a service means “at all active branches”, not “at none”.
Deactivated branches (after a plan downgrade, say) take no part at all.
3. Layer 2: is it closed at all
Before any resource is looked at, the day is checked for a business-wide closure:
| Source | Effect |
|---|---|
| The date is in the board’s list of blocked dates | Zero slots |
| A closure scoped to All locations, mode Closed all day | Zero slots |
| A closure scoped to All locations, mode Reduced hours | The window narrows to the one set |
| A closure aimed at one branch only | Checked later, at that branch |
Official Bulgarian public holidays do not count here. They are only a marker on the calendar and close nothing — see Closures & holidays.
4. Layer 3: which resources are candidates at all
Every service carries a list of requirements: “1 stylist”, “1 chair”, “2 courts”. For each mandatory requirement a candidate list is gathered. A resource drops out if:
- It’s the wrong kind.
- It isn’t on the allowed list. If the requirement names specific resources, only those count.
- It isn’t specialised in the service. With no explicit list, if the resource has specialities set, the service must be among them. A resource with no specialities counts as “everything”. See Which services a resource can perform.
- It’s on time off that date. Time off beats everything else — even a special day.
- It doesn’t work at that branch that day. For people the branch comes from the per-day location chip or a special day; for rooms and equipment, from their home location.
- It’s hidden from clients or deactivated — but only when the question comes from the public page. More in section 9.
If a mandatory kind ends up with no candidate at all, the whole day is empty for that service.
Optional requirements and kinds the client brings themselves aren’t checked — they neither create slots nor take them away.
5. Layer 4: each candidate’s working window
For every candidate separately, the day’s window is computed:
- If the person has a special day with custom hours for that date — those win.
- Otherwise the three levels are asked in order: resource → location → board.
- An explicit closed at any level → the resource doesn’t work that day. Done.
- The first level that says open supplies both the start and the end. Lower levels can’t narrow them.
- Silent levels are skipped.
- If all three are silent — it falls back to the flat window stored on the resource itself.
- Breaks are combined from every level that said “open”, then clipped to the winning window.
- Finally the window is intersected with any reduced hours closure aimed at that branch. If the intersection is empty, the resource is out for the day.
Level details: Your board’s working hours and Hours by location.
6. Layer 5: what is already taken
Occupancy is tracked per concrete resource, not per service:
- Bookings in a status that holds the resource.
- Bookings from neighbouring days that spill into this one (an overnight shift, a multi-day rental) — clipped to the day’s bounds.
- Scheduled group classes — they hold their stylist, room and equipment for their whole length.
- Named add-ons — if a second person or device is pinned to a booking by name, that one is busy too.
Which statuses hold the resource:
| Status | Holds the slot |
|---|---|
| Pending | Yes |
| Confirmed | Yes |
| Checked in | Yes |
| Completed | Yes |
| Walk-in | Yes |
| Cancelled | No — the time is released immediately |
| No-show | No — the time is released |
So cancelling puts the hour back on sale at once, and marking a past visit as a no-show frees the resource too.
7. Layer 6: the 15-minute grid
Only now are the actual times laid out.
- The step is 15 minutes. Slots are tried from the start of the earliest window onwards: 09:00, 09:15, 09:30 …
- A slot only counts if the whole service fits: start plus duration must end before the window closes. A 90-minute service in a window ending at 18:00 has its last slot at 16:30.
- A slot that crosses a break by even a minute is dropped.
- For every mandatory kind the free units in that interval are counted. If one kind falls short, the slot is dropped.
- Slots in the past are discarded: at 15:30 today no longer shows 09:00.
- On the clock-change night, the hour that doesn’t exist is never offered.
Example: a branch on 09:00–18:00, lunch 13:00–14:00, one stylist, a 60-minute service, with a booking already at 11:00–12:00.
| Time | Result |
|---|---|
| 09:00, 09:15, 09:30, 09:45, 10:00 | Free |
| 10:15 – 11:45 | Taken (overlaps the 11:00–12:00 booking) |
| 12:00 | Free |
| 12:15 – 13:45 | Dropped (overlaps the break) |
| 14:00 – 17:00 | Free |
| 17:15 onwards | Dropped (doesn’t fit before 18:00) |
8. The counting: quantities and capacity
A service can ask for more than one unit of a kind. The rules:
- A fixed count — “2 courts”, always.
- The client’s choice — the client picks a number between a minimum and a maximum.
- Per attendee — one trainer per 5 people, say; 12 people need 3.
A resource with a stock count (typically equipment) counts as that many units. One row “Drying cabinet · 4 units” gives four parallel places, not four separate cards. See Equipment stock and parallel capacity.
Free units of a kind are summed across all candidates. If the service needs 1 stylist and you have three, the slot survives as long as at least one is free.
9. Public eyes vs admin eyes
This is the most important asymmetry in the whole product.
| Who asks | Resources hidden from clients | Deactivated resources |
|---|---|---|
| The public page | Skipped | Skipped |
| The admin (new-booking panel, earliest-time search) | Counted | Counted |
So it is entirely possible for you to see free times while the client sees none. If your only stylist is switched off with Hide from the public site, or sits above your plan’s bookable-spots limit, public availability is empty while yours is not.
The diagnosis for that case: Find out why a service shows no free times.
10. When a change reaches the client
The calculation is live, but there is a short cache:
- Part of the board’s data (locations, kinds, resources, closures) is held for up to 60 seconds.
- The public calendar’s per-day load is cached for a further 30 seconds or so.
- Bookings and time off are always read live.
In practice: after changing hours, wait about a minute and reload the public page before deciding something is broken.
11. What the calculation does NOT do
- It leaves no buffer between clients. There is no “10 minutes to clean up” setting. If you need it, build it into the service’s duration.
- It enforces no minimum notice. There is no “not sooner than 2 hours” rule. At 14:05 a 14:15 slot is offerable.
- It doesn’t cap how far ahead people book. The public calendar loads month by month; the earliest-time search scans 30 days ahead by default and 60 at most.
- It emails nobody. The calculation shows times; emails are a separate topic.
- It doesn’t stop an admin. You can book a client outside hours, inside a break or on a closed day — with a warning, but the booking is created.
- It doesn’t publish the page. With the Online booking switch off, clients reach nothing at all, however many free times exist.
12. Classes and rentals are computed differently
- A group class doesn’t come out of the grid. It is a scheduled session with a number of seats; the client joins it. The check is “is there an upcoming session with a free seat”. See Group classes.
- A rental runs off a daily calendar or a court × time grid with its own step, set on the rental itself. See Rentals.
Working hours, closures and time off apply to both.
Troubleshooting
| Symptom | Cause | What to do |
|---|---|---|
| No times on any day | No candidate at all for a mandatory kind | Check there’s an active resource of that kind |
| There are times, just not the one I want | Taken, a break, or the service doesn’t fit before closing | See the table in section 7 |
| The admin has times, clients don’t | The resource is hidden or deactivated | Section 9 |
| One stylist has no times, the others do | Time off, different personal hours, or a missing speciality for the service | Staff schedule and the resource’s specialities |
| One branch has no times | The service isn’t offered there, or nobody is assigned | The service’s Locations section |
| A long service has no afternoon times | It doesn’t fit before closing | Extend the day or shorten the service |
| I cancelled a booking and the time didn’t come back | The cache hasn’t expired | Wait up to a minute and reload |
| The time was free but the booking failed on submit | Someone took the slot in the same minute | Pick another time |
What’s next
- Find out why a service shows no free times — a ready diagnosis with the eight machine reasons.
- Your board’s working hours — the frame that opens the day.
- Breaks & lunch — how time is carved out of the window.
- Resource kinds & capacity — what the service requires.