One platform, two businesses: Crestline Developments (real estate, agent Layla) and Halcyon Polyclinic (clinic, agent Noor). Customers, scripts and what each step should show. Keep Live data or Overnight open next to the chat.
./start.sh --no-open db/reset_demo.sh
Clears every live conversation, booking, ticket, lead, request, complaint and callback for both businesses, re-seeds the customers (dates relative to today), regenerates 14 days of sample history and prints a checklist. Every line must show ✓. Safe to run twice.
Websites: hub, Crestline (/crestline/) and Halcyon (/clinic/). Team: Live data, Overnight, Report. The switch in the top bar picks Real estate or Clinic.
"Include sample history" on the reports is on by default; switch it off to show only today's live calls.
For scripts 2 and 4, open Setup → Demo controls and press Start demo shift. Layla (and Noor) switch to out-of-hours mode, and the Overnight page opens on the demo shift so the calls show as tonight's. Press Real Dubai clock afterwards.
End each conversation with "that's all, thanks" so it closes and saves (the post-call record lands 10 to 30 seconds later). One customer per conversation: start a new chat for each script.
Enforced in Postgres. Owner: unit number plus the account holder's full name (or caller ID from the number on file). Tenant: unit number plus the tenant's name on file gives role tenant: maintenance, move-in permit and access cards only, never owner data. A unit number alone reveals nothing. Three wrong attempts lock lookups.
| Who | Unit | State | Use it for | Language |
|---|---|---|---|---|
| Amal Babu C-1002 | PGV-017 | Villa ready for handover, 50% paid, handover payment AED 1,240,000 | Script 1: payment gate, provisional booking, reschedule, statement | English |
| Fatima Al Zaabi C-1004 | SK1-1502 | Handed over, warranty about 5 months left, AED 6,200 overdue | Script 2: after-hours emergency; 11: language switch | Arabic |
| Khalid Al Suwaidi C-1007 | AZB-1810 | Off-plan, 20% paid, bounced cheque AED 85,000 | Script 4: collections callback; 7: resale refused | Arabic |
| Elena Petrova C-1006 | AZB-0907 | Off-plan, 45% paid, clear account | Script 6: resale NOC; 10: delay complaint | English |
| Rohan Mehta C-1005 | SK1-0412 | Handed over, title deed pending, DEWA active, chiller pending, 1 access card | Script 8: after handover | English |
| Maria Santos tenant | SK1-0805 | Current tenant of James Whitfield's flat | Script 9: tenant limits | English |
| Ahmed Al Mansoori C-1001 | AZB-1204 | Off-plan, 40% paid, instalment AED 85,000 due in 33 days, site visit in 9 days | Script 12: outbound reminder | Arabic |
| James Whitfield C-1003 | SK1-0805 | Handed over, AC ticket MR-20311 awaiting parts | Ticket follow-up, help centre | English |
| Any prospect | none | No account needed | Script 3: sales lead and show-apartment visit | Any |
| Rule | What happens |
|---|---|
| Resale NOC | Only if at least 40% is paid, nothing is overdue and no bounced cheque is outstanding. Otherwise refused with the reasons and what is needed. |
| Tenants | Maintenance for their unit, move-in permit and access card only. Payments, service charges, statements, title deed and bookings are blocked (tenant_no_owner_data). |
| Refunds, compensation, plan changes | Only recorded: a complaint or a callback. No table has an "approved" state; the database refuses to complete a refund request. |
| Bounced cheque | Layla states once that a replacement is needed and the amount, then offers a collections callback. No legal advice, no arrangements. |
| Callbacks | One queue for every channel, with priority and SLA: emergency now (on-call), high within 1 business hour, normal 4, low by the end of the next business day. A later preferred window wins. |
| Office hours | Mon–Fri 08:30–17:30, Sat 09:00–13:00 Dubai, UAE holidays closed (editable in voicepilot.holidays). Demo override on the Setup page. |
identify_customer verified, get_payment_status: 50% paid, AED 1,240,000.manage_appointment: rescheduled to 10:00.create_lead LD- and book_sales_visit BK- for Saturday.create_callback: CB-, priority high, window 10:00–11:00.create_service_request resale_noc → SR-, AED 1,000 + VAT, documents list.get_unit_status: deed pending, chiller pending → create_service_request utility_activation with a due date.log_complaint severity high → CP- and a CB- callback. Lands as negative in the report.VP_DEMO_PHONE: instalment AED 85,000 due in 33 days, polite reminder. Only inside the UAE calling window (Mon–Fri 09:00–18:00) unless the demo override is on.log_payment_promise records the promise-to-pay note.Noor books from the doctors' calendars. With CALENDLY_TOKEN set, availability and bookings are live in Calendly (an email invite goes to the patient); without it, or if Calendly fails, she books from the clinic's own slots in Postgres and Live data shows the sync state. Verification: date of birth plus file number or full name, checked in the database. Noor never gives medical advice; red-flag symptoms go to 998.
| Patient | File | Date of birth | Insurance | On file | Language |
|---|---|---|---|---|---|
| Amal Babu | P-2001 | 14 May 1990 | GulfCare Plus (dental not covered) | No bookings. Your mobile and email if VP_DEMO_PHONE / VP_DEMO_EMAIL are set. | English |
| Mariam Al Hashimi | P-2002 | 2 Nov 1985 | Oasis Health (dermatology not covered) | Dental check-up CA-1001 in 2–3 days | Arabic |
| Daniel Brooks | P-2003 | 21 Mar 1978 | Self-pay | Dermatology CA-1002 | English |
| Hessa Al Mazrouei | P-2004 | 30 Aug 1993 | Meridian Global (physio needs pre-approval) | No bookings | Arabic |
| A new patient | Any name, date of birth and mobile: Noor opens a file with register_patient. | ||||
Doctors: Dr. Sara Haddad (GP, mornings), Dr. Arjun Menon (GP, afternoons, evenings, Fridays), Dr. Omar Rahimi (paediatrics, Sun–Thu), Dr. Lina Farouk (dermatology, Mon, Wed, Sat), Dr. Tom Whitaker (dental), Rania Aziz (physiotherapy). Reception: Sat–Thu 08:00–22:00, Fri 14:00–22:00; Noor books 24/7.
get_availability: two or three real times with Dr. Sara Haddad.identify_patient verified.manage_clinic_appointment reschedule.register_patient P-, get_availability with Dr. Lina Farouk, booking CA-, calendar invite when Calendly is on.request_callback from the doctor's team, CB- reference.Run the same script in the chat widget on the website. Same agent, same tools, same Postgres rows.
Tools fail fast through the tunnel; Layla and Noor switch to intake mode: no invented facts, they take name, number, need and a time. The post-call analysis carries the callback, and elevenlabs/backfill.py (run by ./start.sh) replays missed conversations after recovery, which creates the CB- row (source intake_backfill).