Skip to content

Booking Appointments in a Call

The Book appointment node lets an Aura voice agent schedule a meeting while the caller is still on the phone. The agent offers a few open times from your Switchboard booking calendar, the caller picks one (by voice or keypad), and the appointment is booked and confirmed on the call. When the caller’s email is known, the standard calendar invite (an .ics file) is emailed automatically — the same invite your website booking page sends.

Because the booking is done by a real node against the real calendar, the agent can truthfully say “you’re booked for Tuesday at 2 PM” — it never invents a confirmation. If nothing is available or the caller doesn’t choose, the node routes down a failure path you control, so the call never dead-ends.

  1. Finds open times. It asks the calendar for the next available slots for the meeting type you chose (respecting lead time, working hours, and existing bookings).
  2. Offers them aloud. The agent reads out up to a handful of numbered times (“I have a few times available: 1, Tuesday, July 15 at 10 AM; 2, Wednesday, July 16 at 2 PM…”).
  3. Captures the pick. The caller says the number (or presses it on the keypad). If the answer isn’t clear, the agent re-offers once.
  4. Books it. The chosen time is held and written into the calendar as a draft appointment assigned to an available staff member.
  5. Confirms + invites. The agent confirms the time on the call; when it has the caller’s email, the calendar invite is emailed automatically.
  6. Routes on. On success the node takes the success edge (where you speak the confirmation); on no-availability / no-selection / a scheduling conflict it takes the failure edge.

In the Flow Builder, add a Book appointment node from the node palette and connect it into your flow.

Select the node to open its settings in the inspector panel:

SettingWhat it does
Meeting typeWhich bookable meeting type / staff pool to offer, e.g. sales_demo. Must match a meeting type configured in your calendar settings. Supports {{variables}}.
Times to offerHow many open slots to read out (1–5). Three is a good default — enough choice without a long list.
How the caller picksSay the number (the caller speaks “two”) or Press a key (DTMF keypad). Keypad is fully deterministic and works in Strict agents.
Caller email variableA context path (e.g. vars.email) holding the caller’s email for the calendar invite. Leave blank to use the caller-ID → contact match — a recognized caller books with no extra questions.
Caller name variableA context path (e.g. vars.name) for the caller’s name on the appointment.
Offer promptWhat the agent says to offer the times. Use {{slots}} where the numbered list should go. Leave blank for a sensible default.
No-availability lineWhat the agent says when there are no open times. Supports {{variables}}.
Save result to variableThe variable that holds the outcome (default booking). On success it is truthy and {{vars.<name>__when}} holds the booked time. Draw a success edge that checks this variable, plus a default edge for the failure path.

The node behaves like the Tool call and Send message nodes: it writes its outcome into the variable you named so your edges can branch on it.

  • Success — {{vars.booking}} is set, and {{vars.booking__when}} holds the confirmed time (e.g. Tuesday, July 15 at 10:00 AM). Speak it in a following Say node.
  • Failure — {{vars.booking}} is empty and {{vars.booking__error}} explains why (no availability, no selection, slot_taken, calendar unavailable). Send this down a default edge.

Always add both a success edge and a default (failure) edge so no caller reaches a dead end.

A short flow that greets the caller, captures their email, books a sales demo, and confirms it:

Start
└─ Say (fixed): "Thanks for calling — I can get a demo on the calendar for you."
└─ Verified collect → variable: email (field type: email)
prompt: "What's the best email for the invite?"
└─ Book appointment
meeting type: sales_demo
times to offer: 3
how the caller picks: Say the number
caller email variable: vars.email
save result to variable: booking
├─ edge: Compare — vars.booking exists → Say (fixed):
│ "You're all set for {{vars.booking__when}}. I've emailed
│ your invite. Talk soon!" → Hang up
└─ else edge → Say (fixed): "I couldn't lock that in just now —
I'll have someone reach out to schedule."
└─ Open ticket (or Send message) → Hang up

Things to notice:

  • The Verified collect node captures the email accurately (with a read-back), and the Book appointment node uses it (vars.email) as the invite attendee.
  • The success edge checks vars.booking and speaks {{vars.booking__when}} — the real booked time, not a guess.
  • The else edge handles no-availability / no-selection gracefully — here it opens a ticket so a human follows up.

Set How the caller picks to Press a key (keypad) to keep the node fully deterministic — no AI is used to interpret the choice, so Book appointment is safe to use in a Strict agent (compliance scripts, DTMF menus).

  • The appointment is created as a draft assigned to an available staff member, and appears in your Switchboard calendar. The calendar invite is emailed to the caller immediately when their email is known.
  • No double-booking. The slot is held the moment the caller picks it. If someone grabs the same time in the split second between the offer and the booking, the agent re-offers fresh times once.
  • No fake confirmations. If the calendar is unreachable or nothing is available, the node fails cleanly down its failure edge — the agent will never claim a booking that didn’t happen.
  • Previewing a flow in the builder uses simulated times and a simulated booking, so testing your flow never creates a real appointment or emails anyone.