CA94ad636637ad7d839e1d067e0059803b
ModPod Podiatry · +61481222413 → +61468078235 · pracsuite
Started 28/05/2026, 10:25:21 am · Duration 264s · Turns 8 · Outcome booked · End caller_hangup
Call recording · 265s
›Full Transcript · 24 messages
+0:15.2+0:15.8+0:26.0+0:26.4immediate_ack+0:28.3+0:43.6+0:44.1immediate_ack+0:49.9tool_lead_in+0:57.9+1:07.2+1:07.7immediate_ack+1:12.5+1:16.6+1:17.1immediate_ack+1:21.2tool_lead_in+1:26.8+1:47.0+1:47.4immediate_ack+1:47.8+2:00.2+2:00.3tool_lead_in+2:06.3+2:21.2+2:21.3State Flow · 10 states · 24 utterances
- STATE 01initsynthetic
initWebSocket opened and prefetch (patient lookup, current bookings, recent thread, preferences) is in flight. No agent utterance yet.
- Enters when
- Twilio ConversationRelay opens the WebSocket.
- Exits when
- Prefetch completes → greeting.
- Allowed tools
- No tools — the route layer is fetching DB state in parallel.
+0:00.0Call answered. Agent is initializing the session for ModPod Podiatry.- Tenant:
- ModPod Podiatry
- PMS:
- pracsuite
- Direction:
- +61481222413 → +61468078235
- Conversation:
- db4ab205-b6d1-4012-ad67-1fe25093a4f0
- greeting· 3.9s laterSTATE 02greetingsynthetic
greetingDeterministic agent greeting plays once prefetch resolves and before the caller speaks for the first time.
- Enters when
- Prefetch resolves; route layer emits the greeting TTS.
- Exits when
- Caller responds → first buildVoiceBookingFlow pass routes to booking_discovery / rescheduling / cancelling / answering_query / verifying_identity.
- Allowed tools
- No tools — single deterministic utterance.
+0:03.7Prefetched the caller’s record in 3.7s. Agent is now greeting the caller.Data prefetched for this callerMatched patientName:Daniel WelshMobile:+61481222413DOB:—First seen:—Last seen:—Outreach status:noneRecent past appointments (showing 5 of 27)6/6/26, 10:30 amNew Biomechanical· Will Zalloua· ModPod Podiatry - Dee Whycancelled5/6/26, 9:00 amFree Bio· Jake Murphy· ModPod Podiatry - Dee Whycancelled4/6/26, 12:00 pmNew Biomechanical· Alison Pasut· ModPod Podiatry - Mosmancancelled3/6/26, 2:50 pmNew Biomechanical· Trent Baker· ModPod Podiatry - Mosmancancelled1/6/26, 3:00 pmNew Biomechanical· Alison Pasut· ModPod Podiatry - Mosmancancelled
27 total appointments on file · 0 pre-call messages in this conversation - booking discovery· 11.8s laterSTATE 03booking discovery/ elicit_serviceflow state
booking_discoveryRouter state. Identifies caller intent and dispatches to a super-state branch (appointment_setting / appointment_adjustment / qa / handoff).
- Enters when
- Call starts after greeting, OR a sub-flow returns to the router (e.g. qa side-loop completes).
- Exits when
- Routes into appointment_setting (new booking), appointment_adjustment (touch existing), qa (side question), or handoff (callback/transfer/escalation).
- Allowed tools
- BASE_TOOLS minus CreatePatient. Read-only lookups while still gathering intent.
elicit_servicephaseDetermine which service / appointment type the caller wants.
+0:15.5FSM routed to booking discovery (elicit service). Because booking request medium — said booking-related words. Agent asked the caller what their visit is about. No tools unlocked yet (still gathering info).USER+0:15.2I would like to book an appointment, please.BOT+0:15.8No problem. What's the main concern you'd like the podiatrist to help with, and how long has it been going on?FSM internals
trigger:booking_request/medium · evidence=booking_terms · context=unknowndirective:visit_reason_requiredaction:ask_visit_reasonallowed tools:none (still gathering)raw:visit_reason_required - discovering service· 10.8s laterSTATE 04discovering service/ elicit_serviceflow state
discovering_serviceMulti-service tenant where the service catalogue has not yet been read in this conversation. Agent must call GetServicesAndPricing before CheckAvailability becomes available, so the appointment_type_id passed to CheckAvailability is grounded in real services and not hallucinated from the prompt context.
- Enters when
- voiceBookingSession.services_discovered is NOT true AND tenant has ≥2 distinct appointmentTypeIds across practitioner_configs AND the broad booking_discovery fallback would otherwise fire.
- Exits when
- GetServicesAndPricing or GetAppointmentTypes returns successfully → services_discovered=true → next turn re-enters booking_discovery with CheckAvailability available. Caller hangs up → closing.
- Allowed tools
- GetServicesAndPricing, GetAppointmentTypes, GetPatientDetails, ConvertTimezone, EscalateToHuman, TransferCall. NO CheckAvailability, NO write tools. Surfaced from CA22eaf8a08eb69e25734c0d51b7bb6c83 — LLM hallucinated appointment_type_id=50014 and the wrong service was offered.
elicit_servicephaseDetermine which service / appointment type the caller wants.
+0:26.2FSM routed to discovering service (elicit service). Because no specific rule matched the caller’s last turn — no FSM rule matched. Directive: discovering service. Tools available: GetServicesAndPricing, GetAppointmentTypes, GetPatientDetails, ConvertTimezone, EscalateToHuman, TransferCall.USER+0:26.0I have a really sore foot and need assistance.BOT+0:26.4immediate_ackMm-hmm.BOT+0:28.3I'm sorry to hear that. You've come to exactly the right place, we treat foot pain every day. Which area are you in—Dee Why, Mosman, North Ryde, Rose Bay, or Sydney?USER+0:43.6Mosman.BOT+0:44.1immediate_ackI'll check that now.BOT+0:49.9tool_lead_inLet me find the right appointment for you.toolGetAppointmentTypes366ms · ok+0:50.3in:{}out:[{"name":"Home Visit Morning","duration_minutes":30,"appointment_type_id":"50011"},{"name":"Strapping 20 mins","duration_minutes":30,"appointment_type_id":"500…BOT+0:57.9Just to point me to the right appointment — is the pain more in your heel, the ball of your foot, or more general soreness across the foot?FSM internals
trigger:unknown/low · evidence=no_rule_matched · context=unknowndirective:discovering_serviceallowed tools:GetServicesAndPricing, GetAppointmentTypes, GetPatientDetails, ConvertTimezone, EscalateToHuman, TransferCallraw:discovering_service - booking discovery· 41.3s laterSTATE 05booking discovery/ elicit_serviceflow state
booking_discoveryRouter state. Identifies caller intent and dispatches to a super-state branch (appointment_setting / appointment_adjustment / qa / handoff).
- Enters when
- Call starts after greeting, OR a sub-flow returns to the router (e.g. qa side-loop completes).
- Exits when
- Routes into appointment_setting (new booking), appointment_adjustment (touch existing), qa (side question), or handoff (callback/transfer/escalation).
- Allowed tools
- BASE_TOOLS minus CreatePatient. Read-only lookups while still gathering intent.
elicit_servicephaseDetermine which service / appointment type the caller wants.
+1:07.5FSM routed to booking discovery (elicit service). Because no specific rule matched the caller’s last turn — no FSM rule matched. Directive: still gathering booking details. Tools available: GetPatientDetails, CheckAvailability, GetServicesAndPricing, GetAppointmentTypes, ConvertTimezone, EscalateToHuman, TransferCall.USER+1:07.2General soreness.BOT+1:07.7immediate_ackOkay.BOT+1:12.5How long has this been going on, Daniel?USER+1:16.6Two weeks?BOT+1:17.1immediate_ackRight.BOT+1:21.2tool_lead_inTwo weeks is definitely worth getting looked at. Let me find you a time at Mosman.FSM internals
trigger:unknown/low · evidence=no_rule_matched · context=unknowndirective:booking_discoveryallowed tools:GetPatientDetails, CheckAvailability, GetServicesAndPricing, GetAppointmentTypes, ConvertTimezone, EscalateToHuman, TransferCallraw:booking_discovery - discovering service· 14.2s laterSTATE 06discovering service/ check_availabilityflow state
discovering_serviceMulti-service tenant where the service catalogue has not yet been read in this conversation. Agent must call GetServicesAndPricing before CheckAvailability becomes available, so the appointment_type_id passed to CheckAvailability is grounded in real services and not hallucinated from the prompt context.
- Enters when
- voiceBookingSession.services_discovered is NOT true AND tenant has ≥2 distinct appointmentTypeIds across practitioner_configs AND the broad booking_discovery fallback would otherwise fire.
- Exits when
- GetServicesAndPricing or GetAppointmentTypes returns successfully → services_discovered=true → next turn re-enters booking_discovery with CheckAvailability available. Caller hangs up → closing.
- Allowed tools
- GetServicesAndPricing, GetAppointmentTypes, GetPatientDetails, ConvertTimezone, EscalateToHuman, TransferCall. NO CheckAvailability, NO write tools. Surfaced from CA22eaf8a08eb69e25734c0d51b7bb6c83 — LLM hallucinated appointment_type_id=50014 and the wrong service was offered.
check_availabilityphaseLooking up available slots via CheckAvailability.
+1:21.7FSM routed to discovering service (check availability). Directive: discovering service check availability. Tools available: GetServicesAndPricing, GetAppointmentTypes, GetPatientDetails, ConvertTimezone.FSM internals
directive:discovering_service / check_availabilityallowed tools:GetServicesAndPricing, GetAppointmentTypes, GetPatientDetails, ConvertTimezoneraw:discovering_service / check_availability - offering slots· 4.7s laterSTATE 07offering slots/ present_slotsflow state
offering_slotsinsideappointment_settingCheckAvailability returned candidate slots and the agent has read them back. The caller has not yet picked one or confirmed. Tools restricted to lookups so the agent can answer questions about the offered service without re-calling CheckAvailability or writing.
- Enters when
- Prior assistant turn offered two concrete slots AND session has fresh candidate_slots AND the caller has NOT yet picked one or confirmed.
- Exits when
- Caller picks a slot → awaiting_final_confirmation. Caller asks for different times/service → resolving_service / resolving_location. Caller asks a question about the offered service → stay in offering_slots; LLM answers via lookups. Caller hangs up → closing.
- Allowed tools
- GetServicesAndPricing, GetAppointmentTypes, EscalateToHuman, TransferCall. NO CheckAvailability (slots already loaded). NO write tools.
present_slotsphaseReading the available times back to the caller.
+1:26.4FSM routed to offering slots (present slots). Directive: offering slots present slots inline. Tools available: GetServicesAndPricing, GetAppointmentTypes, GetPatientDetails, EscalateToHuman, TransferCall.toolCheckAvailability4747ms · ok+1:26.5in:{"business_id":"36","appointment_type_id":"1001"}out:{"locations":[{"id":"36","name":"ModPod Podiatry - Mosman"}],"total_slots":8,"location_name":"ModPod Podiatry - Mosman","practitioners":[{"id":"20","name":"Lov…BOT+1:26.8I can do a New Podiatry Comprehensive appointment for Fri 29 May, 8:20am with Lovelyn Felipe at Mossmen, or a New Podiatry Comprehensive appointment for Fri 29 May, 9:30am with Lovelyn Felipe at Mossmen. Which works better?FSM internals
directive:offering_slots / present_slots_inlineallowed tools:GetServicesAndPricing, GetAppointmentTypes, GetPatientDetails, EscalateToHuman, TransferCallraw:offering_slots / present_slots_inline - awaiting final confirmation· 20.6s laterSTATE 08awaiting final confirmationflow state
awaiting_final_confirmationinsideappointment_settingFinal slot has been read back to the caller. Waiting for an explicit yes/no before committing the write.
- Enters when
- Caller picked a slot from offering_slots.
- Exits when
- Caller confirms → CreateAppointment fires, → post_booking_closing. Caller declines → offering_slots (re-pick) or resolving_service (re-discover).
- Allowed tools
- No tools allowed. Agent must wait for a verbal yes/no.
+1:47.0FSM routed to awaiting final confirmation. Because slot choice high — two slot choice prompt,slot choice terms. Agent ran final slot confirmation. No tools unlocked yet (still gathering info).USER+1:47.0The second option.BOT+1:47.4immediate_ackGot you.BOT+1:47.8Just to confirm, Daniel, that's a New Podiatry Comprehensive appointment for Fri 29 May, 9:30am with Lovelyn Felipe at Mossmen. Should I book that in?FSM internals
trigger:slot_choice/high · evidence=two_slot_choice_prompt,slot_choice_terms · context=two_slot_choicedirective:two_slot_choice_selectedaction:final_slot_confirmationallowed tools:none (still gathering)raw:two_slot_choice_selected - booking existing patient· 13.2s laterSTATE 09booking existing patientflow state
booking_existing_patientCaller is an existing patient (identity orthogonal to flow). Available within any flow branch.
- Enters when
- GetPatientDetails returned a match for the caller.
- Exits when
- Identity persists for the call lifetime. Flow dimension transitions independently.
- Allowed tools
- BASE_TOOLS — patient identity is known, no CreatePatient needed.
+2:00.2FSM routed to booking existing patient. Because confirmation high — final confirmation prompt. Agent ran book confirmed selected slot. No tools unlocked yet (still gathering info).USER+2:00.2Yeah.BOT+2:00.3tool_lead_inPerfect, I'm booking that in now.toolCreateAppointment5701ms · ok+2:06.0in:{"starts_at":"2026-05-29T09:30:00","patient_id":"896058","business_id":"36","practitioner_id":"20","appointment_type_id":"1001"}out:{"spoken":"Wonderful, I've got you booked in for Fri 29 May, 9:30am. We look forward to seeing you, Daniel, and getting that sorted for you. I've sent the conf…BOT+2:06.3Wonderful, I've got you booked in for Fri 29 May, 9:30am. We look forward to seeing you, Daniel, and getting that sorted for you. I've sent the confirmation to your phone.USER+2:21.2Thank you.BOT+2:21.3No worries, have a great day.FSM internals
trigger:confirmation/high · evidence=final_confirmation_prompt · context=final_confirmationdirective:final_confirmation_received_for_loaded_slotaction:book_confirmed_selected_slotallowed tools:none (still gathering)raw:final_confirmation_received_for_loaded_slot - ended· 2m 24s laterSTATE 10endedsynthetic
+4:24.0Call ended after 264s · 8 turns · reason: caller_hangup.
Tool calls · 3
GetAppointmentTypes 366ms · ok
{}[
{
"name": "Home Visit Morning",
"duration_minutes": 30,
"appointment_type_id": "50011"
},
{
"name": "Strapping 20 mins",
"duration_minutes": 30,
"appointment_type_id": "50012"
},
{
"name": "WART",
"duration_minutes": 30,
"appointment_type_id": "150010"
},
{
"name": "Initial Tariq Visit",
"duration_minutes": 30,
"appointment_type_id": "250046"
},
{
"name": "Repeat Tariq Visit",
"duration_minutes": 30,
"appointment_type_id": "250047"
},
{
"name": "Comcare - WC Initial Consult",
"duration_minutes": 30,
"appointment_type_id": "250050"
},
{
"name": "Comcare - WC Standard ",
"duration_minutes": 30,
"appointment_type_id": "250051"
},
{
"name": "Sports Podiatry Follow Up",
"duration_minutes": 30,
"appointment_type_id": "250052"
},
{
"name": "K Laser 20min",
"duration_minutes": 20,
"appointment_type_id": "250055"
},
{
"name": "Collection and KLaser",
"duration_minutes": 30,
"appointment_type_id": "250056"
},
{
"name": "Orthotic Assessment",
"duration_minutes": 0,
"appointment_type_id": "250057"
},
{
"name": "Orth Assessment Existing",
"duration_minutes": 40,
"appointment_type_id": "250058"
},
{
"name": "K Laser/Strapping",
"duration_minutes": 20,
"appointment_type_id": "250060"
},
{
"name": "4 Week Orthotic Review",
"duration_minutes": 0,
"appointment_type_id": "250054"
},
{
"name": "K Laser 10min",
"duration_minutes": 10,
"appointment_type_id": "250059"
},
{
"name": "General 30 mins",
"duration_minutes": 30,
"appointment_type_id": "1000"
},
{
"name": "New Podiatry Comprehensive",
"duration_minutes": 30,
"appointment_type_id": "1001"
},
{
"name": "Biomechanical Existing Pt",
"duration_minutes": 40,
"appointment_type_id": "50002"
},
{
"name": "General 20mins",
"duration_minutes": 20,
"appointment_type_id": "50003"
},
{
"name": "Collection Appt ",
"duration_minutes": 20,
"appointment_type_id": "50004"
},
{
"name": "Orth 6 week check",
"duration_minutes": 20,
"appointment_type_id": "50005"
},
{
"name": "Free Laser Assessment",
"duration_minutes": 30,
"appointment_type_id": "50006"
},
{
"name": "Bio 12 mnth Comprehensive",
"duration_minutes": 30,
"appointment_type_id": "50007"
},
{
"name": "Nail Surgery 1 Toe",
"duration_minutes": 60,
"appointment_type_id": "50009"
},
{
"name": "Nail Surgery 2 Toes",
"duration_minutes": 50,
"appointment_type_id": "50010"
},
{
"name": "New Biomechanical",
"duration_minutes": 40,
"appointment_type_id": "50014"
},
{
"name": "Re-dressing",
"duration_minutes": 30,
"appointment_type_id": "50015"
},
{
"name": "Diabetic Assessment",
"duration_minutes": 30,
"appointment_type_id": "50016"
},
{
"name": "Bio 6 Month Check",
"duration_minutes": 30,
"appointment_type_id": "50017"
},
{
"name": "Initial Laser 1 Foot",
"duration_minutes": 30,
"appointment_type_id": "50019"
},
{
"name": " Hot Laser follow up",
"duration_minutes": 30,
"appointment_type_id": "50020"
},
{
"name": "Shock Wave",
"duration_minutes": 30,
"appointment_type_id": "50021"
},
{
"name": "DVA Foot Health Check",
"duration_minutes": 30,
"appointment_type_id": "50023"
},
{
"name": "Cold Laser",
"duration_minutes": 20,
"appointment_type_id": "50025"
},
{
"name": "Intial Laser 2 Feet",
"duration_minutes": 30,
"appointment_type_id": "50026"
},
{
"name": "Free Bio",
"duration_minutes": 30,
"appointment_type_id": "250025"
},
{
"name": "3 Month Orthotic Review",
"duration_minutes": 20,
"appointment_type_id": "250053"
},
{
"name": "Home Visit Afternoon",
"duration_minutes": 30,
"appointment_type_id": "250061"
}
]CheckAvailability 4747ms · ok
{
"business_id": "36",
"appointment_type_id": "1001"
}{
"locations": [
{
"id": "36",
"name": "ModPod Podiatry - Mosman"
}
],
"total_slots": 8,
"location_name": "ModPod Podiatry - Mosman",
"practitioners": [
{
"id": "20",
"name": "Lovelyn Felipe"
},
{
"id": "22",
"name": "Alison Pasut"
},
{
"id": "23",
"name": "Trent Baker"
}
],
"available_slots": [
{
"business_id": "36",
"business_name": "ModPod Podiatry - Mosman",
"practitioner_id": "20",
"duration_minutes": 30,
"appointment_start": "2026-05-29T08:20:00",
"practitioner_name": "Lovelyn Felipe",
"appointment_type_id": "1001",
"appointment_type_name": "New Podiatry Comprehensive",
"appointment_start_formatted": "Fri 29 May, 8:20am [2026-05-29T08:20:00]"
},
{
"business_id": "36",
"business_name": "ModPod Podiatry - Mosman",
"practitioner_id": "20",
"duration_minutes": 30,
"appointment_start": "2026-05-29T09:30:00",
"practitioner_name": "Lovelyn Felipe",
"appointment_type_id": "1001",
"appointment_type_name": "New Podiatry Comprehensive",
"appointment_start_formatted": "Fri 29 May, 9:30am [2026-05-29T09:30:00]"
},
{
"business_id": "36",
"business_name": "ModPod Podiatry - Mosman",
"practitioner_id": "22",
"duration_minutes": 30,
"appointment_start": "2026-06-04T12:00:00",
"practitioner_name": "Alison Pasut",
"appointment_type_id": "1001",
"appointment_type_name": "New Podiatry Comprehensive",
"appointment_start_formatted": "Thu 4 Jun, 12pm [2026-06-04T12:00:00]"
},
{
"business_id": "36",
"business_name": "ModPod Podiatry - Mosman",
"practitioner_id": "22",
"duration_minutes": 30,
"appointment_start": "2026-06-04T12:30:00",
"practitioner_name": "Alison Pasut",
"appointment_type_id": "1001",
"appointment_type_name": "New Podiatry Comprehensive",
"appointment_start_formatted": "Thu 4 Jun, 12:30pm [2026-06-04T12:30:00]"
},
{
"business_id": "36",
"business_name": "ModPod Podiatry - Mosman",
"practitioner_id": "22",
"duration_minutes": 30,
"appointment_start": "2026-06-04T14:00:00",
"practitioner_name": "Alison Pasut",
"appointment_type_id": "1001",
"appointment_type_name": "New Podiatry Comprehensive",
"appointment_start_formatted": "Thu 4 Jun, 2pm [2026-06-04T14:00:00]"
},
{
"business_id": "36",
"business_name": "ModPod Podiatry - Mosman",
"practitioner_id": "22",
"duration_minutes": 30,
"appointment_start": "2026-06-04T15:30:00",
"practitioner_name": "Alison Pasut",
"appointment_type_id": "1001",
"appointment_type_name": "New Podiatry Comprehensive",
"appointment_start_formatted": "Thu 4 Jun, 3:30pm [2026-06-04T15:30:00]"
},
{
"business_id": "36",
"business_name": "ModPod Podiatry - Mosman",
"practitioner_id": "23",
"duration_minutes": 30,
"appointment_start": "2026-06-10T16:30:00",
"practitioner_name": "Trent Baker",
"appointment_type_id": "1001",
"appointment_type_name": "New Podiatry Comprehensive",
"appointment_start_formatted": "Wed 10 Jun, 4:30pm [2026-06-10T16:30:00]"
},
{
"business_id": "36",
"business_name": "ModPod Podiatry - Mosman",
"practitioner_id": "23",
"duration_minutes": 30,
"appointment_start": "2026-06-10T17:00:00",
"practitioner_name": "Trent Baker",
"appointment_type_id": "1001",
"appointment_type_name": "New Podiatry Comprehensive",
"appointment_start_formatted": "Wed 10 Jun, 5pm [2026-06-10T17:00:00]"
}
],
"deposits_required": false,
"practitioner_name": "Lovelyn Felipe",
"has_multiple_locations": false,
"has_multiple_practitioners": true
}CreateAppointment 5701ms · ok
{
"starts_at": "2026-05-29T09:30:00",
"patient_id": "896058",
"business_id": "36",
"practitioner_id": "20",
"appointment_type_id": "1001"
}{
"spoken": "Wonderful, I've got you booked in for Fri 29 May, 9:30am. We look forward to seeing you, Daniel, and getting that sorted for you. I've sent the confirmation to your phone.",
"status": "booked_and_sms_sent",
"appointment_id": "6410701"
}Call Notes
FSM Final State
| status | active |
| booking_result.status | created |
Flow Diagram · 10 states
- 01init3.9s later
- 02greeting11.8s later
- 03booking discovery10.8s later
- 04discovering service41.3s later
- 05booking discovery14.2s later
- 06discovering service4.7s later
- 07offering slots20.6s later
- 08awaiting final confirmation13.2s later
- 09booking existing patient2m 24s later
- 10endedinstant
Click a state to jump to its detail card above. Red border = FSM stalled at a tool inside that state.