Skip to main content
This guide shows production pattern for scheduling inside a v1.8 agent using mid-call Actions.

Before you start

1) Connect your scheduling tool

Go to Integrations and connect your scheduler so it is available in both:
Integrations screen with Calendly and Cal.com connected

Integrations screen with Calendly and Cal.com connected


Key building blocks (how v1.8 scheduling works)

Variables (capture the caller’s date/time)

Variables extract immediately after the caller’s latest reply and before outcome evaluation, so your routing can validate the date/time right away. If you loop back to the same node, variables re-extract and overwrite prior values (perfect for “try again” date collection). See Loops.
Variables panel with a "preferred_datetime" variable configured

Variables panel with a "preferred_datetime" variable configured

Actions (run scheduling mid-call)

In v1.8, Actions run mid-call from a Speak node. When Actions exist, the node can auto-proceed without waiting for another caller reply, and rule-based outcomes are recommended because outcomes fire based on internal values/results.
Speak node Actions panel with a scheduling action selected

Speak node Actions panel with a scheduling action selected

Calendly timezone handling (important)

Calendly Actions accept an optional timezone. If not set, Thoughtly falls back to:
  1. timezone input (action config) -> 2) agent timezone (advanced settings) -> 3) America/New_York.
See Calendly timezone handling for details.

Flow overview

  1. Ask for preferred date/time (Speak -> Prompt)
  2. Extract preferred_datetime (Variable)
  3. Validate (Outcomes -> loop if invalid)
  4. Book (Speak node with Scheduling Action)
  5. Confirm (Message / Prompt)
  6. Fallback (offer alternatives or Transfer)

Step-by-step (Agent Builder)

Step 1 - “Collect date/time” Speak node

Create a Speak node that asks something like:
  • “What day and time works best for you?”
  • “If you have a timezone preference, tell me as well.”
Create Variables on this node:
  • preferred_datetime (Text)
  • preferred_timezone (Text, optional)
Extraction instruction suggestion (copy/paste style):
Goal: extract the appointment date and time the caller states.
Output: ISO-like text (for example: 2024-01-08T10:30:00Z).
If absent or unclear: return empty.
Do not invent values.

Step 2 - Validate and loop (Outcomes)

Add prompt-based Outcomes from the same Speak node:
  • If the caller did not provide a time -> self-loop back to this node (“Sorry - what date and time?”)
  • Else -> continue to booking
Outcomes rules showing self-loop and success path

Outcomes rules showing self-loop and success path

Step 3 - Booking Speak node (Actions)

Create a new Speak node:
  • Message: “One moment while I book that for you.”
  • Add an Action for your scheduler (Calendly or Cal.com) and map:
    • Date/time input: preferred_datetime
    • Timezone: preferred_timezone (or rely on the Calendly fallback order)
Authoring tip: disable interruptions for mid-call Actions so the caller does not interrupt during booking.
Calendly "Schedule appointment" action mapping fields

Calendly "Schedule appointment" action mapping fields

Step 4 - Confirm vs error (rule-based Outcomes after booking)

In the same booking node, add rule-based outcomes that check Action outputs such as:
  • booking_status == "confirmed" -> confirmation node
  • Else -> error-handling node (try different time / get availability / transfer)

Step 5 - Confirmation Speak node

Use Message mode if you want an exact script:
  • “You’re all set for [date/time]. You’ll receive a confirmation shortly.”
Confirmation node with verbatim message enabled

Confirmation node with verbatim message enabled

See also

  • Actions - mid-call integrations and execution order
  • Variables - extraction and overwrite behavior
  • Outcomes - rule-based vs prompt-based routing
  • Automations - prefetch and data passing
  • Calendly - action details and timezone handling
  • Cal.com - action details