Appointment Booking Agent
Offers the slots that can actually happen, not the ones that look free
- 9hard rules
- Things it must never do, enforced in every run
- 5handover rules
- Conditions where it stops and gives the work to a person
- 12output fields
- A structured result, not a paragraph you have to re-read
- ≤6steps per run
- Bounded work: at most 5 tool calls, enforced by the runtime
Overview
Every booking system answers "is the practitioner free at six?" — which is almost never the question that matters. The chair is free and the laser is not. There are forty minutes before the next appointment and the treatment takes sixty. The room is free but it is the one being cleaned between the two either side of it.
So a slot gets offered, a customer takes it, and somebody at the desk finds the conflict the next morning and makes an apologetic call. That booking was never real, and while it sat there nobody else could take the time.
This agent resolves a service into everything it actually consumes — the practitioner qualified to do it, the room, the equipment, the assistant who has to be present, the turnaround before the next one — and only offers what survives all of it.
It also reads the request as people write it. "Saturday after five", "same as last time", "with whoever did my colour", "before I fly on the 14th". A great many bookings are lost not because there was no slot but because the customer could not find it in a dropdown and gave up.
It writes a booking only after the customer has confirmed a specific slot in plain words. It never moves or cancels an existing appointment, never books over a block, and never takes a payment.
Benefits
No apologetic phone call
Because the slot was checked against everything it needed.
Bookings that would have been lost
From the requests a dropdown cannot read.
The desk stops arbitrating
Conflicts are prevented rather than discovered.
What it does
Checks every resource, not just the person
The room, the equipment, the second pair of hands, the turnaround before the next one. A slot that fails any of them was never bookable.
Reads the request as it was written
"Saturday after five", "same as last time", "before I fly on the 14th". Most bookings are lost in the dropdown, not for want of a slot.
Prices the slot in real duration
A consultation and a laser session are not the same appointment. Forty minutes free does not fit a sixty-minute service.
Confirms in words before it writes
A booking made on an assumption is a no-show with extra steps. It restates the slot and waits for a plain yes.
Offers the near miss honestly
When nothing fits, it says what is closest and why the request could not be met, rather than returning an empty list.
Never moves an existing appointment
Rescheduling somebody to make room is a decision about another customer, and it belongs to a person at the desk.
What this changes
What this changes about your week
- It takes over
- Answering a booking request, checking it against every diary and resource, and offering a slot that will hold.
- Done today by
- Whoever is nearest the desk or the phone, between everything else they are doing.
- How often
- Every enquiry, including the ones that arrive at eleven at night.
- Typical manual effort
- A few minutes each, and an apologetic phone call the next morning when a slot turns out not to have been free.
Why Operations in particular. A booking widget checks one diary. The chair is free and the laser is not, so the slot it sold was never real and nobody else could take it either.
Runs unattended
Started by you or by an event, and it finishes on its own. Nothing waits for someone to be at a desk.
The same standard every time
The two-hundredth item is held to the bar the first one was. Consistency is the part people cannot sustain.
Nothing runs above your ceiling
Anything above the risk you allow stops and waits for your approval, with its impact stated.
How it runs
This agent runs server-side through the PROMIVO runtime. Each run is logged step by step and every tool call is permission-checked before it executes.
- 1InputValidated against the agent input schema
- 2Modelclaude-sonnet-5 with automatic fallback
- 3Toolsextract_structured_data
- 4PermissionsRuns WRITE actions automatically; anything higher waits for approval
- 5OutputStructured result matching the output schema
- 6LoggingTokens, duration and every step recorded
Demo
Demo dataIllustrative sample output, abridged.
Input
{
"request": "Hi, can I get a laser session Saturday after 5 with whoever did it last time?",
"services": [],
"availability": []
}Output
{
"booked": {
"startsAt": "2026-09-12T17:30",
"reference": "BK-4471",
"confirmedBy": "Customer replied \"yes please\" at 23:04",
"practitioner": "Nadia"
},
"offered": [
{
"room": "Treatment 2",
"endsAt": "2026-09-12T18:30",
"startsAt": "2026-09-12T17:30",
"whyThisOne": "The only Saturday slot after five where Nadia, the laser unit and a treatment room are all free for the full sixty minutes with the fifteen-minute turnaround after it. 17:00 looks free on Nadia's diary but the laser is in Treatment 1 until 17:20.",
"practitioner": "Nadia",
"resourcesChecked": [
"Nadia",
"Laser unit A",
"Treatment 2",
"15 min turnaround"
]
}
],
"escalate": false,
"disclaimer": "Availability checked against the practitioner, room, equipment and turnaround supplied. No existing appointment was moved and no payment was taken.",
"understood": {
"service": "Laser session",
"timeConstraint": "Saturday, at or after 17:00",
"durationMinutes": 60,
"practitionerRequested": "Nadia — from this customer's appointment on 14 August"
},
"couldNotMeet": "",
"depositRequired": false,
"checkWasComplete": true,
"escalationReason": "",
"nearestAlternative": "",
"confirmationMessage": "I can do Saturday 12 September, 5:30pm to 6:30pm, laser with Nadia in Treatment 2. Shall I book it?",
"whatCouldNotBeChecked": []
}Requirements
Integrations
No integrations required.
Before you start
- Your service list with real durations
- Practitioner availability, working hours and leave
- Rooms, equipment or assistants each service needs
- Existing appointments and blocks
- Requires the Starter plan or higher
Use cases
Clinic and surgery booking
Where a procedure needs a room, equipment and a second clinician.
Salon and treatment rooms
Where duration varies wildly by service and the chair is not the constraint.
Multi-site and multi-practitioner
One request against several diaries, several branches.
Out-of-hours enquiries
The bookings that arrive at eleven at night and are gone by morning.
Pricing
Starter
Billed monthly through your PROMIVO subscription. Cancel at any time.
Runs consume your plan allowance for agent executions and tokens. See plan limits
FAQ
Can it book without asking me?
It writes a booking only after the customer has confirmed a specific slot in plain words. It never books over a block, never double-books, and never moves or cancels an appointment that already exists — those affect somebody who is not in the conversation.
What if no slot fits the request?
It says so, gives the nearest alternatives, and states which part of the request could not be met — the day, the time, the practitioner, or the duration. It never invents availability to avoid an empty answer.
Does it take payment or a deposit?
No. It never handles a card, a deposit or a refund. Where a deposit is required it says so and hands the customer to whatever you already use for payment.
What does it need to know about a service?
Its real duration, who is qualified to deliver it, and what it consumes — room, equipment, an assistant, turnaround time. Without that it can only check the practitioner's diary, and it says so rather than pretending the check was complete.
Reviews
Reviews open once customers have run this agent.
Need this agent to work differently?
Tell us what to change and our team will scope a customised version for your business.
Customize this agent