Appointment Types
The bookable service catalog for your scheduling module — each type defines the duration, concurrent capacity, and equipment-selection behavior for one kind of customer visit.
An appointment type is the template from which individual appointments are booked. Before a customer can schedule a visit, you need at least one type that says what the visit is — how long it takes, how many customers can be in that slot at once, which location it belongs to, and whether the customer can pick specific equipment. The actual appointment records simply point to a type and inherit all of those rules.
Types are per-location. A type is always tied to one location, so "60-min Fitting" at your downtown shop and "60-min Fitting" at your east-side shop are two separate types. This lets each location have its own schedule, capacity, and staff pool.
Creating an appointment type #
Navigate to Appointments → Appointment Types → New Appointment Type. The form collects a small but important set of fields:
- Location — which inventory location this type is offered at. Only locations with Enable Appointments turned on appear in the list.
- Name — the label customers and staff see, e.g. Initial Consultation or Equipment Fitting.
- Description (shown to customers) — what actually happens at the appointment, what to bring, and who it is for. Published on the public booking page under the name, and repeated on the review screen before the customer confirms. Write this. A name on its own is read cold by someone who has never dealt with you: in user testing "Equipment Loan" was read as a money loan and "Sales Consultation" as a sales pitch, and the customer avoided the option closest to what she wanted. The name can stay as it is if the description explains it.
- What it costs (shown to customers) — free text, published in the same two places. Leave it blank and the page says nothing at all; it never guesses at a price or implies one. Examples: "Free — nothing to pay for a loan.", "No charge for the visit; rental rates apply if you take equipment away." Write something here if you possibly can. A customer in user testing committed to an hour of private clinic time without ever being told whether it cost sixty dollars or two hundred and sixty, and named several people she knows who would have closed the tab at the first screen. "Free", "$95" and "we'll confirm the cost when we call" all beat silence. The field is prompted rather than required: a type with none shows a note on its own page saying the booking link publishes no price, and publishing without one on purpose is still perfectly allowed.
- Before your visit (shown after booking) — what to bring, when to arrive, whether a referral is needed, what happens if they cancel. Published on the confirmation screen, in the confirmation email and on the customer's "Your booking" page — after the booking, because that is where "right, what now?" gets asked. Leave it blank and none of those screens says anything; nothing here is written for you, because "arrive ten minutes early" is true of some businesses and wrong for others.
- Duration (minutes) — how long one appointment of this type takes. Must be at least 1 minute. This value drives scheduling math — back-to-back bookings are blocked unless this many minutes separate them. The public page renders it as "We set aside 1 hr 30 min for this appointment", because "90 minutes" on its own does not say whose 90 minutes it is.
- Staff who can take this appointment — the people qualified to run it. Availability is worked out from these people's diaries, so a type with nobody assigned cannot be booked online at all: the calendar has no one to offer and every date comes back full. Assigning somebody is necessary but not sufficient — each of them also needs a working week under Staff Availability, because a person with no hours set is bookable at no time. The Appointment Types list shows a Bookable column that distinguishes the two ("No — no staff assigned" against "No — nobody has working hours"), and the type's own page lists the staff assigned to it and warns when none of them is rostered.
- Concurrent Slots — how many appointments of this type can run at the same
time.
3lets three customers book the same 10:00 slot. Leave blank for unlimited (shown as ∞ in the list), which means online bookings are limited only by how many of the assigned staff are free. Set it to1for a one-at-a-time service; set it higher for group sessions or multi-lane setups. - Sort Order — where this type appears in the list customers pick from.
Lower numbers come first; leave every type at
0to sort them by name. Defaults to0, so you can ignore it entirely until you want a specific order. - Send Pre-Visit Form (hours before) — automatically email the pre-visit form this many hours before each appointment of this type. Leave blank — the default — and the form is only ever sent by hand from the appointment. Each appointment is sent at most one, and cancelled and past appointments are skipped, so changing this value never causes a customer to be emailed twice.
- Offer a start time every (minutes) — how far apart the times customers are shown are, independently of how long the appointment runs. A 90-minute type with this set to 30 offers 9:00, 9:30, 10:00 and so on; left blank, start times are spaced by the appointment length, which is what the scheduler did before this setting existed.
- Buffer before / Buffer after (minutes) — time held either side of the appointment for travel, setup or writing the visit up. It blocks the assigned person's diary without appearing on the customer's booking, and an appointment whose buffer would run past closing time is not offered.
- Remind the customer (hours before) — a list, not a single value: add
24for a reminder the day before, add2as well and they get another two hours out. Leave it empty — the default — and this type sends no reminders. Each lead time goes out once per appointment and is logged on it. See Reminders. - Also send reminders by text — sends the same reminder by SMS to the number on the booking. Only shown when the account has a Twilio connection; without a phone number on the booking, the email still goes.
- Allow Equipment Selection — when enabled, the booking flow can ask the customer (or the staff member creating the appointment) to choose specific equipment units for the visit. Useful when the appointment is tied to a particular tool or loaned asset.
- Offer this as a catch-all — for customers whose need isn't on your list. A catch-all is listed after your real services, under its own heading, and never asks the customer to choose equipment (nobody knows yet what the job needs). Name it whatever suits your business — "Something else", "Ask us for a quote", "General enquiry", "Diagnostic visit" — and add as many as you want.
- We travel to the customer — for work you do at the customer's address: a home visit, a site survey, a delivery and fit. Turning it on adds an address to the public booking form (street, town and postal code are required; a second line and a state are optional), and that address is then shown back on the customer's confirmation screen, in their confirmation email, on their "Your booking" page and on the appointment here, under Visiting address. Leave it off for anything the customer comes to you for — those bookings ask for no address at all, and their "Where" stays the location's own. Staff creating one of these by hand get the same address fields on the appointment form, left optional so a booking written up from a phone call can be recorded before the postcode is known.
- Question above the notes box — replaces the plain "Notes" label on the booking form with your own question, so you ask for what you actually need to know. On a catch-all it is required: a catch-all booking with nothing written on it is one nobody can prepare for. Leave it blank to ask for "Notes". Whatever you call it, the box carries a line naming your business and saying that only you see what is written and that it is published nowhere — a customer asked about her shoulder by an anonymous text area deliberately wrote less than she should have, and the practitioner knew less as a result.
- Next-step flags — Borrow → Loan, Rent → Rental, Purchase → Sales Order, and Return → Customer Return. Tick the flows this type is for; a confirmed appointment offers a one-click action to create each enabled document, pre-filled with the customer and requested equipment. The flags also narrow equipment selection — loan/rental types only offer returnable gear, purchase types only sale goods. See Appointments.
- Active — inactive types are hidden from booking forms and new appointment creation. Flip this off to retire a type without deleting it or affecting its historical appointments.
How availability is calculated #
Availability for a type at a given date and time is the lower of two values:
- Available staff — employees assigned to this type who don't already have an appointment at that exact slot.
- Concurrent slot cap — if set, the cap minus the number of appointments already booked at that time.
The model exposes openSlotsAt() and availableEmployeesAt() for this logic.
The public booking page offers a time only when that availability is above 0.
Tip: assigning staff to a type (via the pivot relationship) is the primary way to control capacity. If no employees are assigned, the public booking page offers no times, whatever the slot cap. The staff appointment form skips the staff count for such a type and offers the times that pass every other rule, limited by the cap only when one is set.
The appointment types list #
Appointments → Appointment Types lists every type with its Location,
Duration (min), Slots (∞ for unlimited), Order, and an
Active column reading Yes or No. The list defaults to sorting by sort_order, so the display
order you've configured is what you see. Use the Trashed filter to show
soft-deleted types if you need to restore one.
Tick the checkbox beside any number of types and the toolbar offers Mark Active and Mark Inactive, so a set of types can be switched on or off together rather than one edit form at a time. Both ask you to confirm first, and both act only on the types your role lets you edit: select types at two locations when your role covers one, and the rest are left alone and counted in the message you get back. Delete is on the same menu.
Editing and deactivating #
Open any type to view its details, then use Edit to change any field. To change nothing but the switch, tick the types on the list and use Mark Active or Mark Inactive from the toolbar.
Setting Active to off is the preferred way to retire a type, and it does not touch appointments already booked against it. Those keep their type and go ahead exactly as booked: reminders still go out, pre-visit forms are still sent, and neither the customer's "Your booking" page nor your own day sheet changes. What changes is only what is offered from then on — the type stops being listed on your public booking page, its direct booking link no longer opens on it, and it stops appearing in the Appointment Type list when a staff member books a new appointment.
A Delete action soft-deletes the record; it can be restored from the trashed filter view.
Active is not the same as bookable, and this is where people are caught out. A type you have just switched on still offers no times if nobody is assigned to it, or if the people assigned have no working hours — and the only symptom is an empty list of times. Marking types Active in bulk says so afterwards, naming how many of them still read No in the Bookable column. The two cases differ: a type with nobody assigned is not listed on the public booking page at all, while one whose staff have no hours is listed there and has nothing to offer. Assign staff on the type, then give each of them a working week under Staff Availability.
Relation to appointments and location hours #
Every appointment belongs to exactly one type. When a staff member creates an appointment, they first pick the Location, which filters the type list to only active types at that location. The opening hours for that location then constrain which dates and times are offerable — an appointment type may allow 60-minute bookings, but if the location closes at 5 pm the last slot will be cut off accordingly.
Appointment types also appear in the loan agreements module, where a loan or checkout can optionally be tied to an appointment.
Direct booking link #
An appointment type's page carries a Booking Link that takes a customer straight to the calendar with this type already chosen. The link is shortened on screen — the underlying URL carries record ids and is long — and the copy icon beside it puts the full address on your clipboard. Locations have the equivalent link on their own page, opening the calendar with every type on offer.
The section only appears when the location has Enable Appointments turned on.
Doing it from the API #
# List active appointment types at a location
curl "https://your-domain.com/api/v1/appointment-types?location_id=<location-id>&active=true" \
-H "Authorization: Bearer $TOKEN"
# Create an appointment type
curl -X POST "https://your-domain.com/api/v1/appointment-types" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location_id": "<location-id>",
"name": "Equipment Fitting",
"duration_minutes": 45,
"concurrent_slots": 2,
"allow_equipment_selection": true,
"is_active": true,
"sort_order": 10
}'
The list endpoint accepts a location_id query parameter (filter by location) and an active boolean to narrow results. Results are paginated at 50
per page and sorted by sort_order. A DELETE request soft-deletes the type;
existing appointment records that reference it are preserved.