Tenant Emergency Voice AI: CallSphere Escalation Ladder vs Vapi
Score >=0.6 triggers a Primary contact ladder with 6 fallbacks. Vapi has no escalation primitives — you build the entire state machine.
TL;DR
CallSphere's After-Hours Escalation product runs a deterministic escalation ladder: when an emergency scores ≥0.6, the system pages Primary + Secondary + 6 fallback contacts with simultaneous voice call + SMS per position, with a 120-second timeout before advancing. Acknowledgment from any position stops the cascade. Vapi.ai has zero escalation primitives — no ladder model, no ACK detector, no timeout state machine. To match CallSphere you would write the entire orchestrator yourself, debug it under real-emergency stress, and own the operational risk forever. This post breaks down the ladder mechanics with a Mermaid state diagram and a worked tenant emergency example.
Why the Ladder Matters More Than the Voice
The voice on the other end of an emergency call is the visible part. The escalation ladder is the invisible part that decides whether the emergency gets handled. A perfect voice talking to the wrong person at the right time is worse than a serviceable voice talking to the right person.
Marsh McLennan's 2024 commercial property risk study found that the single biggest driver of after-hours incident cost is time-to-acknowledgment — the elapsed time between when the emergency is reported and when a responsible human acknowledges they are responding. Every 15 minutes of delay on a water leak adds an average of $2,400 in remediation. Every 30 minutes of delay on a fire-suppression failure adds compounding liability.
The ladder is the mechanism that minimizes time-to-ACK.
The CallSphere Ladder Model
The ladder lives in escalation_ladder_config and on_call_rotations. A ladder for one property at one moment in time looks like:
| Position | Role | Contact | Channels | Timeout |
|---|---|---|---|---|
| 1 | Primary | Jose Hernandez (maintenance) | voice + SMS | 120s |
| 2 | Secondary | Maria Lopez (maintenance) | voice + SMS | 120s |
| 3 | Fallback 1 | Tom Reilly (regional mgr) | voice + SMS | 120s |
| 4 | Fallback 2 | 24/7 plumbing service (Acme) | voice + SMS | 180s |
| 5 | Fallback 3 | District manager (Sarah) | voice + SMS | 120s |
| 6 | Fallback 4 | Backup plumbing service (Beta) | voice + SMS | 180s |
| 7 | Fallback 5 | VP Operations | voice + SMS | 120s |
| 8 | Fallback 6 | CEO emergency line | voice + SMS | 120s |
Each position is paged with simultaneous voice + SMS so the contact gets it through whichever channel they happen to be near. The 120-second timeout per position is empirically tuned — long enough for a sleeping person to wake, find the phone, and respond; short enough that 8 positions exhaust in under 18 minutes if no one responds.
What Vapi Has
Vapi has voice. To build a ladder on Vapi you write:
- A scheduler that fires Vapi outbound calls on a timer.
- A SMS sender (Twilio) parallel to the call.
- A Postgres state machine tracking which position is active.
- An ACK listener (DTMF, SMS reply, callback).
- A loop advance with timeout.
- A configurator for the ladder per property + time-of-day.
- A logging layer for compliance.
- A test harness — because you cannot debug an escalation system in production.
This is a 4-8 week engineering project for a senior engineer. CallSphere ships it.
Comparison
| Capability | After-Hours Escalation | Vapi |
|---|---|---|
| Ladder model in DB | escalation_ladder_config | Build it |
| Primary + Secondary + 6 fallbacks | Default | Build it |
| Simultaneous voice + SMS | Default | Build orchestrator |
| 120s timeout per position | Configurable | Build timer |
| ACK stops the cascade | AckMonitorAgent | Build detector |
| Multi-channel ACK (voice DTMF, SMS YES, callback) | All three | Build all three |
| Per-property ladder config | Yes | Build it |
| Per-time-of-day rotation | on_call_rotations | Build it |
| Audit trail | escalation_logs | Build it |
| Time to deploy | Days | Months |
The Ladder State Machine
```mermaid graph TD A[Event Created Score >=0.6] --> B[Build Ladder from Rotation + Config] B --> C[Position = 1: Primary] C --> D[Fire Voice Call + SMS Simultaneously] D --> E[Start 120s Timeout] E --> F{ACK Received?} F -->|YES via SMS| G[AckMonitorAgent: Stop] F -->|YES via Voice DTMF| G F -->|YES via Callback| G F -->|No, timeout| H{Last Position?} H -->|No| I[Advance: Position += 1] I --> J{Service Provider Position?} J -->|Yes| K[Use 180s Timeout] J -->|No| L[Use 120s Timeout] K --> D L --> D H -->|Yes| M[admin_alerts: Page Property Manager] G --> N[Log ACK to acknowledgments Table] M --> O[Log Cascade Exhausted] N --> P[Reply to Tenant: Person En Route] O --> Q[Manual Intervention Required] P --> R[Update daily_metrics] Q --> R ```
The state machine is deterministic. There is no LLM judgment in the ladder advance — that is intentional. You do not want a model deciding whether a tenant emergency has been acknowledged based on vibes. Determinism keeps the system predictable in court and in operations review.
ACK Detection — Three Channels
A position is considered acknowledged if any of the following happens within the timeout window:
- SMS reply containing "YES" (case-insensitive, with optional punctuation).
- Voice DTMF: pressed 1 during the live call.
- Callback to the platform number within timeout.
The AckMonitorAgent listens on all three channels and writes to acknowledgments with timestamp, position, channel, and response payload. This three-channel design is critical because at 3am, half the on-call population responds via callback (they are confused by the SMS) and half by SMS (they cannot find the phone but read the text).
Worked Example: 3:42am Gas Smell
A tenant calls the after-hours line at 3:42am: "I smell gas in the hallway, it's strong."
Step 1 (DialpadAgent + VoiceAgent): Live conversation. Captures "gas" keyword (0.95 weight). Score = 0.95. Above threshold.
Step 2 (HeadAgent): Creates Event severity=high category=gas. Builds ladder for that property. Note: gas events have a specialized ladder that includes the local utility emergency line as Fallback 1.
Step 3: Position 1 (Jose). Voice + SMS fired simultaneously. Jose's voicemail picks up after 4 rings. SMS unread. 120s timeout.
Step 4 (Advance): Position 2 (Maria). Maria answers the voice call. VoiceAgent says: "Active gas smell at 1234 Main, hallway. Tenant on scene. Press 1 to acknowledge and respond." Maria presses 1.
See AI Voice Agents Handle Real Calls
Book a free demo or calculate how much you can save with AI voice automation.
Step 5 (AckMonitorAgent): Detects DTMF=1. Stops cascade. Writes acknowledgment.
Step 6 (Parallel): Because category=gas, Fallback 1 (utility) is also paged regardless — gas events trigger a non-stop "always notify utility" override. Utility dispatch confirmed.
Step 7 (HeadAgent): Replies to tenant via voice and SMS: "Maria from maintenance is en route, ETA 18 minutes. The gas company has also been called. Please leave the building immediately and wait outside."
Total time from tenant call to first ACK: 3 minutes 8 seconds. From event creation to gas company dispatch: 1 minute 12 seconds.
Why Per-Category Ladders Matter
Gas, fire, and medical emergencies have different ladders than water and HVAC because the response constraints are different. Gas always notifies the utility. Fire always notifies 911 dispatch. Medical always asks the tenant whether they need 911 first. The ladder is a configuration, not a hardcoded behavior.
Vapi has none of this. You write each special case yourself, debug it in production (yikes), and pray.
SMS Templates and Tone
The SmsAgent uses templated messages with dynamic variables. Sample templates:
- Maintenance staff page: "URGENT [property]: [category] event Unit [unit]. Tenant: [tenant_name]. Reply YES to ACK + dispatch, NO to skip."
- Service provider page: "URGENT dispatch needed: [property]. [category] event, severity [severity]. Reply ACK to confirm response within [timeout]."
- Property manager last-resort: "All ladder positions failed. [property] [category]. See dashboard: [link]."
Templates are tuned for SMS readability — short, structured, with clear CTAs. Tone is professional-urgent, never panicky. We have iterated on these templates across 18,000+ live emergencies and the current set has the highest first-position ACK rate.
Vapi: write them yourself. Tune them yourself.
Voice Scripts and the Phonebook of Phrases
The VoiceAgent uses TTS scripts with controlled phrasing. Live emergency-page calls open with a specific cadence — slower delivery, no greetings, urgent vocabulary:
"Active gas leak at 1234 Main, hallway. Tenant on scene. You are position one of eight. Press one to acknowledge and respond, two to decline."
This phrasing is engineered. Slow it down too much and the contact loses urgency. Speed it up and they cannot process the address. We use a 14% slower TTS rate than standard sales delivery and a deeper-pitch voice profile. Vapi-based builds we have audited use default sales-style fast voices for emergency pages, which feel disrespectful to the situation.
What Happens When Multiple Events Hit at Once
A real-world stress: it is a winter night, freeze-thaw cycle hits the property, and 14 units file emergency reports for water leaks within 90 minutes. The system has to triage:
- Each event is created independently.
- The HeadAgent groups events by property + category.
- If the count crosses a threshold (configurable, default 5 same-category events in 60 minutes), an "incident" is declared.
- The incident triggers a different escalation: the property manager and emergency vendor are paged directly, and the per-unit ladders are paused (because every per-unit ladder paging the same maintenance contact is wasteful).
- The system shifts into "incident response" mode — single coordination point, single dispatch.
This sophistication is why the platform is built for property management specifically. Vapi has no concept of incident grouping; you build the entire incident-management layer.
Geographic Routing for Multi-Property Portfolios
Property management firms with 50+ properties across multiple cities need geographic awareness. CallSphere's events carry property + city + region. Ladders are property-specific (each property has its own on-call rotation). When the firm's regional manager has a Friday-night blackout window, the ladder skips them and routes to the regional backup.
on_call_rotations supports timezone-aware schedules so a property in Phoenix has its on-call rotation in MST while a property in Boston is in EST, all without the agent confusing them.
FAQ
What if the tenant calls 911 themselves?
That is the desired behavior for life-safety emergencies. The agent always reminds the tenant to call 911 if they have not, and the property ladder is parallel — the agent dispatches maintenance/utility while 911 handles the life-safety side.
Can I customize timeout per contact?
Yes. escalation_ladder_config has per-row timeout. We default to 120s for staff, 180s for service providers (they often need to wake up a dispatcher).
What if the SMS gateway is rate-limited?
The platform retries SMS via a secondary Twilio subaccount and falls back to voice-only paging if SMS is degraded. This is bundled.
How do contacts opt out of paging?
escalation_contacts has an active flag and PTO/vacation overrides. A contact who is on vacation is automatically skipped, and the ladder is recomputed.
What about compliance and audit?
escalation_logs is append-only and stored with cryptographic chaining (each row hashes the previous). Full audit trail for insurance and litigation.
Can we see ladder performance over time?
Yes. The dashboard surfaces per-property median time-to-ACK, ACK rate by ladder position, cascade-exhausted rate, and false-positive rate. Quarterly reviews surface where the rotation needs adjustment.
Does CallSphere replace our existing dispatcher service?
Most customers use both initially — CallSphere for immediate triage and ladder paging, the dispatcher service as a fallback if the ladder exhausts. After 90 days, most customers migrate fully to CallSphere because the dispatcher fallback is rarely triggered (under 1% of events).
How is voicemail handled if a contact does not answer?
VoiceAgent leaves a structured voicemail: same urgent tone, full address, callback number, and a "press 1 if you got this" instruction for the next dial.
See the Ladder Run Live
Book a demo at /demo — we will simulate a tenant emergency on your real ladder configuration and show you the cascade end-to-end.
Try CallSphere AI Voice Agents
See how AI voice agents work for your industry. Live demo available -- no signup required.