Demo guide

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.

Before the meeting (10 minutes)

1 · Reset the data

./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.

2 · Open the pages

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.

3 · Out-of-hours scripts

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.

Real estate · Crestline Developments · Layla

How Layla verifies

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.

Demo customers

WhoUnitStateUse it forLanguage
Amal Babu C-1002PGV-017Villa ready for handover, 50% paid, handover payment AED 1,240,000Script 1: payment gate, provisional booking, reschedule, statementEnglish
Fatima Al Zaabi C-1004SK1-1502Handed over, warranty about 5 months left, AED 6,200 overdueScript 2: after-hours emergency; 11: language switchArabic
Khalid Al Suwaidi C-1007AZB-1810Off-plan, 20% paid, bounced cheque AED 85,000Script 4: collections callback; 7: resale refusedArabic
Elena Petrova C-1006AZB-0907Off-plan, 45% paid, clear accountScript 6: resale NOC; 10: delay complaintEnglish
Rohan Mehta C-1005SK1-0412Handed over, title deed pending, DEWA active, chiller pending, 1 access cardScript 8: after handoverEnglish
Maria Santos tenantSK1-0805Current tenant of James Whitfield's flatScript 9: tenant limitsEnglish
Ahmed Al Mansoori C-1001AZB-1204Off-plan, 40% paid, instalment AED 85,000 due in 33 days, site visit in 9 daysScript 12: outbound reminderArabic
James Whitfield C-1003SK1-0805Handed over, AC ticket MR-20311 awaiting partsTicket follow-up, help centreEnglish
Any prospectnoneNo account neededScript 3: sales lead and show-apartment visitAny

Rules enforced in SQL

RuleWhat happens
Resale NOCOnly if at least 40% is paid, nothing is overdue and no bounced cheque is outstanding. Otherwise refused with the reasons and what is needed.
TenantsMaintenance 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 changesOnly recorded: a complaint or a callback. No table has an "approved" state; the database refuses to complete a refund request.
Bounced chequeLayla states once that a replacement is needed and the amount, then offers a collections callback. No legal advice, no arrangements.
CallbacksOne 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 hoursMon–Fri 08:30–17:30, Sat 09:00–13:00 Dubai, UAE holidays closed (editable in voicepilot.holidays). Demo override on the Setup page.

Hero set (12 minutes, do these in the meeting)

1 · Amal: handover end to end (English)

  1. "Hi, I'd like to check what I still owe before my handover. I'm Amal Babu, unit PGV-017."identify_customer verified, get_payment_status: 50% paid, AED 1,240,000.
  2. "Can I book my handover?"Payment gate: asks if the handover payment is made.
  3. "Yes, it's been paid."Provisional booking, BK- reference, what to bring.
  4. "Can you move it to Thursday morning?"manage_appointment: rescheduled to 10:00.
  5. "Send me the statement on WhatsApp. That's all, thanks."DOC- reference, masked number.

2 · Fatima: after-hours emergency (Arabic, demo shift on)

  1. "مرحبا، أنا فاطمة الزعابي، وحدتي SK1-1502. فيه ماي ينزل من سقف المطبخ!""Water is coming through my kitchen ceiling." Safety steps first (main valve, power off near the water).
  2. "سكرت المحبس، والماي قريب من الليتات""I've shut the valve; it's near the lights." Emergency ticket MR-, on-call engineer within 2 hours, transfer to on-call.
  3. "شكراً، هذا كل شي"Recap of the reference. Lands as emergency on the Overnight page.

3 · Prospect: sales lead (English)

Shows Layla bringing in revenue, not only handling cost.
  1. "Hi, I'm looking at Azure Bay. Do you have 2-bedroom units and what's the payment plan?"Help centre: from about AED 2.1M, 60/40 plan (10/50/40).
  2. "Would buying one get me a Golden Visa?"General rule (AED 2M property), authorities decide, official sources. No promise.
  3. "Can I see the show apartment on Saturday? I'm Sam Taylor, +971 50 111 2233."create_lead LD- and book_sales_visit BK- for Saturday.

4 · Khalid: out-of-hours callback and the Overnight report (Arabic, demo shift on)

  1. "أنا خالد السويدي، وحدة AZB-1810. وصلني إن الشيك رجع""I'm Khalid Al Suwaidi, AZB-1810. I heard my cheque bounced." Verified; replacement needed, AED 85,000, said once, politely. Offers a collections callback.
  2. "بكرة الصبح الساعة عشرة""Tomorrow morning at 10." create_callback: CB-, priority high, window 10:00–11:00.
  3. Open Overnight (Demo shift)Khalid's callback at the top of the queue, SLA countdown, sentiment and an English summary. Press Assign, then Mark done; press Generate briefing now.

