Trades agent system
Book the missed call into ServiceTitan
An unanswered call, or any after-hours call, goes to a voice agent that classifies the job, pages the on-call tech for emergencies, and books repairs into ServiceTitan.
- Difficulty
- Difficulty 4 of 5 in the research brief.
- Setup time
- Estimate, not from the brief: several days after ServiceTitan API access is approved, because the emergency branch has to be tested with a real on-call phone.
The pain
Home-service shops lose jobs when the phone rings and nobody picks up. The caller does not wait, and almost nobody leaves a voicemail.
27% of home-services calls go unanswered (Invoca 2024).
Source type · Call-analytics vendor
14% missed-call rate across 1.1 million conversations (CallRail, January 2025).
CallRail figure as compiled by Keystone
Source type · Call-analytics vendor
18% of calls go unanswered on weekdays, versus 41% on weekends.
Keystone compilation of answering-service research
Source type · Call-analytics vendor
Fewer than 3% of callers sent to voicemail leave a message.
Keystone compilation of answering-service research
Source type · Call-analytics vendor
46% of phone leads convert on the call.
Invoca Call Conversion Benchmarks, home services, 2025
Source type · Call-analytics vendor
85% of callers who do not reach someone never call back. This is a secondary compilation, not the original study.
Source type · Secondary source
Unanswered after 3 rings, or after hours
RingCentral or CallRail sends the call to Grok Voice (or Retell/Vapi)
Look up the caller in ServiceTitan and confirm the address if they are known
Classify: emergency, repair, estimate, existing job, or out of area
Branch
Emergency
No heat below 40°F outside, an active leak, or a burning smell. Quote the after-hours fee, text the on-call tech, and escalate to the owner if there is no acknowledgment in 5 minutes.
Repair
Offer two open slots and book the job through the ServiceTitan API, with a summary in the job notes.
Out of area or wrong trade
Say so plainly and refer. Do not book a job you will not run.
SMS confirmation, then post the transcript and tag the lead source
Trigger
The call is not answered in 3 rings, or it is any after-hours call. RingCentral or CallRail forwards it to a Twilio number on Grok Voice (model grok-voice-3.0, alias grok-voice-latest). Retell or Vapi can take that same forward if you are not using Grok Voice.
Data sources
- ServiceTitan customers, locations, job types, and technician availability
- A price-book summary, including the after-hours fee
- The service-area zip list
- CallRail or the phone system for the caller ID and the transcript
Voice layer
Recommended first option: Grok Voice by xAI, model grok-voice-3.0 (alias grok-voice-latest). Retell and Vapi stay as alternatives.
Published xAI price for grok-voice-3.0: $0.08 per minute of audio ($4.80 per hour), plus $0.004 per text input. A text input is a conversation.item.create, except function_call_output items and audio items. response.create is not billed as a text input.
At $0.08 a minute, 200 minutes of calls is 200 × $0.08 = $16 of speech. Each billed text input adds $0.004, so a handful of text items on those calls is cents, not another per-minute rate. An hour of audio is $4.80 before text inputs. Retell and Vapi remain alternatives and are priced by those vendors.
Latency. xAI's own claim is sub-second speech-to-speech latency. That is a vendor claim. This site has not measured it.
- 10 concurrent sessions per team, from the speech-to-speech rate limits.
- 120-minute maximum session.
Function calling is built in, including custom functions, so a tool in the session can book into ServiceTitan directly. You still implement that function against the ServiceTitan API. ServiceTitan's own limits stay in force: Zapier registration is required, and ServiceTitan says that integration is not officially supported.
Twilio setup
A. Elastic SIP trunk. In Twilio, set the origination URI to sip:{number}@sip.voice.x.ai;transport=tls and assign the shop number. Register that number with xAI as origin byo_trunk and a webhook, and store the signing secret (xAI returns it once). On the signed realtime.call.incoming webhook, verify webhook-id, webhook-timestamp, and webhook-signature, then read data.call_id. Connect to wss://api.x.ai/v1/realtime?call_id={call_id} with your API key, send session.update, then response.create. Transfers go to POST /v1/realtime/calls/{id}/refer. Turn on call transfer on the Twilio trunk if you transfer mid-call.
B. Twilio Media Streams. Your server passes μ-law (PCMU, 8 kHz) audio straight through to wss://api.x.ai/v1/realtime, with no PCM conversion. The xAI phone cookbook shows this path and says the examples are not production-ready without extra hardening.
Build it
- 1
Forward only the calls a person did not answer
In RingCentral or CallRail, send unanswered calls and the after-hours schedule to the Twilio number wired to Grok Voice. The Voice layer section has the SIP trunk and Media Streams setups. Retell or Vapi can replace that number. Leave answered calls with the office.
- 2
Look the caller up before you ask them to repeat themselves
Pass the caller ID to ServiceTitan. If the number matches a customer, confirm the address on file. If it does not, collect the address and zip.
- 3
Classify the call before you offer a time
The agent sorts the call into emergency, repair, estimate, or an existing job. Emergency in this build means no heat when it is under 40°F outside, an active leak, or a burning smell.
Branch. Emergency quotes the after-hours fee, texts the on-call tech, and expects an acknowledgment within 5 minutes. No acknowledgment escalates to the owner. Repair reads open capacity, offers two options, and books through the API with a summary in the job notes. Out of area or the wrong trade gets a polite referral and no booking.
- 4
Confirm by text and file the transcript
Send an SMS confirmation and the tech's photo when you have one. Post the transcript to CallRail or the CRM and tag the lead source.
Tools and rough monthly cost
Grok Voice is $0.08 per minute ($4.80 per hour) plus $0.004 per text input, from xAI's pricing page. Two hundred minutes is 200 × $0.08 = $16 of speech, before text-input charges. Retell and Vapi are alternatives priced by those vendors. Automation software is the smaller line. ServiceTitan is the subscription you already pay. Other dollar figures on this page are unverified list-price estimates.
| Tool | Job | Rough monthly |
|---|---|---|
| Grok Voice (or Retell/Vapi) | Recommended voice layer. Model grok-voice-3.0 (alias grok-voice-latest). Retell and Vapi remain alternatives. | xAI published price: $0.08 per minute ($4.80 per hour) plus $0.004 per text input. Retell and Vapi are priced by those vendors.xAI pricing |
| Twilio | The SMS confirmation and the on-call page | About $1 a month for a local number, plus per-message usage. Unverified public list-price estimate, October 2026. Not a figure from the research brief. Check the vendor.Unverified |
| n8n, Make, or Zapier | Connects the voice agent to ServiceTitan and the on-call text | n8n or Make cloud starters are often in the low tens of dollars. Zapier paid plans cost more at the same volume. Unverified public list-price estimate, October 2026. Not a figure from the research brief. Check the vendor.Unverified |
| ServiceTitan API | Customer lookup, capacity, and booking | Your existing ServiceTitan subscription. Zapier can book jobs and add notes or tasks, but registration is required and ServiceTitan says the integration is not officially supported. |
| LLM API | Classification and the job-note summary | Usually a few dollars a month at one-shop volume. Unverified public list-price estimate, October 2026. Not a figure from the research brief. Check the vendor.Unverified |
Expected ROI
Fill in your own numbers. The brief's formula is: missed calls per week × 46% × your average ticket × 52. The 46% is Invoca's benchmark for phone leads that convert on the call, a vendor stat. It is not a promise that a recovered missed call books at that rate. Subtract voice cost at $0.08 per minute of Grok Voice audio, plus $0.004 for each billed text input.
Caveats
- ServiceTitan's Zapier integration requires registration and is not officially supported. Scheduling Pro webhooks were in private preview when this was researched.
- Google Voice has no public API. A solo operator has to forward the shop number to Twilio, RingCentral, or CallRail before this agent can see the call.
- Call recording needs consent in many states. The brief flags call-recording consent and TCPA/A2P 10DLC registration as go-live guardrails. Confirm the rule where you operate.Unverified
- A CallDispatcher claim that 62% of calls go unanswered while the owner is on a job is unaudited. It is not used as a figure on this page.
Example prompt
Change the names, fees, and slots before you run it. It does not add facts that were not in the brief.
You answer missed calls for a home-service company and book only what the office rules allow. Classify the caller as emergency, repair, estimate, existing job, or out of area. Emergency means: no heat and the caller says it is under 40°F outside, an active leak, or a burning smell. For an emergency, state the after-hours fee, text the on-call tech, and escalate to the owner if there is no acknowledgment in 5 minutes. For a repair, offer two open slots from the availability you were given. Do not invent a time. If the zip is outside the service area, or the trade is wrong, refer them and do not book. Write the job note in four lines: problem, address, urgency, and the slot they accepted.