A salon has two rooms, three chairs, and one laser hair removal machine. Two specialists book clients at 11:00 β each into her own schedule, and both are right: they're free. The machine isn't. The specialists' calendar doesn't show this at all, because it tracks a person being busy, not a thing. Resources in the CRM are exactly about that β about what physically isn't enough to go around.
Where it is in the CRM
- Resource catalog: Settings β Salon β Resources. Each row has a "Station maintenance" button next to it.
- Linking to a service: Settings β Catalog β Services, the service card, the "Equipment" block.
- Map: Appointments β the Resource map tab.
- In the visit card: the "Resources" block with a "Book" button.
A resource is a row in the catalog
A resource has a name, an optional code, a location, a type and a state from reference lists, an "Active" flag, "Slot duration, min", and "Buffer after visit, min". The hint under the buffer says it plainly: "The station stays busy this many minutes after the client: cleaning, disinfection."
The buffer isn't a cosmetic detail here. It's added to the end of a booking on every overlap calculation, so the next client doesn't get put into the same chair back-to-back. The key point: the buffer is set on the equipment itself, not on each booking β the administrator shouldn't have to remember about cleanup every time they book someone. The system honors an explicitly passed value β that's how you cover edge cases like a deep clean after a coloring.
Equipment tied to a service books itself
The service card has an "Equipment" block with a "Required" checkbox. When you save an appointment for such a service, the CRM creates two bookings: one for the equipment and one for the assigned specialist's account β so the visit is visible on both the equipment axis and the staff axis. The booking's buffer is the larger of the two: the service's buffer on the appointment and the equipment's own buffer.
After that the bookings live together with the appointment. Change the time, service, or specialist, and the bookings move to the new window, while the previous specialist's booking is removed β otherwise they'd look busy with someone else's visit for the rest of the day. Move the appointment to cancelled or no-show, and the resources free up. Bring it back to active, and they're occupied again. While the appointment is in a cancelled status, editing the date or service doesn't touch the resources.
One limitation is worth knowing: these automatic bookings are placed without a conflict check. That's deliberate β so creating an appointment never "loses" a resource. So an overlap doesn't stop the appointment from being saved, but it does show up on the map.
Conflicts
Being busy is defined in one place: a live, non-cancelled booking that references an existing visit or task, buffer included. Intervals are half-open, so a booking that ends exactly when the next one starts doesn't count as a conflict β back-to-back appointments are allowed.
When you book a resource by hand from the visit card and land on someone else's time, the server doesn't save the booking β it returns a list: exactly who the conflict is with, for which hours, and how many minutes overlap. Two buttons appear in the dialog β "Book anyway" (the booking is saved marked as a conflict and turns yellow on the map) and "Shift flexible ones". The second button only shows up if the conflicting booking has "flexible" priority; the system only agrees to shift bookings with "flexible" or "low" priority, and refuses the rest.
One honest caveat here: booking priority is only set through the API. From the interface every booking is created as ordinary, so in practice you'll see "Book anyway," and the shift button β unlikely.
Downtime: maintenance, breakage, "reserved by salon"
The "Station maintenance" button opens the resource's list of downtime periods. There are three reasons: "Maintenance", "Broken", "Reserved by salon". A start is required, the end can be left empty β that's a legitimate "until the work is done," not a forgotten field. While the downtime is active and blocking bookings, you can't book the equipment for that time.
"Complete" is a separate action, not a status edit: it also pulls the downtime's end to the current moment. Otherwise the chair would stay marked busy until the planned date of a repair that was already finished. Before this screen existed, a broken chair had to be hidden with the "Inactive" flag or deleted along with its booking history.
The resource map and load
The map shows a day, week, or month. The axis switches between "Equipment" and "Employees", and there's a filter by a specific resource, by booking type (visits or tasks), and a "Conflicts only" checkbox. A pink bar is a visit, purple is a task, yellow is a conflict; the page subtitle shows how many conflicting bookings are in the range. Clicking a bar opens the visit or task card right there, without leaving the page.
On the left, next to the resource's name, is a load percentage: busy minutes plus buffer, divided by the 8:00-to-21:00 window across every day of the range. It's a rough estimate, not a report.
A separate utilization report β with percentages by specialist and by equipment, including those with zero bookings for the period β exists only in the API (GET /v1/resources/utilization). There's no screen for it.
What online booking does with resources
Free slots for a client are calculated from the specialist's schedule, their time off, already-booked appointments, the "service Γ specialist" link, and the company's booking policy. Equipment doesn't take part in this calculation. If there's one machine and two specialists, the booking page will offer both options.
What happens next: once the appointment is created, the service's required equipment is booked automatically β and even if it's already busy, the booking is created anyway, flagged as a conflict. So online booking never loses the resource, but it won't protect you from an overlap either: you have to spot it on the map.
The appointment-creation API itself can do more: you can pass resource_id in the request body, and then that equipment's availability is checked under the same lock as the specialist's availability β the slot goes to only one of them. Our public booking page doesn't send that field: clients aren't offered a choice of room.
What to do
Only set up a resource for what's physically not enough to go around: a machine, a room, a wash station. A chair permanently assigned to one specialist shouldn't be a separate resource β it's already visible in her schedule.
Set the buffer where cleanup genuinely takes time, and set it on the equipment rather than keeping it in your head. Link equipment to the service instead of booking it by hand: that way the resource books itself and frees itself on cancellation.
And once a day, open the map with "Conflicts only" checked. Automatic bookings don't argue with you when an appointment is saved β they just honestly show the overlap here.
Comments
No comments yet. Ask your question β we answer within a day.