The AI phone assistant answers inbound calls for a location, uses your RentalTide data to answer questions, can text booking links, and can hand callers to staff when a human is needed. Manage it from Agents > Phone. The retired /calling page redirects to the same phone-agent workspace.
AI phone setup is location-specific. Select a single location in the location switcher before configuring phone numbers, prompts, or staff routing.
Setup checklist
| Step | Where | Notes |
|---|---|---|
| Connect Stripe | Admin > Stripe & payments | AI phone administration requires a connected Stripe account before the /ai-phone configuration APIs can be used. |
| Open the phone workspace | Agents > Phone | Use /agents?channel=phone for a direct link. |
| Get or share a number | Phone number card | Search by country and area code, then choose a voice-capable number. Shared numbers can serve multiple locations. |
| Configure the assistant | Agent settings | Set the greeting, personality, transfer message, voice, booking-link behavior, and transcript behavior. |
| Configure staff handoff | Ring order & schedule | Add enabled staff, phone numbers, priorities, ring timeouts, weekly schedules, and date overrides. |
| Turn it on | Top-right On/Off switch | Calls to the location's Twilio number are answered by the AI when enabled. |
Call flow
When the phone agent is enabled, Twilio connects the call to the AI phone WebSocket. The session loads the location, inventory, pricing, caller context, website knowledge, and selected knowledge bases before answering.
If the agent decides a human is needed, it uses the forward_call tool. The handoff route recomputes the current ring list from Ring order & schedule, filters out the caller's own number, plays the configured hold music, and rings staff. If no staff member can be reached, the caller goes to voicemail.
Shared numbers are supported. When multiple locations share a number, only locations with the AI phone enabled participate in the multi-location prompt.
Agent settings
| Setting | What it controls | Constraints |
|---|---|---|
| Assistant name | How the assistant introduces itself | Leave blank to let the system use a generic assistant identity. |
| Welcome greeting | First thing the caller hears | Keep it short so callers can state their request quickly. |
| Personality & instructions | Tone and call-handling guidance | Use business rules, escalation preferences, and phrases to avoid. |
| Transfer message | Message before human handoff | Played before staff are rung. |
| Voice | ElevenLabs voice used by ConversationRelay | You can select a listed voice or paste any ElevenLabs voice ID. Some voices may fail preview if they require a paid ElevenLabs plan, but can still work on live calls through Twilio. |
| Text booking links to callers | Allows the agent to send SMS checkout links | The agent limits booking links per call to avoid spammy repeated sends. |
| Text missed callers who have a booking | Sends a follow-up text after silent or abandoned calls | Only applies when RentalTide can match the caller to an existing booking-holder. |
| Minimum booking notice | Earliest start time the phone agent may offer | 0 allows same-day bookings. Use 24 or higher to prevent last-minute AI-created bookings. |
| Save call transcripts | Stores transcript content with call logs | Use call logs for quality review and coaching. |
Use specific instructions instead of vague brand language. For example: "If a caller asks about same-day jet ski rentals, check availability first, then text a booking link. If the caller asks about weather refunds, transfer to staff."
Knowledge sources
The assistant builds its answers from several sources:
| Source | How to update it | Notes |
|---|---|---|
| RentalTide data | Inventory, pricing, availability, bookings, and location settings | Loaded at call start and used by phone tools such as availability checks and booking-link creation. |
| Website knowledge | Add Website URL, then click Scrape Now or wait for the daily scrape | Runs daily at 4:00 AM UTC. The scraper accepts public HTTP/HTTPS URLs, rejects internal/private targets, does not follow redirects, times out after 15 seconds, and stores up to 8,000 characters. |
| Knowledge bases | Select chips in Knowledge bases | If nothing is selected, the assistant uses the location's default bases plus shared bases. |
| Additional context | Personality & instructions / business context fields | Best for concise rules that are not already in the website or knowledge base. |
After a manual scrape, the settings panel shows the last scrape time, page title, and indexed character count. If scraping fails, review the URL, redirect behavior, and whether the page requires login or blocks bots.
Staff handoff and voicemail
Staff routing is managed in Ring order & schedule:
| Field | Purpose |
|---|---|
| Name and phone number | The staff member RentalTide will dial during handoff. |
| Priority | Ring order. Lower priority values are attempted first. |
| Ring timeout | How long to wait before moving to the next staff member. |
| Enabled | Disabled staff are skipped. |
| Weekly schedule | Availability windows by day of week. |
| Schedule overrides | One-off off/available windows for specific dates. |
By default, staff schedules are honored. If scheduling is turned off for the location, all enabled staff can be rung regardless of their schedule.
Handoff is only attempted when the AI explicitly transfers the call or the caller is still connected. This prevents staff from being rung after a caller already hung up.
Live monitoring and call logs
The phone workspace shows:
- Live calls with in-progress status and transcript updates.
- Recent calls with caller details, duration, outcome, summary, and transcript.
- Outcomes such as
resolved,transferred, andabandoned.
The Inbox conversation view also uses the phone-call feed, including ALL_LOCATIONS when the inbox is scoped across every owned location.
Live call state is held by the server handling the active call. Completed call logs are persisted and remain available after the call ends.
Developer reference
| Layer | Codepath |
|---|---|
| Primary UI | src/pages/Operations/AgentsPage/components/PhoneChannelWorkspace.tsx |
| API client | src/api/aiChatPhone.ts |
| Phone config REST API | packages/RentalTide-Server/src/routes/aiPhoneRouter.ts (/ai-phone/config/:locationId, /calls, /stats, /active-calls, /inbox-calls, /scrape, /voices) |
| Twilio voice webhooks | packages/RentalTide-Server/src/routes/communications/routes/voice.routes.ts (/communication/voice/incoming-call, handoff, voicemail, hold-music presets) |
| WebSocket session | packages/RentalTide-Server/src/services/aiPhone/AiPhoneSession.ts and wsHandler.ts (/ai-phone/ws) |
| Website scrape | packages/RentalTide-Server/src/services/aiPhone/websiteKnowledge.ts and jobs/scrapeWebsiteKnowledge.ts |
| Staff routing | packages/RentalTide-Server/src/db/dal/phoneStaff.ts, routes/communications/services/ringEngine.ts, and handoff helpers |
| Phone numbers | src/api/renters.ts and /userManagement/find-phone-numbers, /purchase-phone-number, /share-phone-number, /unshare-phone-number |
Configuration is stored on the location's ivr_config JSONB. The backend updates it inside a primary-database transaction with row locking so rapid toggles and settings saves do not clobber each other.
Troubleshooting
The phone workspace will not load or save -- Confirm the account has Stripe connected and that the signed-in user owns the selected location.
No phone number is shown -- Use Get a number for the selected location, or share an existing Twilio number to the location.
Calls still reach the old IVR -- Confirm the AI phone switch is on for the location that owns the dialed number. If AI setup fails during Twilio ingress, calls fall back to IVR/staff routing.
Website scrape fails -- Use a public HTTP/HTTPS page that returns HTML within 15 seconds and does not require redirects, login, or internal-network access.
Staff are not rung -- Check that staff are enabled, have valid phone numbers, and are currently inside their schedule windows. If schedules should be ignored, turn off staff scheduling for the location.
A caller hung up and staff were not rung -- That is expected unless the AI had already initiated a handoff while the call was still in progress.

