We built this intake agent — Ella — for a multi-state home-services chain. It answers every call and text, qualifies the job, and books it straight into ServiceTitan, 24/7. Below is exactly how, step by step, down to the schema it extracts and the calls it makes to the ServiceTitan API.
Built on ServiceTitan here — the same agent runs on any major home-services platform
Call or chat with Ella and try her yourself — she qualifies a plumbing job just like she does live: answers, understands the problem, and collects the details. It's a demo line, so she takes the intake but won't actually dispatch a truck.
Call Ella
(435) 246-0972Give her a plumbing problem out loud — she answers, qualifies it, and collects the details, just like a dispatcher.
One agent · four jobs
Answers every call and text on the first ring — voice or SMS.
Qualifies the job and captures clean customer + address details.
Categorizes the work, routes to the nearest branch, books the slot.
None of it stops at 5pm, on weekends, or during an overflow rush.
Every step is one conversation. The teal chip on each step is the actual action the agent takes in ServiceTitan.
Ella answers instantly — voice or SMS, any hour, on your existing numbers.
The caller describes it in plain words: “there's water pooling under my kitchen sink.”
Looks the caller up in ServiceTitan by phone. If they're on file, it greets them by name and reuses their address.
Confirms they're in the service area, then gathers name, service address, phone, and email — filling gaps it already has on file.
Pulls your current job-type catalog and your branches on the call — so it uses your categories and locations, never generic ones.
Turns the messy conversation into a strict, typed record — every field the booking needs, validated by construction.
“Tomorrow afternoon” becomes a concrete slot in the branch's local time, with a real arrival window.
Matches the problem to your “Water Heater — Repair” job type and picks the nearest branch by address.
Writes a new customer and service location into ServiceTitan (or reuses the matched one).
Creates a scheduled job on your dispatch board with the appointment window and a summary of the issue.
Anything out of its lane — a live person, a solicitor, an upset customer — gets a warm transfer.
Messy human input on the left. A clean, booked job on the right — no one re-typed a thing.
What the caller said
What the agent created in ServiceTitan
The reason it books cleanly every time: the conversation isn't "parsed" into loose text — it's turned into a strict, typed schema. Every field a ServiceTitan booking needs is required and validated before a single write happens.
first + last, capitalized
parsed address; state → 2-letter
normalized to +1 & 10 digits
or a sane default if not given
matched to YOUR catalog
nearest branch by city
resolved from “tomorrow”, local TZ
time + brief description
for the dispatcher
Missing details fall back to sensible defaults (job type, service area, contact) so the record is always bookable — dispatch never gets a blank or broken ticket to chase.
Under the hood
Anyone can bolt a chatbot onto a phone line. Booking a clean, dispatch-ready job from a messy human conversation — every time — is the hard part. Here's what that took.
The agent doesn't guess fields from free text — it emits a strict JSON schema with typed, required fields. Every booking is complete and valid by construction, so nothing half-formed reaches your dispatch board.
Before it creates anything, it searches ServiceTitan by phone. Known callers are greeted by name and their address is reused — no duplicate customer records for repeat business.
Job types and business units are pulled fresh on every call. The agent books with your real categories and branches — if you add a job type tomorrow, it uses it, with no retraining.
“Tomorrow afternoon,” “this weekend,” “first thing Monday” resolve to a concrete ISO slot in the correct branch's local time — handled per state for a multi-state operation.
If a caller is vague, sensible defaults fill the gaps (job type, service, zip) so dispatch always receives a bookable job — never a blank or broken one to chase down.
It picks the branch in the caller's own city when there is one, otherwise the closest — so the job lands on the right dispatch board the first time.
The same agent works over voice or SMS and reads the entire conversation, not one message — so details mentioned early still make it onto the ticket.
Customer → location → job with a scheduled appointment, all through ServiceTitan's own CRM and JPM APIs. The booking shows up on the board exactly as a CSR's would.
No black box. A single booked job is this handful of ServiceTitan API calls, in order — reads first to learn your setup, writes last to create the job.
t = your tenant id · authenticated with OAuth 2.0 + your ServiceTitan app key
This client runs its whole operation on ServiceTitan — their practice-management and workflow-orchestration platform — so that's where the agent reads and writes. But the platform is the swappable part. If you run Housecall Pro, Jobber, FieldEdge, Workiz, or ServiceFusion, the same agent is buildable for you — it just talks to your system instead. ServiceTitan's API happens to be unusually deep, which is why this build goes this far end to end.
How AI integrates with ServiceTitan — the full API pictureWhat it takes on the technical side
Tell us how customers reach you and what software you run — ServiceTitan, Housecall Pro, or anything else. We'll show you exactly which of these steps an agent can run for you.