Services & Staff
The Services page is the catalog that powers everything else in Appointments. Before anyone can book — online or at the front desk — you define your menu of bookable treatments here: what they are, how long they take, what they cost, who can perform them, and whether customers can see them online.
Overview
The Services catalog answers three operational questions that drive the whole module:
- What can a customer book? — the list of services (treatments) on your menu.
- How long does each one take? — the duration (plus buffers), which lets the calendar find free time slots and block the schedule correctly.
- Who is qualified to perform it? — the providers (staff) assigned to each service. Only assigned staff are offered when booking that service.
The two panels on one page
The Services page is split into two lists side by side, each a table with its own Add button and refresh:
Your treatment menu. Columns: Name, Category, Duration ("N min"), Price, Providers (count of assigned staff), Visibility (Public/Private), Status (Active/Inactive), and an actions gear. Sorted by Name A→Z. Header has an Add Service button (plus-circle).
A grouping layer such as "Hair", "Nails", "Facials" that organizes and color-codes the menu. Columns: Name (with a color swatch), Services (count in that category), Status, and an actions gear. Header has a small Add Category button.
Per-row actions
Each row exposes small action icons (hidden if you lack the matching permission):
| Icon | On | Does | Permission |
|---|---|---|---|
| ✏️ Pencil | Service & Category | Edit — opens the modal pre-filled. (Clicking the Name does the same.) | Services · Update |
| ???? Users | Service only | Assign Staff — map which providers can perform this service. | Services · Update |
| ✖ Times / X | Service & Category | Delete (soft delete) after a confirm prompt. | Services · Delete |
Service categories (SOP)
A service category is a grouping label used to organize and color-code the menu. It has its own name, color, sort order, and Active/Inactive status. Categories are ordered by Sort ascending, then by Name.
SOP · Create a service category
Actor: Manager
-
Open the Services page
Left menu → Appointments → Services.
-
Click "Add Category"
In the right-hand Service Categories panel, click the Add Category button (plus-circle). The category modal opens blank.
-
Enter a Name
Required — for example Hair, Nails, or Facials. The field is autofocused.
-
Pick a Color
Use the color picker (defaults to brand teal
#1d97a6). This becomes the small swatch shown next to the category name in the list and helps color-code the menu. -
Set Sort (optional)
A number (min 0, default 0). Lower numbers appear first. Use it to control the order categories are listed in.
-
Leave Status = Active, then Save
Click Save (check-circle). Only Active categories appear in the service Category dropdown, so keep new ones Active. You'll see the toast "Record saved." and the new row — with its color swatch — appears immediately without a page reload.
Editing & deleting categories
Edit: click the category name or the pencil icon, change the fields, Save — the row refreshes in place.
Delete: click the times/X icon and confirm. This is a soft delete — the row disappears from the list but the data is retained.
Creating & editing services (SOP)
A service is a single bookable treatment with a name, duration, price, optional category and color, buffers, visibility, and a set of qualified providers. Add or edit one from the service modal.
SOP · Add a new service
Actor: Manager or Front desk (with create permission)
-
Click "Add Service"
In the left Services panel header, click Add Service (plus-circle). The service modal opens blank with the cursor in the Name field.
-
Enter the Name
Required — the display name customers and staff will see, e.g. Gel Manicure.
-
Pick a Category (optional)
Select2 dropdown; the first option is blank (- Category -). Only Active categories appear. Leave blank if the service has no group.
-
Set the Duration (minutes)
Required. Defaults to 30, minimum 5, in steps of 5. This drives calendar slot sizing — see Duration & buffers explained below.
-
Set Buffers — Before / After (optional)
Two side-by-side number fields (min 0, default 0) for setup and cleanup padding. Only fill these in if the service needs turnaround time.
-
Enter the Price
Placeholder
0.00. Type numbers or a formatted currency string — the system stores the numeric value. Blank saves as 0. -
Choose a Color and confirm Status
The color picker defaults to teal
#1d97a6and helps distinguish the service on the calendar. Status defaults to Active. -
Decide Public vs Private
The Public checkbox is checked by default. Leave it checked to show the service on the online booking page; uncheck it for internal-only (Private) services. See Public vs private services.
-
Add a Description (optional), then Save
A 3-row textarea for extra detail; saved as empty if blank. Click Save (check-circle). The new row is injected into the Services table and you see "Record saved."
-
Assign at least one provider
Back on the row, click the Assign Staff (users) icon and add the providers who can perform it — otherwise the service is unbookable. See Assigning providers/staff.
Editing a service
Click the service name or the pencil icon to reopen the modal pre-filled. Change any fields and Save — the row updates in place with a "Record saved." toast. Every change here (Public flag, Active status, provider assignment) is exactly what changes what customers see online.
SOP · Retire a service without losing its history
Actor: Manager
-
Edit the service
Open it from the Name or pencil icon.
-
Set Status to Inactive (or just uncheck Public)
Choose Inactive to pull it out of use entirely, or leave it Active and simply uncheck Public to remove it only from online booking while keeping it available at the front desk.
-
Save
The service is retained for reports and past appointments, but no longer offered.
Duration & buffers explained
Duration and buffers are what let the availability engine block the calendar correctly and offer only truly free start times. Understanding them prevents impossible back-to-back bookings.
How duration works
Duration is how long the service takes, in minutes. It sizes the appointment block on the calendar and is used to compute which start times are still open. It is clamped to a 5-minute minimum, and a blank or zero duration falls back to 30 minutes rather than saving 0.
How buffers pad the schedule
A buffer is turnaround padding attached to the service: Buffer Before reserves setup time before the service starts, Buffer After reserves cleanup/turnover time after it ends. When the availability engine checks for conflicts, it pads busy intervals on both the existing appointment and the new one, so two services can't overlap into each other's prep or cleanup time.
The spacing between the start times customers are offered is governed separately by the Slot interval setting on the Settings page (e.g. every 15 minutes). Duration and buffers decide how much time each booking consumes; the slot interval decides how the remaining free time is divided into offer-able start times.
Related: appointments excluded from availability calculations include Cancelled and No Show. See the Calendar page for how slots surface at booking time.
Assigning providers/staff (SOP)
A provider is the staff member who performs a service. Assigning staff to a service is what makes it bookable: only staff explicitly assigned to a service are offered when a customer or front-desk agent books it. A service with zero providers is effectively invisible to booking.
SOP · Assign staff to a service
Actor: Manager
-
Open Assign Staff
On the Services list, find the service and click the users icon on its row. The modal header reads "Assign staff to service: <service name>".
-
Select the providers
In the Providers multi-select (Select2), every active staff user is listed by full name. Currently-assigned staff are already selected. Add the newly-qualified staff and/or remove anyone who no longer performs the service.
-
Save
Click Save (check-circle). The Providers count on the service row updates immediately and you see "Record saved." The service is now bookable with the assigned staff.
"Any available provider" — how it flows from here
When a booking is made without pre-selecting a provider — the Any available provider option — the system pools every staff member assigned to the service and offers their combined open times. Picking a specific slot then assigns whichever provider that slot belongs to. That pool is exactly the list you set here, so the Assign Staff mapping directly controls both named-provider bookings and "any available" bookings. Leaving the provider blank at booking time on the Calendar is what triggers this pooled behavior.
Public vs private services
Visibility controls whether a service reaches the customer-facing online booking page.
SOP · Make a service bookable online (public)
Actor: Front desk or Manager
-
Edit the service
Open it from its Name or the pencil icon.
-
Confirm Status is Active
An Inactive service will not appear online even if Public.
-
Check the Public checkbox
This adds the service to the public booking page. Then Save.
-
Assign at least one active provider
Click the users (Assign Staff) icon, select one or more active providers, and Save. Without a provider the service produces no bookable slots even when public and active.
A note on resources
A resource is a bookable room, chair, or piece of equipment that can be reserved alongside the provider for an appointment; only active resources are selectable. Resources are chosen on the appointment itself rather than configured on this Services catalog screen — see the Calendar & Appointments page for how a resource is attached to a booking.
Field reference
Every field across the three modals — Service, Category, and Assign Staff — with its meaning and gotchas.
Service fields
| Field | Required | Meaning & notes |
|---|---|---|
| Name | Yes | Display name of the bookable service (e.g. "Gel Manicure"). Autofocused; validated client- and server-side. |
| Category | No | Optional group; drives grouping and the category color. Select2 dropdown listing only Active categories; first option is blank ("- Category -"). Blank saves as none. |
| Duration (minutes) | Yes | How long the service takes; sizes the block and finds slots. Min 5, step 5, defaults 30. Blank/zero falls back to 30. Must be numeric. |
| Buffer Before (minutes) | No | Setup pad reserved before the service. Min 0, default 0. Affects slot spacing so appointments don't overlap. |
| Buffer After (minutes) | No | Cleanup/turnover pad reserved after the service. Min 0, default 0. |
| Price | No | Default price charged. Placeholder 0.00; accepts a formatted currency string (stored as a number). Blank saves as 0. |
| Color | No | Color used to distinguish the service (e.g. on the calendar). HTML color picker; defaults to teal #1d97a6. |
| Status | No | Active / Inactive. Defaults Active. Inactive shows a grey badge and is not offered. |
| Public | No | Checkbox — shows the service on the public booking page. Checked by default on a new service. Unchecked = Private (internal only). |
| Description | No | Free-text detail. 3-row textarea; saved as empty if blank. |
Category fields
| Field | Required | Meaning & notes |
|---|---|---|
| Name | Yes | Display name of the category (e.g. "Hair"). Autofocused; validated client- and server-side. |
| Color | No | Swatch shown before the category name in the list. HTML color picker; defaults #1d97a6. Rendered as a small square swatch. |
| Sort | No | Ordering weight. Number, min 0, default 0. Categories order by Sort ascending, then Name. |
| Status | No | Active / Inactive. Defaults Active. Only Active categories appear in the service Category dropdown. |
Assign Staff field
| Field | Required | Meaning & notes |
|---|---|---|
| Providers | No | The staff qualified to perform the service. Multi-select of active staff by full name. Saving replaces the entire set (add/remove in one save); an empty selection removes all assignments. Only assigned staff are offered at booking. |
List badges & swatches
#1d97a6.
Who can do what (permissions)
| Capability | Permission | What it gates |
|---|---|---|
| View the catalog | Services | Opening the Services page. Without it the page is not accessible (and the module must be enabled). |
| Create | Services · Create | The Add Service and Add Category buttons. |
| Update | Services · Update | The pencil (Edit) and users (Assign Staff) icons and their save paths. |
| Delete | Services · Delete | The times/X (soft-delete) icon. |
Tips & gotchas
The Providers column flags services no one can perform (0). The category's Services count tells you how many services live under it — worth a glance before you delete a category.
Distinct category colors and per-service colors make the calendar and the menu easy to scan at a glance.
Three conditions must all be true: the service is Active, it is Public (checkbox ticked), and it has at least one assigned provider. A public, active service with zero providers produces no bookable slots. Fix whichever is missing, then re-check the portal.
Why can't I pick a category on a new service?The Category dropdown only lists Active categories. If the one you want is Inactive (or doesn't exist yet), it won't appear. Activate or create the category first — see Create a service category.
I deleted a category and now some services show "-" for Category. What happened?Deleting a category does not reassign its services. They keep their internal link, but because the deleted category is dropped from the join, the Category column resolves to "-". Edit each affected service and pick a new category to fix the display.
I opened Assign Staff and now a provider is gone — why?The Assign Staff modal replaces the whole provider set on Save. If a selection was accidentally cleared before saving, those providers were removed. Re-open the modal, re-add them, and Save — the system handles re-adding a previously-removed person cleanly (no duplicates).
A staff member isn't in the Providers picker.The picker lists only active staff users (by full name), not customers and not inactive or deleted staff. If a provider was deactivated after being assigned, their assignment is retained internally but hidden from both the count and the picker.
I entered 0 (or left Duration blank) — why did it save as 30?Duration enforces a 5-minute minimum (min 5, step 5) and a blank or zero value falls back to 30 minutes rather than saving 0. This prevents a zero-length booking that the calendar couldn't size.
My Price didn't save the way I typed it.Price is a free-text field that passes through currency un-formatting. Type numbers or a currency string (e.g. 1,200.00), not words. Blank saves as 0.
No — deletes here are soft deletes. The row disappears from the lists but the data is retained. If a delete fails you'll see "This record cannot be deleted." When a service has history, prefer setting it Inactive or Private instead of deleting.
Why aren't my back-to-back slots offered?Buffers pad both appointments. A service with a Buffer After reserves that cleanup time, so the next slot for the same provider can't start until the buffer clears. That's intentional — see How buffers pad the schedule. If the padding is too generous, reduce the buffer.
Is this the same as the public booking page?No. This is an admin/staff screen only, separate from the public portal at /appointments/book/…. What you change here — the Public flag, Active status, and provider assignments — is precisely what changes what customers see online.
Related pages
How duration, buffers, and provider assignments surface as bookable slots.
The customer's view — where Public + Active services with providers appear.
Bundle services into prepaid packages and memberships.
Slot interval, lead time, booking horizon and other per-tenant controls.
Definitions for service, duration, buffer, provider, public/private and more.
The full setup-to-checkout SOPs that build on this catalog.