Mountify Help
BG → mountify.eu
Scheduling & hours

How availability works

Why a free time appears or is missing — working hours, resources and duration together.

10 min read Updated 2026-07-26

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:

  1. The service exists, isn’t archived, and is offered at the chosen branch.
  2. The day isn’t shut by a holiday or a closure.
  3. There are at least as many free resources of every required kind as the service asks for.
  4. Those resources work that day, at that branch, and aren’t on time off.
  5. The whole appointment (start plus duration) fits inside their working window.
  6. The appointment doesn’t cross a break.
  7. The appointment doesn’t overlap another booking or a class.
  8. 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:

SourceEffect
The date is in the board’s list of blocked datesZero slots
A closure scoped to All locations, mode Closed all dayZero slots
A closure scoped to All locations, mode Reduced hoursThe window narrows to the one set
A closure aimed at one branch onlyChecked 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:

  1. If the person has a special day with custom hours for that date — those win.
  2. 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.
  3. Breaks are combined from every level that said “open”, then clipped to the winning window.
  4. 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:

StatusHolds the slot
PendingYes
ConfirmedYes
Checked inYes
CompletedYes
Walk-inYes
CancelledNo — the time is released immediately
No-showNo — 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.

TimeResult
09:00, 09:15, 09:30, 09:45, 10:00Free
10:15 – 11:45Taken (overlaps the 11:00–12:00 booking)
12:00Free
12:15 – 13:45Dropped (overlaps the break)
14:00 – 17:00Free
17:15 onwardsDropped (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 asksResources hidden from clientsDeactivated resources
The public pageSkippedSkipped
The admin (new-booking panel, earliest-time search)CountedCounted

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

SymptomCauseWhat to do
No times on any dayNo candidate at all for a mandatory kindCheck there’s an active resource of that kind
There are times, just not the one I wantTaken, a break, or the service doesn’t fit before closingSee the table in section 7
The admin has times, clients don’tThe resource is hidden or deactivatedSection 9
One stylist has no times, the others doTime off, different personal hours, or a missing speciality for the serviceStaff schedule and the resource’s specialities
One branch has no timesThe service isn’t offered there, or nobody is assignedThe service’s Locations section
A long service has no afternoon timesIt doesn’t fit before closingExtend the day or shorten the service
I cancelled a booking and the time didn’t come backThe cache hasn’t expiredWait up to a minute and reload
The time was free but the booking failed on submitSomeone took the slot in the same minutePick another time

What’s next