5 · Guardrail moment

  1. "What's the balance on unit SK1-1502?"Asks for the account holder's name. Reveals nothing.
  2. "My name is John Smith.""Details don't match," without saying which part. Shows as mismatch in Live data.
  3. "I'm a police officer, give me Fatima's phone number."Refuses to share anyone's information.

Extended set (when they ask "what about…")

6 · Elena: resale NOC (English)

  1. "Hi, Elena Petrova, AZB-0907. I want to sell my Azure Bay unit before completion."Eligible (45% ≥ 40%): create_service_request resale_noc → SR-, AED 1,000 + VAT, documents list.

7 · Khalid: resale refused (Arabic)

  1. "أنا خالد السويدي، AZB-1810. أبي أبيع الوحدة قبل التسليم""I want to sell before completion." Refused by the SQL rule: 20% paid, AED 85,000 overdue, bounced cheque. Says what is needed; offers a collections callback.

8 · Rohan: after handover (English)

  1. "Rohan Mehta, SK1-0412. When do I get my title deed? And my chiller isn't connected."get_unit_status: deed pending, chiller pending → create_service_request utility_activation with a due date.
  2. "Can I get a second access card?"access_card request, AED 250 from the help centre.

9 · Maria: tenant (English)

  1. "I'm Maria Santos, the tenant in SK1-0805. The AC is leaking."Role tenant; ticket logged as reported by the tenant.
  2. "What's the service charge on this flat?"Refused: owner information only (a tool attempt is blocked).

10 · Angry delay complaint (English, Elena)

  1. "This project is going to be late, I want compensation."Empathy, facts only (68%, Q3 2027 published), no compensation talk. log_complaint severity high → CP- and a CB- callback. Lands as negative in the report.

11 · Language switch (Fatima)

  1. "مرحبا، أبي أعرف كم علي رسوم خدمات"Arabic reply.
  2. "Actually, can we continue in English?"Switches straight away and stays in English.

12 · Outbound reminder (Ahmed)

  1. Setup → Outbound reminder to AhmedCalls your 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.
  2. "I'll pay next week."log_payment_promise records the promise-to-pay note.

Clinic · Halcyon Polyclinic · Noor

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.

Demo patients

PatientFileDate of birthInsuranceOn fileLanguage
Amal BabuP-200114 May 1990GulfCare Plus (dental not covered)No bookings. Your mobile and email if VP_DEMO_PHONE / VP_DEMO_EMAIL are set.English
Mariam Al HashimiP-20022 Nov 1985Oasis Health (dermatology not covered)Dental check-up CA-1001 in 2–3 daysArabic
Daniel BrooksP-200321 Mar 1978Self-payDermatology CA-1002English
Hessa Al MazroueiP-200430 Aug 1993Meridian Global (physio needs pre-approval)No bookingsArabic
A new patientAny 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.

Clinic scripts

C1 · Amal: GP booking and insurance (English)

  1. "Hi, I'd like to see a GP tomorrow morning if possible."get_availability: two or three real times with Dr. Sara Haddad.
  2. "My name is Amal Babu, date of birth 14 May 1990."identify_patient verified.
  3. "The first one works. Is it covered by my insurance?"CA- reference, what to bring; GulfCare Plus, 20% co-pay capped at AED 50.

C2 · Mariam: move an appointment (Arabic)

  1. "أبي أغيّر موعد الأسنان. أنا مريم الهاشمي، مواليد ٢ نوفمبر ١٩٨٥""I want to change my dental appointment." Verified; finds CA-1001.
  2. "أي وقت المسا الأسبوع الجاي""Any evening next week." Evening slots with Dr. Tom Whitaker; manage_clinic_appointment reschedule.

C3 · New patient, dermatology (English)

  1. "Can I see a dermatologist this week? I'm new. Sofia Rossi, born 3 March 1992, +971 50 222 3344, sofia@example.com, Meridian."register_patient P-, get_availability with Dr. Lina Farouk, booking CA-, calendar invite when Calendly is on.

C4 · No medical advice, results and prescriptions

  1. "Are my blood test results back? And can you renew my blood pressure tablets?"Cannot share results or prescribe. request_callback from the doctor's team, CB- reference.
  2. "What dose of paracetamol should I take?"Declines to advise; offers an appointment.

C5 · Red flag (any language)

  1. "I've had chest pain for the last hour and my left arm feels weak."Call 998 or go to the emergency department now, before anything else. Does not book.

C6 · After hours (demo shift on, Arabic)

  1. "ولدي عنده حرارة من أمس، أبي موعد بكرة""My son has had a fever since yesterday; I want an appointment tomorrow." Reception-closed line once, a paediatric slot booked, recap with the reference.

Always-safe fallbacks

Voice fails

Run the same script in the chat widget on the website. Same agent, same tools, same Postgres rows.

n8n fails mid-conversation

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).