Appointments & Scheduling
Schedule customer appointments by type, capture pre-visit forms, and keep an eye on the day from the appointments dashboard.
The Appointments module schedules customer-facing visits and the information you need before they happen.
In this section #
Detailed guides for everything covered here:
- 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.
- Opening Hours — Per-location opening hours that tell the scheduler which time slots are available — set the regular week on one screen, with date-range overrides for holidays and seasonal closures.
- Staff Availability — Each person's own working week and their time off, which narrows the location's hours to the times somebody is actually there.
Where the booking settings live #
Everything that governs online booking sits on the location: its public booking link, its opening hours, its appointment types and capacity, and the support and cancellation email addresses.
Open Appointments → Locations to reach them. That list shows the locations you have made bookable, with the count of appointment types and opening-hours rules on each, so you can see at a glance which ones are ready to take bookings. Click a location to open it and find its booking link.
The same locations also appear under Inventory → Locations, which lists every location including the ones that take no bookings. It is one set of records reachable from two menus — not two separate lists to keep in step.
To make a new location bookable, open it and turn on Enable Appointments; it then appears in the Appointments menu too.
Appointment types #
Define appointment types (the kinds of visits you offer) with their own settings, and set opening hours so scheduling respects when each location is open.
Scheduling #
Book appointments against a customer, type, location, and time. An appointment can link to a sales order, tying the visit to the work it's for.
Equipment selection #
When an appointment type allows equipment selection, the public booking page lets the customer pick in-stock units to reserve for their visit. Only units in inventory categories marked Available for Appointment Selection appear, and the list is narrowed to what the type is for — returnable gear for loan/rental types, sale goods for purchase types. Each picked unit is placed on hold for the appointment; the hold is released automatically if the appointment is cancelled or marked a no-show — from the app, the customer portal, or the API.
A hold also expires on its own. A day after the appointment was due to finish, anything it still holds goes back into stock, so gear is not left reserved behind a booking that has been and gone — one nobody turned up for, or one marked completed without being turned into a loan, rental or order. The release is written to the unit's movement history as a Hold Released against that appointment, exactly as a cancellation would be, and it never touches a unit some later booking has since claimed.
A catch-all appointment type never asks for equipment, on the booking page or in the customer portal, even if equipment selection is switched on: a catch-all exists because nobody yet knows what the job needs.
The list is searchable, and the count beside each item reads "n in stock now" — it is stock on hand at that moment, not a promise about the day booked, so it says which. Ticking something and then searching does not lose the tick.
Underneath is "The item I need isn't listed": a free-text box that is stored in the appointment's notes as "Equipment requested but not listed: …", and shown on the review screen before the booking is confirmed. Without it a customer whose item is not on the list has no way through the step at all.
The public booking page #
Each bookable location has a public page at /book/{location} (the Public
booking link on the location) where anyone can book without an account. It runs
in four numbered steps — choose an appointment, pick a day and time,
your details, check and confirm — with the chosen type, day and time kept
on screen throughout, and a progress bar so nobody has to guess how much is left.
Nothing is booked until the final Confirm. Step 4 is a review of everything chosen: what, when (and how long is set aside), where, the name and company and contact details given, the answers to the type's own questions, any equipment requested, and what it costs. It used to be possible to create an appointment straight off the equipment list without ever being shown a summary — and, later, to reach a review that quietly left out the company and the one answer the business had made compulsory.
What each type is comes from its description and pricing note — write both, or the page can only show a name and a duration.
After the booking, the confirmation screen, the confirmation email and the "Your booking" page all carry the type's Before your visit note — what to bring, when to arrive, whether a referral is needed, the cancellation policy. Nothing appears unless you have written it: none of that is invented for you.
The calendar distinguishes the two reasons a date cannot be picked, which used to render identically:
- Fully booked — the location is open, but there is no free slot. Try another day.
- Closed — the location does not open then. Trying again is pointless.
- Dates outside the type's lead time or maximum advance are simply not offered yet, and are not labelled as either.
Each of those carries a mark as well as a colour, and says what it is in words to anyone reading by screen reader — the key used to read "Selectable / Amber / Grey" to them, and inside the grid the colour was the only difference at all. The key underneath explains the marks, and the location's weekly opening hours are printed below the calendar. Months that are entirely over cannot be paged into: the back arrow stops at the month the customer is in, because a grid of struck-out dates reads as a broken calendar rather than as the past.
The notes box on the details step names your business and says that only you see what is written there and that it is published nowhere. A customer asked about her health by an anonymous text area writes less than she should.
Because a booking page is often the first thing a stranger sees:
- It is branded with your business. The heading and the browser tab carry the account name; the location is named underneath, so a customer of a two-location business still knows which one they are booking. Location names are internal records — a page headed "Downtown Studio (Online Booking)" reads to a first-time visitor as the wrong website.
- Where and how to reach you are shown throughout. The location's address and support phone appear in the page header, on the confirmation, and in the confirmation email. If the location has no address, the page says so plainly rather than presenting the location's name as a destination. Turning Enable Appointments on therefore makes the location's address and support phone required — see Locations. Where you have published no phone number, nothing on the page invites the customer to ring: it names the email address instead, rather than telling somebody to call a number that isn't there.
- When you travel to the customer, the page asks where. An appointment type marked We travel to the customer collects a street address, town and postal code on the details step, and the "Where" on every screen afterwards becomes We are coming to you plus that address — rather than your location, and never "check with us before you set off", which is advice for a journey the customer is not making. Types the customer comes to you for are unchanged and ask for no address.
- The same person cannot book the same slot twice. If the email on the form already has a live booking overlapping the chosen time at that location, the page says so instead of creating a second one, and offers to pick a different time or to email the details to that address. It does not display the booking: anyone can type anyone's address into a public form, so the details go to the mailbox rather than to the screen (throttled to three sends an hour per address). Capacity is unaffected — a different customer can still take the same slot for as long as staff are free.
- The email address is checked properly.
name@exampleis refused as well asname@, and the message appears on the page rather than in a browser tooltip.
Keeping the booking page private #
The public booking page is open to anyone with the link, so it is careful about what it will confirm.
Duplicate bookings. If the address entered already holds a booking for the same service at the same time, the page says so rather than taking a second one. That check is deliberately narrow: it matches the address actually typed on the booking, for the same appointment type. A booking for a different service, or one made under a different address, is neither mentioned nor blocked.
Rate limiting. Checks are limited per address and per network. Somebody working through a list of addresses is stopped within a few attempts and shown a "try again shortly" page that says nothing about any address. Attempts are recorded — hashed, never the address itself — so a sweep can be spotted after the fact.
Email verification. Where the fact of having an appointment is itself private — a clinic, a therapist, anything health-related — turn on Require email verification before booking on the location. The customer is emailed a six-digit code and the booking is taken only once they enter it. Nothing about any address is looked up or said until that code is entered, so the page cannot be asked about anybody. It also stops someone booking in a stranger's name and having your confirmation land in their inbox.
It adds one step to every booking, so it is off unless you turn it on.
Timezones #
Each bookable location has a timezone — the clock its opening hours and appointment times are read off. Set it under Location → Appointments. Leave it blank and the location uses your account's timezone, and failing that the system default, so a single-location business never has to think about it.
It matters as soon as anybody is not standing in the same place as you:
- The booking page names the clock. Times are always the location's, and the page says so — "10:00" with nothing after it is the most expensive ambiguity a booking page can have.
- A visitor elsewhere sees their own time too. The page reads the timezone from their browser and prints their local time under each slot, and there is a picker to change it. Nothing is guessed from an IP address, which a VPN gets wrong.
- Every screen and message that states a time names the clock — the booking page, the review step, the confirmation, the "Your booking" page, the reschedule picker, the customer portal, the reminder email, the reminder text (as "2:00 PM MDT", which is all a text has room for) and the emails that reach your own staff. A business running two locations reads those staff emails in one inbox, where "2:00 PM" means a different afternoon at each of them.
- Calendar invitations carry the real instant, so the entry lands at the right moment in the customer's diary wherever they are.
- Lead times, booking windows and "has this already happened?" are all measured on the location's clock. A location several hours from the server used to have its "today" decided by the server for part of every day, which moved both the earliest and the latest bookable date — and made a booking read as past, or as still to come, hours either side of the truth. A location behind the server was told an appointment could no longer be changed online while it was still that afternoon; a location ahead of it went on offering to move bookings it had already sat through.
Putting it in the customer's calendar #
Every booking is offered as a calendar entry, three ways, because customers do not
all keep their diary in the same place: Google and Outlook open straight
into that calendar with the event filled in, and Apple / other downloads an
.ics file that every other calendar understands. The same three appear on the
confirmation screen the moment a booking is taken, on the "Your booking" page, and
in the confirmation email — which also carries the .ics as an attachment.
The entry holds the appointment type, the business name, the address, the phone number to call, the reference, and the link back to the booking, so it is still useful months later when the email has been buried.
Changes follow the customer's calendar. A rescheduled appointment is sent as a revision of the entry the customer already has — their calendar moves it rather than drawing a second block at the old time — and a cancellation removes it. That only works because the invitation keeps one identity for the life of the booking; it is not a fresh event each time.
The appointment is offered for filing as soon as it is booked, before it has been confirmed. A slot a customer chose but could not write down is a slot they forget. Cancelled and no-show appointments are not offered at all.
Managing a booking without an account #
The confirmation screen and the confirmation email both carry a View, move or cancel this booking link to a "Your booking" page, showing what was booked, where, when, its status, and its reference. All three verbs are named on purpose: the link used to read "View or cancel", which hid the thing most people come back for behind the one they are afraid of — a customer in testing hesitated to click it at all, in case clicking gave up her slot.
From there the customer can cancel — which releases any held equipment and notifies the location's cancellation-notice email, exactly as a portal cancellation does. Cancelling is not offered once the appointment is completed or its time has passed.
They can also move the booking to a different time, without cancelling it first. The old time is held throughout, so a customer who looks and finds nothing better simply keeps what they had — which is what cancelling-and-rebooking could not promise.
Moving is as careful as booking. The picker shows the next three weeks as a month-style grid with the same key the booking calendar uses — open, fully booked, closed — so a day the location is shut is marked shut rather than offered and then answered with "nothing free that day". Picking a time does not move anything: it opens a review step that states the time being given up, the time being taken, the clock both are on, and what pressing Confirm will actually do. Nothing is written until Confirm, which is the same promise the booking flow makes.
What Confirm does depends on the booking:
- A pending booking (and a confirmed one at a location with Auto-approve confirmed reschedules switched on) moves there and then. The customer gets a fresh confirmation email with a calendar entry that replaces the old one, and the location's cancellation-notice address is emailed so the diary does not change under it silently.
- A confirmed booking anywhere else is lodged as a request. The old time stays held until staff answer it, the review step says so in those words, and the customer is emailed either way.
Availability comes from the same source the booking calendar uses, asked to ignore this appointment's own hold so the time it already occupies is not reported as taken by itself. The slot is checked once when the review step opens and again at the moment of the move, so a page left open overnight cannot take a time somebody else has since booked.
That link is signed and expires a month after the appointment. The signature is what grants access, not the appointment reference printed on the confirmation: the reference identifies a booking, it does not open one, and an appointment id on its own opens nothing. This is what stops the page from being usable to look up other people's bookings.
The reference #
Every booking carries an eight-character reference — E2C4FE13 — shown on
the confirmation screen, in the confirmation email and on the customer's "Your
booking" page. It is what they quote when they get in touch.
On your side it appears on the appointment page and as a column on the Appointments list, and the list's search box finds it: paste or type the reference a customer quotes and their booking comes back. Case and spacing do not matter. The reference is derived from the appointment's id, so every booking ever taken has one and it can never drift from the record it names.
Confirmation & next steps #
New bookings start as Pending. The customer receives an email with a signed Confirm Appointment link; following it confirms the booking (proving they own that email) and, when the email uniquely matches one existing customer, attaches that customer automatically. Staff can also confirm from the appointment page.
The public pages say so plainly, because "Pending" on its own reads as something having gone wrong: the confirmation screen tells the customer to check their email and click the link, and the "Your booking" page repeats it next to the status, naming the address it was sent to. The slot is held either way — the confirmation step is about proving the address, not about whether the time is theirs.
Once confirmed, the appointment page shows a Next Steps panel. Based on the type's next-step flags, one-click actions create a loan agreement, rental agreement, sales order, or customer return — pre-filled with the customer and carrying the requested equipment across as lines.
The panel and the buttons stay after the appointment is marked Completed, which for most businesses is when the paperwork actually gets raised. It used to disappear at that point, and a front-desk tester whose visit had just finished had nowhere to go.
It lists only the flows you can actually start. A flow the appointment type turns on but whose module is not part of your plan is shown separately, under Not on your plan, rather than being dropped silently — the same answer the sidebar's More modules entry points you toward. One your role cannot create is listed under Needs access you do not have. The panel used to advertise every flow the type had a flag for, under a line telling you to use "the buttons above" when there were none, and a tester hunted for them twice before giving up.
A booking from a first-time customer has no customer record attached, so converting it creates one from the name, company, email and phone on the booking and links it to the appointment.
The booking form asks for a Company, which is optional and only for someone booking on behalf of a business. Give one and the customer is filed under the business — the company becomes the customer's name, the way an accounting system files a trade account — while the person stays on the record as the contact. Leave it blank and the booking is filed as a person. Without that field a business had to type its company into the name box, and the customer came out split down the first space: "Acme Plant Hire" filed as a person with the surname "Plant Hire". If the booking details already match a single existing customer, that customer is used instead of a duplicate being created. Two cases are left to you rather than guessed at: when the details match more than one customer, and when the booking has no name or no email or phone at all. Use Attach Customer to settle those — it lists records matching the booking email or phone, and can create a new one pre-filled from the booking.
Changing an appointment, and telling the customer #
Every state change that a customer would care about offers to email them, and records what was sent on the appointment's Customer Emails list — the type of email, the address it went to, when it was sent, and who sent it. A row appears whether or not the send succeeded: Sent At is filled in only once the mail server has accepted the message, so a failed send shows the reason instead of quietly reading as sent. Any row can be resent, and an appointment nobody has written to yet can be emailed from the same list.
The state changes live on the appointment page rather than the edit form:
-
Confirm marks a pending appointment as confirmed, and emails the customer to say so.
-
Reschedule takes the new date and time. It refuses a slot outside the location's opening hours, one the assigned employee is not working, or one they are already booked for, unless you tick Move it anyway. A confirmed appointment goes back to Pending when it moves, because the customer has not agreed to the new time — the email asks them to confirm it.
Tick The customer has agreed to this time — you moved it with them on the phone — and the appointment comes out Confirmed, and the customer is emailed to say so, exactly as the Confirm button would have done. The tick box used only to stop the demotion, so a Pending booking somebody had explicitly agreed to stayed Pending and turned up on the "who hasn't confirmed yet" list; a receptionist rang a customer who had already said yes.
-
Cancel releases any equipment held for the appointment and emails the customer. It can be undone: a cancelled appointment can be Reinstated, which brings it back as Pending — not Confirmed — so the customer is asked again. Equipment released by the cancellation is not re-held.
Cancelling and un-cancelling are not available from the status dropdown on the edit form, because that route skips the equipment release and the email. Moving the date or time of a confirmed appointment from the edit form still sets it back to Pending, and says so, so the record never claims an agreement that has not happened.
Who is available, and when #
Availability is worked out from four things, and a slot has to survive all of them: the type's lead time and booking window, the location's opening hours, the assigned person's own schedule, and their existing bookings — with the type's buffers counted as busy time either side of each one.
Staff Availability (under Appointments) is where a person's own working week lives. It works exactly like opening hours: a day-of-week row is the regular pattern, and a date-range row with Not working is time off.
- Somebody with no rules here cannot be booked at any time. Everybody who takes appointments needs a working week set, or the types they are on offer no slots. Existing staff were given their location's working week when this changed, so nothing had to be set up by hand and availability carried on as it was.
- Personal hours narrow the location's, they do not extend them. A person marked available 08:00–20:00 at a location that closes at 17:00 is still done at five.
- The whole appointment has to fit inside the shift. A technician who finishes at 17:00 is not offered a two-hour job at 16:00.
- Time off takes them out of the diary entirely for those dates, and the public page stops offering them.
Reminders #
An appointment type can carry a list of
reminder lead times in hours. 24 emails the customer the day before; add 2
as well and they also hear from you two hours out. Leave the list empty — the
default — and the type sends no reminders at all.
- Each lead time is sent once per appointment, and appears on the appointment's Customer Emails list like every other message, with the address it went to and whether the mail server accepted it. A reminder the server refused shows there as a failure to resend by hand rather than being retried every quarter of an hour.
- The reminder offers a way out. It repeats what, when and where, and carries the View, move or cancel this booking link — a customer who cannot make it and has no way to say so becomes a no-show instead of a cancellation somebody else could have taken.
- An unconfirmed booking is asked to confirm. If the appointment is still Pending when its reminder goes, the email says so and includes the confirm button.
- Cancelled, no-show, completed and past appointments are never reminded, and nor is anything outside its lead time yet.
Text as well as email. Turn on Also send reminders by text on the type and the same reminder is sent by SMS to the number on the booking. It needs a Twilio connection under Integrations and a phone number on the booking; without either, the email still goes and nothing fails.
Reminders are checked every fifteen minutes, so one is sent within a quarter of an hour of its lead time rather than exactly on it.
Reacting to appointments yourself #
Appointments are available to the workflow builder as four triggers, so a business can build its own follow-up rather than waiting for a setting:
| Trigger | Fires when |
|---|---|
| Appointment booked | A booking is created — the public page, the portal, the staff form or the API |
| Appointment cancelled | Its status becomes Cancelled, however that happened |
| Customer does not show up | Its status becomes No Show |
| Appointment is coming up | At each of the type's reminder lead times, alongside the reminder itself |
Each one carries the appointment, its type, the customer, the contact details, the location, and the scheduled date and time; coming up also carries how many hours ahead it is, so one rule can behave differently for the day-before and the two-hours-out pass.
Asking your own questions when somebody books #
An appointment type can carry its own booking form questions — which machine, which site, is there a lift — asked on the booking form itself, while the customer is choosing a slot. Add them under the type's Booking Form Questions tab. Five kinds:
| Answer type | The customer gets | Required means |
|---|---|---|
| Short answer | One line | They must type something |
| Long answer | A box for a few sentences | They must type something |
| Choose one | Your own list of options | They must pick one |
| Yes or no | A yes and a no to pick between | They must pick one — answering "No" still books |
| Tick box | A single tick box | They must tick it — leave Required off and they can book without ticking, and the appointment records "No" |
"Yes or no" and a required "Tick box" are not the same question. Use Yes or no when either answer is fine and you just need to know — "Do you need a loan unit while yours is in?". Use a Tick box with Must be answered switched on only for something they have to accept before you will take the booking — "I accept the cancellation policy." An unticked box cannot be told apart from one nobody touched, so a required tick box can only mean "must tick"; ask a real question that way and you have built a form nobody can say no to.
A tick box only blocks the booking when Must be answered is on. Left off — the default — the customer can book without ticking it and the appointment records "No", which is the right shape for a fact you want but will not refuse work over. So if you are adding a waiver or a cancellation policy, switch it on; the type alone does not do it.
- The answers land on the appointment, in a Booking Form Answers panel, so whoever prepares for the visit reads them without opening anything else. A yes or no reads as "Yes" or "No" there, the same as a ticked or unticked agreement.
- A required question blocks the booking until it is answered, and the message names the question rather than saying "this field". Only require what you genuinely cannot start the job without: every field between a customer and a confirmed slot costs bookings.
- An unanswered optional question stores nothing — except an agreement, which always has a state and so records the "No".
- Each answer keeps a copy of the question as it was asked. Rewording a question later does not rewrite what a customer was answering, and deleting one does not erase their answer.
This is not the pre-visit form. A pre-visit form is emailed after the booking and writes into the customer's own custom fields; these are asked during it and describe the job. Use questions for the few things that decide what you send, and the pre-visit form for everything else.
Pre-visit forms #
A pre-visit form collects what you need before a customer arrives. It is not a feedback survey: a feedback survey asks how something went and is sent afterwards, and is normally sent automatically. The two are separate buttons that say which end of the visit they are for — Send Pre-Visit Form and Send Feedback Survey — and the survey button only appears once the appointment is completed or marked no-show.
The questions are your custom fields. Customer fields, and sales order fields on a form sent about a sales order, are asked when Customer can edit is on under Settings → Custom Fields; nothing else is, and a customer cannot write to a field that is not asked. Appointment fields are not asked yet. A field with Customer can see on but Customer can edit off is not asked. A question must be answered when Required from the customer is on; staff Required to save does not apply to the form. User-picker fields are never asked. See customer access. Each answer is checked against the field's type and, for a dropdown, its choices. Answers land on the record's own custom field values, and appear in the change history attributed to the customer — so if an answer replaces something staff entered, you can see what it was. Those entries cannot be undone: Undo says Unable to Undo. To put the old value back, edit the field.
Sending it. Use Send Pre-Visit Form on the appointment (or on a sales order) to create and email the link in one step. The record then shows whether it was sent and whether it has been answered, so you never have to go looking. Sending again re-sends the same link rather than issuing a second one.
Sending it automatically. Set Send Pre-Visit Form (hours before) on an appointment type and every appointment of that type is emailed its form that many hours ahead. Leave it blank — the default — and the form stays manual. Each appointment gets at most one, and cancelled and past appointments are never sent one.
The link is personal, single use, and stops working once answered. It is not displayed on screen; use Show Form Link on the invitation if you need to copy it.
Customer self-service (portal) #
Customers manage their own appointments from the customer portal. Each appointment opens to a detail page showing the location's address and support phone, the requested equipment, and status-aware actions:
- Pending appointments can be cancelled, edited (contact details, notes, and — when the type allows equipment selection — the requested equipment, re-held against on-hand stock), or rescheduled to any open slot, validated against the same availability rules as booking.
- Confirmed appointments can be cancelled, and a reschedule becomes a request that staff approve or decline in the Customer Reschedule Requests inbox (with a pending badge) — or it applies immediately when the location enables Auto-approve confirmed reschedules. Cancelling can notify the location's cancellation-notice email.
- Completed appointments show the records they produced (the related sales order, rental, loan, or return).
Configure the support phone, cancellation-notice email, and auto-approve toggle under Location → Appointments. Every portal change is attributed to the customer in the change history.
Booking from the staff side #
Appointments → New appointment, or New appointment on the dashboard.
What a new booking starts with filled in #
A booking taken at the counter usually has somebody standing in front of you, so a new appointment opens with the answers the form can already work out. All of these apply to a new booking only — opening an existing one never changes what it already says.
- Location. Where there is exactly one location you may book at, it is already chosen; where you may book at more than one, the field is left empty for you to pick. It is the locations you may book at that are counted, not the locations on the account — a location your role does not cover is never chosen for you, and neither is one that does not take appointments, so a single store alongside a warehouse still counts as one.
- Assigned Employee. You are put down as the employee when you are marked Takes appointments and you are working that day, by your Staff Availability less any time off. If either is missing the field is left empty rather than filled in with a name the booking would then work against: the times on offer are narrowed to whoever is assigned, so putting somebody on a day they do not work would empty the Time list on a form you had not touched. A part-timer opening the form on a day off gets a blank field and the location's full list of times.
- Date starts on today — at the location when this form has already chosen a location for you, and on your account's clock while you still have one to pick. This field's past-date check always follows the location you actually picked, so you are never refused that location's own date. The two readings differ only on an account with several bookable locations, and only until you choose one: until then the date on screen is your account's today, which for an account left on UTC is the server's. Pick the location first if the two are hours apart. (The staff Reschedule action on an existing booking is a separate surface and still measures "the past" against the server's clock; that one is still to do. The customer's own reschedule page already uses the location's clock.) There is no Today button beside the field, because a new booking already starts there — the calendar is for the bookings that are not today, and Now below sets the date as well when the answer is "right now".
- The time is never guessed at, but Now beside the field is one press: it switches on Enter a time manually and fills in the date and the time from one reading of whichever clock the form is on at that moment — the location you have picked, or your account's if you have not picked one yet — so the two can never disagree about which day it is. On an account with locations hours apart, pick the location before pressing it. Every guard below still applies — a walk-in outside opening hours, or at a time the assigned employee is not free, is refused exactly as a typed time is, and Book anyway is what releases it. It means the same thing on an existing booking: this appointment is happening now — which on a confirmed one puts it back to Pending, and says so.
The rest of the form #
-
Time is a list of the slots that are genuinely available — the times the location is open, long enough for the type's duration to fit before closing, not already past, inside the type's minimum notice and how far ahead it can be booked, with room left under its Concurrent Slots, and with an assigned employee free. For a type with staff assigned, that is the same list the public booking page offers.
-
A type with nobody assigned gets the same list without the last check, because there is no employee to be free. You are offered the times that pass every other rule — so not a time already past, a day inside the type's minimum notice, or a time already booked as many times as its Concurrent Slots allows. With Concurrent Slots blank there is no limit, so an existing booking does not take its time off the list. The public booking page offers such a type no times at all.
-
Only practitioners are offered. The Assigned Employee list holds the people marked Takes appointments under Users & Access → Users, not everybody with a login. It used to be everybody, and a receptionist in user testing found herself in a list of physiotherapists with one of that day's four appointments already assigned to her. Anybody a booking already names stays selectable on that booking even if the flag is later cleared, so nothing is silently unassigned.
-
Pick the employee first and the list narrows to them. With an Assigned Employee chosen, the times on offer are the ones that person is working and free for, taken from their Staff Availability less any time off — so somebody who works mornings only that day, or who has booked the afternoon off, is not offered the afternoon. Leave the employee blank and the list is the type's, as before.
-
Switch on Enter a time manually to type a time instead. The guards still apply: a time outside opening hours, a time the assigned employee is not working or has booked off, or one that double-books them is refused, and Book anyway is what releases it. A date in the past is refused either way. A typed time is not checked against the Time list, so an earlier time today, a time already full under Concurrent Slots, or a day inside the type's minimum notice is saved without a warning — which is what lets Now record a walk-in.
Book anyway does not cover who is assigned. An employee who does not take appointments is refused whether or not it is ticked, and the same holds on the API and the AI connector — that switch is for scheduling judgement calls, and booking a customer with somebody who cannot serve them is not one.
-
When no times are on offer, the field says why. It used to say "Pick a location and appointment type first" whenever either was missing — including when there was nothing to pick, because every appointment type at that location was switched off, which is a sentence that sends you looking for a step you cannot take. It now names the actual reason: that the location has no appointment types yet, that none of them are active, that the location is closed that day, that the date falls outside the type's booking window, that every start time has already passed, that nobody who can take the type has working hours set, that the employee you chose is not working then, or — for a type with nobody assigned — that every time left that day is already fully booked. Switch on Enter a time manually to book regardless.
-
Finding a customer. The Customer box searches name, email address and phone number, so a walk-in who gives you a number is one search away. A number is matched with its separators ignored on both sides — spaces, dashes, dots, slashes, brackets and a leading
+— so5550143finds a record stored as555-0143or(555) 0143, and the other way round. Any other character in a stored number is not stripped, so a search has to include it to match across it. Each result reads as the name followed by the phone and email held for that person, which is what tells two people of the same name apart. The list is capped rather than paged, so a very short search will not show you everybody it matched: type more of the name or the number. Choosing a customer fills the contact name, email and phone from their record, so the confirmation goes to the address you hold rather than one typed from memory. Clearing the customer leaves the contact details in place. Somebody who is not on file at all is added with +, without losing the form. -
Contact Name is asked for; Contact Email is not. A booking taken over the phone often arrives as a name and a number, so the address is optional on this form. What you give up by leaving it blank is written under the field, because it is real: nothing is emailed to that appointment of its own accord — no confirmation, no reminder email, no scheduled feedback survey, and no link for the customer to move or cancel it themselves. The appointment's Customer Emails list records the attempt with "There is no email address on this appointment, so nothing was sent" rather than failing, so the front desk can see it went nowhere. Two things still work: text reminders, where you have them switched on for the appointment type, are unaffected, and Send Feedback Survey lets you type an address into the modal, so one can still be sent by hand. Add an address to the appointment and everything works from then on.
-
A linked customer is emailed at their own address. The paragraph above describes a booking that stands alone. Where the appointment has a Customer on it who has an address, and no address of its own, the customer's address is used instead: the confirmation and the reminder email go out as normal and are recorded as sent. Leaving Contact Email blank is therefore not a way to stop such a customer being written to — for that, leave the customer off the appointment too.
-
Clearing a name that is already there is refused. Opening an existing booking, emptying Contact Name and saving gives you a validation error, and the API refuses the same thing. An appointment that arrived with no name — which the ones brought across from an older system often did, where the old record held only a phone number — can still be opened, edited and saved without one, so adding a note to one does not mean inventing a person first.
-
Custom fields. Fields your account has defined for appointments under Settings → Custom Fields are at the bottom of the form, and on the appointment's details page. One marked Required to save has to be filled in before the form saves.
A change saved on this form is recorded in the appointment's change history.
An appointment type with no staff assigned cannot be booked online at all — the public calendar has nobody to offer. Neither can one whose assigned staff have no working hours set, for the same reason: a person with no hours is bookable at no time. The Bookable column on the appointment types list says which of the two it is. Staff can still book either one here and assign somebody later.
Cancelling #
Cancel on the appointment row or its page sets the status to Cancelled and releases any equipment being held. The booking stays on the record, so the history and the customer link survive — this is the action you want in almost every case. Deleting an appointment removes the record and is tucked behind the row's More menu.
A cancelled or no-show appointment will not accept a Send Feedback Survey: it never happened, so there is nothing to ask about. The refusal says so rather than quietly doing nothing, and it holds for the scheduled survey triggers too.
Dashboard #
The appointments dashboard is the front desk's day sheet. Pick Today, Tomorrow, This Week, Next Week or Next 7 Days — each button carries the dates it means — and it lists every booking in that window, grouped under a dated day heading and ordered by start time.
Each row shows the start and end time and the appointment's length, the customer's name, a click-to-call phone number, the type, the location, the assigned employee and the status. Every cell opens the appointment — the row carries an Open link on the right and clicking anywhere but the phone number (which dials) takes you to the booking.
The counters above the list read Booked, then Pending, Confirmed, Completed, Cancelled and Clashes. Booked leaves cancelled bookings out — it is the number of appointments actually going ahead in the period, and it is the sum of the Pending, Confirmed and Completed tiles beside it. Cancelled bookings still appear in the list below, with their status against them.
Clashes are flagged. Four faults, in order of how fundamental they are:
- Outside opening hours — the location is shut then: closed all day, or open but not at that hour. This is the only one that is checked for a booking with nobody assigned to it yet. The message names the hours the location actually keeps that day, and a location that has no opening hours recorded at all is never flagged — nothing has been said about when it opens, so nothing is claimed about when it is shut.
- No working hours — nobody has written the assigned employee a working week, so nothing can be booked with them at any time.
- Outside working hours — they have one, and this booking falls outside it — including because they have time off covering it. The message names the hours they actually keep that day.
- Double-booked — the same employee is booked for two appointments that overlap. Both rows are marked, and a banner counts them for the period.
Cancelled appointments are never flagged and release their slot, so the count reflects real conflicts. Back-to-back bookings — one ending exactly as the next begins — are not clashes.
The same flag appears as a Clash column on the Appointments list and on each appointment's own page, and the booking form refuses the same times when you save one. Where the fault is somebody's hours, the page links straight to Appointments → Staff Availability; where it is the location being shut, to Appointments → Opening Hours.
The dashboard is an agenda, not a drag-and-drop calendar grid: rows under day headings rather than blocks on an hour axis. It answers what is happening and in what order, which is what running the day needs.
Doing it from the API #
# List appointments
curl "https://your-domain.com/api/v1/appointments" \
-H "Authorization: Bearer $TOKEN"
status accepts pending, confirmed, completed, cancelled or no_show;
anything else is rejected with a 422. Setting it to cancelled or no_show
releases any equipment the booking was holding, the same as the Cancel and
Mark No Show actions in the app.
# Cancel an appointment (releases its held equipment)
curl -X PATCH "https://your-domain.com/api/v1/appointments/$APPOINTMENT_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"status": "cancelled"}'
contact_name is required when creating an appointment and cannot be sent as
null when updating one. contact_email is optional on both, and sending it as
null clears it — the same rule the staff form follows, and the same
consequence: nothing is emailed to that appointment of its own accord, unless it
carries a customer_id for a customer who has an address, in which case that
customer's address is used and the mail goes out as normal. The
public booking page is the exception and still
insists on an address, because a customer booking online with no way to be
written to gets no confirmation and no link back to their booking.
custom_fields is an object keyed by each field's key, returned on every
appointment and accepted when creating or updating one. Sending it on an update
replaces the values already stored, so send every value you want to keep. A
string or a number sent as custom_fields is rejected with a 422.
Working hours apply here too. Send an assigned_user_id and the appointment
has to fall inside that person's recorded hours for the date, or the request is
rejected with a 422 on scheduled_time naming the hours they keep. Add
"ignore_scheduling_warnings": true to book them regardless — the same
deliberate override Book anyway is on the screen. An appointment with nobody
assigned is not checked, because there is nobody to be unavailable. The same rule
covers the appointment tools on the
AI connector, which write through these
endpoints.