Bookings & calendars
Use our built-in scheduler, or wire Iris into your own CRM via custom tools.
Iris's booking flow has two modes. Default is the built-in calendar (works out of the box). If you run on Jobber, Vagaro, Housecall Pro, SimplePractice, Mindbody, Square Appointments, or any internal system — you can override with your own endpoints and Iris uses those instead.
Internal (default)
When you enable Book appointments in the setup modal, Iris uses our built-in scheduler:
- Available slots derived from your
Hours of operationsetting - Optional buffer between bookings (e.g. 15 min between dental appointments)
- Optional daily cap (e.g. max 8 bookings per day)
- Min notice (e.g. can't book within 2 hours of now)
- Max advance window (e.g. no more than 30 days out)
Bookings show up in the Receptionist tab → Bookings sub-tab with Done / Cancel actions.
Connecting your CRM
We don't build connectors for every booking platform (there are hundreds, every vertical has its own). Instead, you register two custom tools and Iris uses them:
- Open Tools → Custom APIs in HQ
- Click the Check availability template — fills in name, description, and a working parameter schema
- Paste your CRM's availability endpoint URL, configure auth, click Test to confirm it works
- Save. Repeat with the Book meeting template.
Source of truth shifts to your CRM
check_availability or book_meeting as custom tools, our built-in scheduler steps aside. The Receptionist tab's Bookings sub-tab shows "Managed externally" and points you back to your CRM. No syncing, no double-booking risk.API contracts your endpoint should follow
For check_availability, Iris will POST something like:
{
"call": { "call_id": "...", "agent_id": "..." },
"name": "check_availability",
"args": {
"isoDateTime": "2026-06-15T15:00:00Z",
"durationMinutes": 30
}
}Respond with something like:
{ "available": true, "suggestedSlot": "2026-06-15T15:00:00Z" }
// or
{ "available": false, "reason": "Closed Sundays", "suggestedSlot": "2026-06-17T09:00:00Z" }For book_meeting:
{
"call": { "call_id": "...", "agent_id": "..." },
"name": "book_meeting",
"args": {
"name": "Jane Doe",
"email": "jane@acme.com",
"isoDateTime": "2026-06-15T15:00:00Z",
"durationMinutes": 30,
"notes": "Wedding cake tasting"
}
}Respond with:
{ "success": true, "bookingId": "abc123", "message": "Booked you for June 15 at 3pm" }Iris's LLM uses the response naturally in conversation — you don't have to format speech text specifically.