Calendar & Appointments
The core daily workspace for the front desk. See who is booked with which provider at what time, create and edit bookings from the admin side, and move every appointment through its full life-cycle — from a fresh Pending request to a settled Completed visit. This page also covers recording the products you used or sold, rescheduling, cancelling, handling no-shows, and pulling up a customer's history.
The calendar workspace
Open Appointments from the left menu to land on the workspace. It stacks two views of the same bookings on one page: a colour-coded calendar on top and a filterable appointments list below. Most of your day happens here.
The calendar panel
The calendar shows every booking as a coloured block. The colour is the appointment's status, and each block is labelled Customer name — Service.
| Control | What it does |
|---|---|
| Prev / Next / Today | Move the calendar back or forward, or jump straight back to today. |
| Month / Week / Day | Switch the view. Week is the default; Day is best for a busy single day. There is no all-day row, and the grid uses 30-minute time slots. |
| Click an empty day/time | Opens a new-appointment form pre-filled with the date and time you clicked — the fastest way to start a booking. |
| Click an existing block | Opens that appointment's read-only detail card with its life-cycle buttons. |
The appointments list & status filter
Below the calendar is a table of appointments with these columns: Customer, Service, Provider, Date, Status, and an actions column (the gear/bars icon) for opening, editing, or deleting a row. A refresh button reloads the table.
Above the table are status filter checkboxes. By default the list shows the working set — the appointments you still need to act on — and hides the ones that are already done or gone:
| Status filter | On by default? |
|---|---|
| Pending | Yes |
| Confirmed | Yes |
| Checked In | Yes |
| In Progress | Yes |
| Completed | No |
| Cancelled | No |
| No Show | No |
Today's Appointments widget
You don't always need to open Appointments to see what's on. The main dashboard carries a Today's Appointments panel (with a calendar-check icon) that lists the day's bookings at a glance. Each row shows the start time, customer name, service summary, and a status chip; when the day is empty it simply reads "No appointments today."
Appointment statuses & life-cycle
Everything in Appointments is driven by the status. The status decides the calendar colour, which buttons appear on the appointment card, and what happens behind the scenes (stock, commission and loyalty on completion; entitlement release and waitlist alerts on cancellation). There are seven statuses: five along the normal path plus two off-ramps.
Off-ramps from any active status: Cancelled · No Show
Status legend
The same colours are used everywhere — on the calendar block and on the chip in the list, the card, and Customer History.
#f0ad4e. The only next action offered is Confirm.
#1d97a6 (brand). Can be Checked In, Completed, No Show, or Cancelled.
#5bc0de. Can move to Completed, No Show, or Cancelled.
#5bc0de (same as Checked In). Set via the Status dropdown on the edit form — there is no dedicated button. Can move to Completed, No Show, or Cancelled.
#5cb85c. Terminal; no further transition buttons. Hidden by default in the list filter.
#d9534f. Terminal; hidden by default.
#777777. Terminal; excluded from availability and workforce workload; sends no email. Hidden by default.
Status transitions (who/when)
Each transition has a button on the detail card, and each button only appears when the appointment is in a status that allows it. All of these require the appointments_update permission (admins bypass permission checks entirely).
| Button | From status | Moves to | Who / when | Side effects |
|---|---|---|---|---|
| Confirm | Pending | Confirmed | Front desk, when an online/pending request is accepted. | Emails the customer a confirmation. |
| Check In | Confirmed | Checked In | Front desk, when the customer arrives. | None. |
| (Status dropdown) | Confirmed / Checked In | In Progress | Optional, when the service actually starts. Set on the edit form's Status dropdown — there is no card button. | None. |
| Complete | Confirmed / Checked In / In Progress | Completed | Front desk, when the visit ends. | Captures commission, decrements back-bar stock (if applicable), awards loyalty points — each exactly once. |
| No Show | Any active status (not already Cancelled / Completed / No Show) | No Show | Front desk, after the grace period when the customer doesn't turn up. | None; sends no email. Excluded from availability & workload. |
| Cancel | Any active status (not already Cancelled / Completed / No Show) | Cancelled | Front desk / manager, when the booking is called off. | Captures a reason; emails the customer; releases entitlements (unless invoiced); alerts matching waitlist entries. |
By design, the card jumps from Confirmed/Checked In straight to Complete. In Progress is optional and set from the Status dropdown on the edit form if you want to track that a service is actively underway.
Can I jump straight to Completed without checking the customer in?Yes. Complete is offered from Confirmed, Checked In, and In Progress — you don't have to pass through Check In first.
What emails go out, and when?Confirming emails the customer a confirmation. Saving a brand-new booking as Confirmed also emails the assigned provider (editing an existing one does not re-email the provider). Cancelling emails the customer and notifies matching waitlist entries. No Show sends nothing. Emails only reach the customer if a resolvable email is on the booking.
Does cancelling a completed visit reverse the money and stock?Cancel is only available before a visit is completed — Completed is terminal. And even in general, loyalty points and already-committed back-bar stock are never clawed back — a completed visit is treated as settled. Cancelling only releases package entitlements, and only if no invoice exists yet.
Booking an appointment (SOP)
You book from the Add / Edit Appointment form (a modal). Every booking needs one primary service (which sets the duration and price), a provider (or "any available provider"), a date, a time chosen from real available slots, and a customer.
The booking form, field by field
| Field | Required | Notes |
|---|---|---|
| Service | Yes | Only active services appear. Sets the duration & price and, together with the date, triggers the live slot lookup. Duration has a 5-minute minimum. |
| Provider | No | Leave blank to let the customer pick any available provider — the chosen slot then decides which provider is assigned. Only active staff appear. |
| Date | Yes | Date picker; pre-filled when you click a day on the calendar. Changing it reloads the available times. |
| Time | Yes | Not free-text. Populated by an availability lookup after Service + Date are set. When no provider was picked, each option also shows the provider name. |
| Resource | No | An optional room/chair/equipment to reserve. Defaults to "None"; only active resources appear. |
| Customer (dropdown) | No | Lists existing customer accounts as "Name (email)". Selecting one auto-fills the Customer Name field if it was blank. |
| Customer Name | No | Display name on the booking (for walk-ins, or to override an account's name). Stored on the appointment either way. |
| No | The trigger for auto-creating a new customer: a valid email with no existing match creates an account (name split from Customer Name). An existing email is reused. Required for confirmation/reminder emails to arrive. | |
| Phone | No | Stored on the appointment (and on the new account if one is created). |
| Status | No | Defaults to Confirmed on a new booking. Saving as Confirmed emails the customer. |
| Notes | No | Customer-facing notes, shown on the detail card. |
| Internal Notes | No | Staff-only notes; never shown to the customer. |
SOP · Book a walk-in / phone appointment
Actor: Front desk. Permission: appointments_create.
-
Open the booking form
On the calendar, click the desired day/time to pre-fill the date and time, or click Add Appointment (top-right; hidden if you lack create permission).
-
Pick the Service
Choose the primary service. This sets the duration and price and, with the date, starts the live slot lookup.
-
Choose the Provider (or leave it blank)
Select the staff member who'll perform the service, or leave Provider blank for "any available provider" — handy for phone bookings when the customer doesn't care who.
-
Confirm the Date, then pick a Time
Check the date, wait for the Time dropdown to load real available slots, and pick one. If you left Provider blank, each slot also shows which provider it belongs to.
-
(Optional) Reserve a Resource
Choose a room/chair/equipment if the service needs one.
-
Attach the customer
Pick an existing customer from the dropdown, or type a Name + a valid Email to auto-create an account, or just type Name/Phone for a no-account walk-in.
-
Set status & notes, then Save
Leave Status as Confirmed (or set Pending), add customer-facing Notes and staff-only Internal Notes as needed, and click Save. The row and calendar refresh; a confirmation email goes to the customer if saved as Confirmed.
SOP · Confirm an online booking (arrived as Pending)
Actor: Front desk. Permission: appointments_update.
-
Find the new booking
The Pending filter is on by default, so a fresh online booking shows in the list and on the calendar (amber).
-
Open and Confirm
Open the card and click Confirm. This emails the customer their confirmation and moves the booking to Confirmed — into your working set.
Managing line items / products used
After (or during) a visit you can record the products you consumed behind the chair or sold to the customer. Open the Items Used modal with the Manage Items button on the appointment card. This is also where the eventual checkout gets its billable retail lines.
The three line types
The Add Item form
| Field | Required | Notes |
|---|---|---|
| Type | Yes | "Back-bar use" or "Retail sale". Retail shows a Retail price field; consumption shows a Unit cost field. |
| Product | Conditional | The stock product used/sold. Pick a product or type a Description — at least one is required. Only picking a real stock product can decrement inventory. Empty unless the Warehouse module is on. |
| Description | Conditional | Free-text label; required if no product is selected. A typed-description line never touches inventory. |
| Quantity | Yes | How many units were used/sold; must be greater than 0. |
| Unit cost | No | Shown only for Back-bar use. Not billed to the customer. |
| Retail price | No | Shown only for Retail sale. Consumption lines are priced 0. |
SOP · Complete an appointment (with items)
Actor: Front desk. Permission: appointments_update.
-
Check the customer in
When they arrive, open the card from the calendar or list and click Check In (moves Confirmed → Checked In).
-
Record products BEFORE completing
Click Manage Items and add any Back-bar use (consumed) and/or Retail sale lines. Do this before Complete so completion captures stock and the checkout invoice includes everything. Set Quantity > 0 and either pick a Product or type a Description.
-
Complete the visit
When the service ends, open the card and click Complete. The status turns green and the visit is settled.
-
What completion does automatically
Completion captures per-service commission, decrements back-bar stock (only if Warehouse is on and a default warehouse is set), and awards loyalty points — each exactly once, so a retry can't double-count.
Reschedule / cancel / no-show (SOPs)
SOP · Reschedule an appointment
Actor: Front desk / manager. Permission: appointments_update. There is no separate "reschedule" button — you simply edit the booking and re-pick the time.
-
Open the appointment and Edit
Open the card and click Edit to reopen the booking in the form, pre-loaded with its current values.
-
Change the date and/or provider
Pick a new Date (and a different Provider if needed). Changing the service, provider, or date reloads the slot list and clears your old time selection.
-
Pick a new available Time
Choose a fresh slot from the reloaded Time dropdown.
-
Save
Click Save. Re-saving re-runs the slot validation and rewrites the service line; the calendar and list refresh. Editing an existing booking does not re-email the provider.
SOP · Cancel with a reason
Actor: Front desk / manager. Permission: appointments_update.
-
Open the card and click Cancel
Cancel is available from any active status (not already Cancelled, Completed, or No Show).
-
Enter a cancellation reason
A browser prompt appears. Type the reason (or leave it blank). Pressing Esc on the prompt aborts the cancel entirely.
-
What happens next
The appointment turns red (Cancelled) and a cancellation email is sent to the customer. Any package sessions the booking used are returned to the customer — unless an invoice was already created. Matching waitlist entries for that service/date/provider are emailed that a spot opened.
appointments_delete) soft-deletes it and its lines but performs no stock/loyalty/entitlement reversal — so use Cancel when you need those effects handled properly. Loyalty points and already-committed back-bar stock from a prior completion are intentionally never reversed.
SOP · Handle a no-show
Actor: Front desk. Permission: appointments_update.
-
Wait out the grace period
Give the customer your usual buffer before recording the no-show.
-
Open the card and click No Show
No Show is available from any non-terminal status.
-
Done
The chip turns grey (No Show). The visit is excluded from availability and workforce workload. No email is sent.
Customer history
Whenever a booking has a linked customer account, the card carries a Customer History button that opens a CRM snapshot. It's the fastest way to know a customer before you upsell or serve them. (The button is hidden for account-less walk-ins.)
The modal also shows:
- Header — customer name, email, and phone.
- Active packages — each package name with its expiry date (if the customer has any).
- Visit history table — Date, Service, Provider, Status (as a coloured status label), and Amount. Only Completed visits count toward the Visits count and Total spend.
- Reviews — each past review's gold star rating (★
#f0ad4e), service name, and comment.
The appointment detail card (reference)
Clicking any calendar block or list row opens the read-only detail card. It summarises one appointment and gives you every action in one place.
- Summary — coloured status chip, customer (name, email, phone), service, provider, date/time with duration in minutes, resource (if set), and Notes / Internal Notes (if set).
- Items table — item/service name, quantity, and price for each line (when any exist).
- Life-cycle buttons (shown conditionally by status) — Confirm, Check In, Complete, No Show, Cancel.
- Commit Items to Stock — only when a completed appointment still has uncommitted back-bar consumption and Warehouse is enabled.
- Customer History — only if a customer account is attached.
- Checkout — only with the
appointment_checkoutpermission; opens the Checkout modal. - Manage Items — opens the Items Used modal.
- Edit — opens the edit form (used for rescheduling).
Tips & gotchas
Quick tips
Click a day/time to open the form pre-filled with that date and time — faster than typing.
Leave Provider blank when the customer doesn't care who — each slot shows its provider and picking a time assigns them.
Selecting an account auto-fills the name; you can still override the displayed Customer Name without changing the account.
Put anything the customer shouldn't see (allergies to double-check, payment reminders) in Internal Notes; Notes are customer-facing.
Record retail and back-bar via Manage Items before clicking Complete so stock and the invoice include everything.
A quick cancel emails matching waitlist customers that a spot opened — it helps someone else grab the slot.
Gotchas to watch for
The Time field only lists slots the availability engine returns. "No available times for this date." means the provider is fully booked or off — pick another provider (or "any available provider") or a different date. Remember you must choose a Service and a Date before any times load, and changing service/provider/date reloads the slot list and clears the old selection.
A confirmation email never arrivedThe confirmation only sends when the customer has a resolvable email. A booking saved as Confirmed with no email simply won't notify. New customer accounts are created only when a valid email is entered and no account already matches.
Completion side-effects don't fire / seem doubledStock decrement, commission, and loyalty fire only when moving to Completed. They're latched to run once — re-completing won't double-apply, and there's no automatic reversal on a later cancellation.
Back-bar stock isn't decrementingStock moves only if the Warehouse module is enabled and a Default Warehouse is set in Settings and the line references an actual stock product. A typed-description line never touches inventory. If Warehouse is off, the items modal shows a notice and stock is untouched — use Commit Items to Stock as a retry once it's back.
Cancelling didn't return the package sessionCancelling releases package entitlements only if no invoice exists yet. Once invoiced, the covered line was already excluded from billing, so it isn't reversed.
A short/zero-duration service still books a blockService duration is forced to a 5-minute minimum. A mis-configured 0 or very short service still books a 5-minute block; a blank/zero duration falls back to 30 minutes when computing slots.
I can't find In Progress on the cardIn Progress has no dedicated button — set it via the Status dropdown on the edit form. The card jumps from Confirmed/Checked In straight to Complete.
Delete vs CancelDeleting soft-deletes the appointment and its lines but performs no stock/loyalty/entitlement reversal. If you need those effects handled, Cancel instead of Delete.