ServiceTitan logoThe AI Receptionist for ServiceTitan
Trusted by 100+ service businesses

An AI Receptionist that books, reschedules & cancels appointments — 24/7 — and writes them straight into ServiceTitan logoServiceTitan.

Plugs into your website and phone line. Voice in 30+ languages. Live by tonight, booking customers by tomorrow. No Zapier, no n8n, no code.

Intentionally cheap so you can prove it works before spending more.
SalonsHair stylistsBarbershopsMed spasNail studiosLash barsDental clinicsChiropractorsPhysiotherapyMassage therapistsWellness clinicsDermatologyVeterinary clinicsPet groomingHome servicesPlumbersElectriciansHVACCleaning servicesLawn careTutorsPersonal trainersYoga studiosPilates studiosLaw firmsAccountantsReal-estate agentsPhotographers SalonsHair stylistsBarbershopsMed spasNail studiosLash barsDental clinicsChiropractorsPhysiotherapyMassage therapistsWellness clinicsDermatologyVeterinary clinicsPet groomingHome servicesPlumbersElectriciansHVACCleaning servicesLawn careTutorsPersonal trainersYoga studiosPilates studiosLaw firmsAccountantsReal-estate agentsPhotographers
§ 01 — See it in action

Talk to the agent on the left. Watch the booking appear on the right.

This is the same agent shape you'll deploy. Ask it about a haircut on Tuesday, a reschedule, or a cancel — it'll write the appointment straight into the calendar.

Live AI chat → connected to ServiceTitan
Bookings land here in real time
ServiceTitan logoWorks with ServiceTitan
§ 02 — Questions you'd ask before buying

FAQ — ServiceTitan integration.

Does this actually work with my ServiceTitan tenant?
Yes. AnyCRM uses ServiceTitan's official API with a registered Integration App Key and scoped OAuth. Every captured caller lands as a Customer with the right Location and Business Unit, plus a first note from the call. Bookings land as native Jobs + Appointments on a skill-matched Technician's dispatch board, attributed to a dedicated AI Receptionist Campaign so your marketing reporting stays clean.
Will it create duplicate Customers in ServiceTitan?
No. AnyCRM resolves the existing Customer first (normalising phone and email) before writing. A returning caller becomes a new note on the existing record, never a second Customer, and the active Membership stays attached.
Can it route different calls to different Business Units — HVAC, Plumbing, Electrical, Drain?
Yes. AnyCRM matches the caller's symptom to the trade, resolves the Business Unit, picks a valid Job Type within that Business Unit, and books on a Technician qualified for the work. Multi-trade shops get correct routing without cross-board mis-bookings.
Where do the bookings actually live — on the dispatch board or somewhere else?
On the dispatch board. Every booking is a native ServiceTitan Job + Appointment, on a qualified Technician, in a valid arrival window, on the correct Business Unit's dispatch board. The same surface your CSRs book to. There is no shadow calendar.
Can it cancel or reschedule a Job from a phone call?
Yes. The caller gives their phone number, AnyCRM finds the soonest upcoming Appointment, the AI Receptionist reads back the Job Type and arrival window, and AnyCRM either reschedules in place or cancels with a mapped Cancel Reason and a note on the Customer and Job. Cancelled Jobs transition state correctly so dispatch doesn't keep trying to recover them.
What if a caller has two upcoming Jobs in ServiceTitan?
AnyCRM lists every upcoming Appointment for that Customer (Job Type, date, arrival window, Technician, Business Unit) and the AI Receptionist asks which one to change before doing anything. It never assumes.
Does it handle Memberships and Service Agreements?
Yes. Active Memberships and Service Agreements on the matched Customer are surfaced at routing time, so the booking respects member-priority arrival windows and the Job is tagged for member-rate pricing. The Membership is never orphaned by a duplicate Customer because AnyCRM doesn't create duplicate Customers.
Does it handle timezones correctly?
Yes. The AI Receptionist confirms the caller's timezone, AnyCRM books against your tenant's configured arrival-window slots (interpreted in the tenant's timezone, which is how ServiceTitan stores time internally), and the AI Receptionist reads the arrival window back to the caller in their local timezone. No customer-facing UTC strings, no off-by-an-hour confirmations.
Does it create Jobs with the right Campaign attribution?
Yes. AnyCRM stays focused on the conversation surface: capturing the Customer, matching the right Technician, booking the Job on the right Business Unit. But the moment a Job is created, AnyCRM tags it with the dedicated AI Receptionist Campaign you configured at setup, so ServiceTitan's lead-source reporting can separate AI-Receptionist-driven Jobs from any other source. Beyond that initial Campaign tag, downstream policy (priority Job Types for emergencies, Membership-rate pricing application, recall-workflow triggers) lives inside your CRM, in the receiving flow we wire up for you at onboarding. AnyCRM doesn't try to encode policy that will drift out of date the moment your business changes.
How does the conversion tracking work?
Every lead event AnyCRM produces (from a phone call, a chat conversation, OR a website form / online-booking submission) flows through a single conversion pipe. It lands in your CRM for business logic. AND it fires server-side into Google Ads, Facebook Ads, and your analytics platform, using the origin of the domain you registered with AnyCRM. Server-side means the conversion can't be blocked by ad-blockers and doesn't degrade under iOS / Safari tracking restrictions. The result: higher ROAS, lower Cost per Lead, enriched analytics, and attribution that doesn't fragment between web and voice. As far as we can tell, none of our competitors have built this yet for the trades.
What about my existing website forms and online booking? Do they go through the same pipe?
Yes — that's the whole point. Web forms / online booking AND the AI Receptionist produce the same lead-event shape with the same source taxonomy. They land in the same place in your CRM, and they fire the same server-side conversion event into your ad platforms. So your bid strategy optimises against unified, real conversions instead of fragmenting across web-only and voice-only stacks.
How long until it's actually capturing calls into ServiceTitan?
Most shops are live the same afternoon. The Integration is already registered on the Developer Portal, so install takes a few minutes. The Business Unit + Job Type + Technician + Membership import is automatic. We wire up the lead-receiving flow inside your CRM during onboarding. The phone integration is usually under an hour. Web chat is faster.
ServiceTitan logoWorks with ServiceTitan
§ 03 — Availability & Booking

Captures the caller as a ServiceTitan Customer, books the Job on the right dispatch board, and feeds one unified conversion pipe for your website forms AND your AI Receptionist.

Every caller who rings the shop lands as a ServiceTitan Customer with a Location, a Job of the right Job Type on the right Business Unit, and a scheduled Appointment on a qualified Technician's board. AnyCRM writes all of it through ServiceTitan's own API DURING the call. AND the same lead event flows through one unified pipe (with the same shape, same source attribution, and same server-side conversion path used by your website forms) so your CRM business logic and your Google / Facebook / LinkedIn Ads both stay in sync.

A.01

Every caller becomes a ServiceTitan Customer + Location, not a missed ring

The AI Receptionist captures name, primary phone, email, service address, and the trade-specific symptom (no cool air, dripping shutoff valve, breaker tripping). Then AnyCRM writes the Customer and the Location into ServiceTitan on the right Business Unit before the call has ended.

A.02

Books Jobs against the right capacity board

AnyCRM resolves the right Job Type, reads live Technician capacity from the dispatch board for that Business Unit and trade, and books the Appointment on a Technician qualified for the work. Not on the first open slot it sees.

A.03

Sends the lead event straight to your CRM. You decide what happens next.

AnyCRM does not pretend to know your dispatch policy. Every Customer-create and every Job-book sends a lead event straight to your CRM (with source: "AI Receptionist Call" or source: "AI Receptionist Web") where YOUR business logic takes over. Which Campaign, which priority Job Type, which recall workflow, which member-rate pricing. We set up the receiving end inside your CRM for you during onboarding, tuned to your trades and your tenant configuration. AnyCRM doesn't get in the way of policy you've already encoded.

One conversion pipe for your website forms AND your AI Receptionist.

Most home-services shops run two completely separate conversion-tracking stacks: one for the website (forms, online booking, page-load pixels) and a totally absent one for the phone and the AI Receptionist. So Google Ads and Facebook Ads only learn from form-fills, the bidding optimises for the wrong audience, attribution is broken, and the no-heat caller who phoned at 9pm is invisible to your marketing reporting. AnyCRM closes that gap by running BOTH surfaces through a single conversion pipe.

1. Capture

A lead arrives either through your website form / online booking widget OR through the AI Receptionist on phone / chat. Either way, AnyCRM produces the same clean lead-event shape, tagged at source with either AI Receptionist Call, AI Receptionist Web, or your website's form identifier. One vocabulary across both surfaces.

2. Deliver to your CRM

AnyCRM sends the lead event straight to your CRM, into the receiving flow we wired up for you at onboarding. Your business logic decides what happens next: which Campaign, which priority, which Membership pricing tier, which recall workflow, which dispatch escalation. You don't have to maintain two sets of rules. Web leads and AI Receptionist leads both arrive through the same door.

3. Fire server-side conversion to your ad platforms

The same lead event fires server-side into Google Ads, Facebook Ads, and your analytics platform, using the origin of the domain you registered with AnyCRM. Server-side means the conversion can't be blocked by ad-blockers, doesn't degrade under iOS / Safari tracking restrictions, and lands with full attribution context.

4. Optimise, attribute, report

Because website conversions AND AI Receptionist conversions flow through the same pipe with the same source taxonomy, your Google Ads bid strategy now optimises against real booked Jobs (not just form-fill noise), your Facebook Ads campaigns see the high-intent homeowner who picks up the phone, your analytics platform sees a single unified funnel, and attribution stops fragmenting between web and voice.

Most competitor AI Receptionists try to maintain rules for which Campaign to tag, when to create the Job, what priority to set, and which source value to apply. That approach breaks the moment your tenant adds a Business Unit or your marketing team launches a new Campaign, and it ignores the conversion-tracking surface entirely. AnyCRM inverts the responsibility. AnyCRM stays focused on the conversation (capture, dedup, trade-route, book, cancel) and delivers a clean lead event to the two destinations that matter: your CRM (for business logic) and your ad platforms server-side (for conversion optimisation, attribution, and ROAS). This is a custom service baked into the AI Receptionist package. We configure the lead-receiving flow inside your CRM AND the server-side conversion tracking at onboarding, matched to your trades, your Campaigns, your Membership tiers, and your analytics setup.

We'll be candid: as far as we can tell, none of our competitors have thought of this yet. They sell AI Receptionists to contractors as a phone-answering product. AnyCRM treats the AI Receptionist as one of two equally weighted entries into a unified lead-event pipe, and that's where the real compounding value sits for a shop spending $10k+/month on Google Ads.

For your developer: how this wires into ServiceTitan

The AI Receptionist asks AnyCRM for availability against the Technicians on your roster and gets back open arrival windows in the caller's timezone. No double bookings. Qualified-Technician-only. Every AnyCRM call dedups the Customer by phone then email, creates or links the Location, opens the Job of the correct Job Type on the right Business Unit, writes the Appointment with the assigned Technician, attributes the Job to the AI Receptionist Campaign you configured at setup, and sends the lead event straight into your CRM tagged with <code>AI Receptionist Call</code> or <code>AI Receptionist Web</code>. The same lead also feeds the AnyCRM Conversion Lift pipeline (covered in the next capability) so your Google, Facebook, and LinkedIn Ads start optimising against the call and chat leads that actually pick up the phone.

getServicetitanAvailability()createServicetitanContactAppointment()
POST/mcp/tools/getServicetitanAvailability
{
  "invitee_timezone": "America/New_York",
  "start_time": "2026-05-15",
  "end_time":   "2026-05-17",
  "event_type_uuid": ["b050bcf6-b5b0-42a8-9359-aba11e711311"],
  "multi_day": true,
  "include_scheduling_url": false
}
200response
{
  "date_range_label": "Friday, May 15, 2026 – Sunday, May 17, 2026",
  "event_types": [{
    "event_type_uuid": "b050bcf6-b5b0-42a8-9359-aba11e711311",
    "total_slots": 15,
    "available_times_by_date": {
      "Friday, May 15, 2026": [
        { "start_time": "2026-05-15T10:00:00-04:00", "status": "available" },
        { "start_time": "2026-05-15T10:30:00-04:00", "status": "available" },
        { "start_time": "2026-05-15T11:00:00-04:00", "status": "available" }
      ]
    }
  }]
}
POST/mcp/tools/createServicetitanContactAppointment
{
  "name": "Jane Doe",
  "email": "jane@example.com",
  "phone": "+14155551234",
  "scheduled_datetime": "2026-05-15T11:00:00",
  "invitee_timezone": "America/New_York",
  "event_type_uuid": "b050bcf6-b5b0-42a8-9359-aba11e711311",
  "questions_and_answers": []
}
200response
{
  "event_uuid": "a7c1f4e9-...",
  "start_time": "2026-05-15T11:00:00-04:00",
  "start_time_utc": "2026-05-15T15:00:00Z",
  "invitee_timezone": "America/New_York",
  "reschedule_url": "https://...",
  "cancel_url": "https://..."
}
ServiceTitan logoWorks with ServiceTitan
§ 04 — Ads Conversion Lift

Turns every call and chat into a real conversion event your Google, Facebook, and LinkedIn Ads can actually optimise against. So Cost per Lead drops, ROAS goes up, and CAC stops being a guess.

If you run paid Ads on Google, Facebook, or LinkedIn for your shop, here is the uncomfortable truth: those platforms only get smarter when they see real conversions. Today, a website form-fill counts. A real phone call from a homeowner with a no-heat emergency at 7pm does NOT count. So Google bids harder on the audience that fills web forms (often the cheaper, lower-intent one) and ignores the audience that actually calls. Cost per Lead looks fine. CAC quietly creeps up. ROAS looks misleading. AnyCRM fixes this. Every call and chat the AI Receptionist handles is sent as a real conversion event to Google Ads, Facebook Ads, AND LinkedIn Ads. The bidding algorithm finally sees what's actually working.

1b.01

Every phone call and every chat becomes a tracked conversion. Not just website form-fills.

Today, Google Ads and Facebook Ads probably think your only conversions are website form-fills and online-booking submissions. That's why your Cost per Lead looks low but your dispatch board is light. The high-intent homeowner is calling you instead of filling a form, and the Ad platforms have no idea. AnyCRM sends every call and every chat the AI Receptionist handles into your Ad platforms as a real conversion event. Suddenly Google, Facebook, and LinkedIn can see the FULL picture of who is converting from your Ads.

1b.02

Lower Cost per Lead. Better ROAS. Smaller CAC.

Once your Ad platforms can see the phone calls and chats as real conversions, they re-train on a better signal. Bidding shifts toward audiences that actually pick up the phone, not just the audience that loves filling out forms. In practice this means: Cost per Lead drops because you stop overpaying for low-intent form-fills; Return on Ad Spend goes up because the Ads now find homeowners closer to ready-to-book; and Customer Acquisition Cost shrinks because more of your Ad budget reaches buyers who will actually become booked Jobs.

1b.03

The same pipe carries your website forms too. One source of truth across Ads, CRM, and Analytics.

AnyCRM doesn't just track AI Receptionist conversions. It also runs your existing website forms and online booking through the same pipeline. So a lead from a Google Ad that filled a form on your website AND a lead from a Facebook Ad that called the AI Receptionist three days later both end up tagged, attributed, and counted in exactly the same way. Your Ads platform stops double-counting, your analytics stop fragmenting, and your CRM stops being half-blind to where your Jobs actually came from.

Imagine you spend $15,000/month on Google Ads for your HVAC shop. Today, you see 90 web form-fills and online-booking submissions and assume that's the full picture. With AnyCRM running, you'll also see (say) 140 phone calls and 70 web chats the AI Receptionist handled, all flowing into Google Ads as real conversions. Suddenly Google sees 300 conversions a month instead of 90. It re-trains on that bigger, better signal. Within weeks, the bidding finds you more of the right kind of homeowner: the one with a $12,000 system replacement, not the one comparison-shopping for a $79 tune-up. Same $15,000 spend, more booked Jobs at higher ticket, lower Cost per Lead, higher revenue. That is what "AI Receptionist with AnyCRM" actually means for the bottom line. Not just "it answers the phone."

For your developer: how the Conversion Lift pipeline works with ServiceTitan

Every Customer-create and Job-book fires through AnyCRM's Conversion Lift pipeline. The lead event lands inside your CRM for business logic, AND fires a real conversion event server-side into Google Ads, Facebook Ads, and LinkedIn Ads using the verified origin of your registered domain. Server-side means the conversion can't be blocked by ad-blockers, doesn't degrade on iOS or Safari, and arrives with full attribution context so the Ad platforms' bidding algorithms can re-train on it. Your existing website forms and online-booking widget run through the same pipeline, so Web and Voice conversions feed the SAME training signal.

createOrUpdatesServicetitanContact()createServicetitanContactAppointment()
ServiceTitan logoWorks with ServiceTitan
§ 05 — Search, Reschedule & Cancel

Owns the full Job + Appointment lifecycle inside ServiceTitan.

Every "can you push my Tuesday service to Thursday?" or "the part came in early, can the tech come tomorrow?" lands with the AI Receptionist instead of in dispatch's queue. AnyCRM reschedules update the Appointment in place. Cancellations follow ServiceTitan's own best practice. Cancel reason mapped, note written on the Customer AND on the Job's history, parent Job transitioned to the right state. Instead of deleting the Appointment and stranding the parent Job on the dispatch board, you get crystal clarity on when a ServiceTitan Job was created, and when and why it was updated by your AI Receptionist.

B.01

Finds the Appointment by phone in a single step without needing a Job number

Customers DO NOT quote Job numbers over the phone. We've tested with hundreds of callers and each time they were asked 'Can you tell me the job number from your booking confirmation?', the response was the same: 'Why can't you find it yourself?'. AnyCRM gives the AI Receptionist an easy way to find the soonest upcoming Appointment linked to the matching Customer (phone first, email fallback). And the AnyCRM response forces the AI Receptionist to be human. It reads back the Job Type, arrival window, and service address before changing anything.

B.02

Reschedules in place and keeps the Job open

Rescheduling moves the Appointment to a new arrival window on the same (or a re-resolved qualified) Technician, in one confirmation. The Job stays open, the Customer stays linked, the Membership stays attached. Failed reschedules leave the original Appointment untouched. So a botched reschedule never strands the homeowner.

B.03

Cancels without stranding the parent Job

When a caller cancels, AnyCRM patches the Appointment with the right Cancel Reason from your tenant's configured values, transitions the parent Job to the correct cancelled state so the dispatch board reflects it, and writes the caller's reason onto the Customer's notes AND on the Job's history. Instead of patching only the Appointment and leaving the Job stuck in Scheduled triggering recall workflows. This lets you intuitively track changes for ServiceTitan Jobs created or updated by your AI Receptionist.

For your developer: reschedule & cancel by email

AnyCRM's search, reschedule, and cancel all accept just a phone number. The soonest upcoming Appointment linked to the matching Customer is resolved inside AnyCRM. No Job numbers at the AI Receptionist layer.

searchServicetitanAppointments()rescheduleServicetitanAppointment()cancelServicetitanAppointment()
POST/mcp/tools/searchServicetitanAppointments
{
  "email": "jane@example.com"
}
200response
{
  "meetings": [{
    "event_uuid": "a7c1f4e9-...",
    "event_type_name": "Haircut Only | $50",
    "start_time": "2026-05-15T11:00:00-04:00",
    "status": "active"
  }]
}
POST/mcp/tools/rescheduleServicetitanAppointment
{
  "email": "jane@example.com",
  "scheduled_datetime": "2026-05-16T14:00:00",
  "invitee_timezone": "America/New_York",
  "reason": "Customer asked to move 1 day later"
}
200response
{
  "cancelled_event_uuid": "a7c1f4e9-...",
  "new_event_uuid": "f0e22c91-...",
  "new_start_time": "2026-05-16T14:00:00-04:00",
  "new_start_time_utc": "2026-05-16T18:00:00Z"
}
POST/mcp/tools/cancelServicetitanAppointment
{
  "email": "jane@example.com",
  "reason": "Customer is unwell"
}
200response
{
  "cancelled_event_uuid": "a7c1f4e9-...",
  "status": "cancelled",
  "reason": "Customer is unwell"
}
ServiceTitan logoWorks with ServiceTitan
§ 06 — Match Specialists & Services

Routes every caller to the right trade, Business Unit, and qualified Technician. And maintains existing Customer ownership and Membership status instead of fragmenting the record.

ServiceTitan shops run on Business Units (HVAC, Plumbing, Electrical, Drain, sometimes per-location), Job Types, Technician skills and license categories, and zone-based dispatch. At setup AnyCRM imports your full ServiceTitan roster into its database and enriches each Technician with lane, expertise, languages, and a callable arrival-window calendar. The AI Receptionist then routes each caller to the trade, the Business Unit, and the Technician who actually handles that work. Existing Customer ownership and Membership status in ServiceTitan are honoured as the source of truth.

C.01

Routes by trade: HVAC vs Plumbing vs Electrical vs Drain

"My AC is blowing warm" routes to the HVAC Business Unit. "Water heater leaking" routes to Plumbing. "Half my outlets are dead" routes to Electrical. The AI Receptionist matches the symptom to the trade, then to the Business Unit your dispatch already uses. It doesn't cross-book a plumber on an HVAC call. And the existing Customer record is always preserved.

C.02

Honours Membership status and prior Customer history

If the caller is an existing ServiceTitan Customer with a Service Agreement or Membership, the AI Receptionist surfaces it on the Job, applies the member arrival-window priority your dispatch encodes, and keeps the Customer record intact. No duplicate Location, no lost Membership tier.

C.03

Books on Technicians qualified for the work

Technician skills (refrigerant certification, gas-line license, master electrician) are imported at setup. AnyCRM will not book a Job Type that requires a license the assigned Technician doesn't carry. Instead it falls back to the next qualified Technician on the board for that Business Unit and arrival window. The AI Receptionist doesn't fight the rules you already use.

For your developer: specialist roster & per-service routing

Team details live in AnyCRM's database, pulled once from ServiceTitan at setup, enriched with lane, expertise, languages, license categories, and arrival-window preferences (valuable context for the AI Receptionist that ServiceTitan's user object doesn't carry by default). At runtime, one read of the team roster matches caller symptom → trade → Business Unit → Job Type → qualified Technician → arrival window. New Customers inherit the routed Technician's Business Unit. Existing Customers keep their Membership and Job history. AnyCRM does NOT cache your Campaigns, your pricebook, or your recall workflows. That policy stays inside your CRM, where it belongs.

listServicetitanTeamMembers()getServicetitanSpecialistServices()
POST/mcp/tools/listServicetitanTeamMembers
{}
200response
{
  "total_members": 3,
  "members": [
    { "user_uuid": "3d2ed2c0-...", "name": "Michelle Arcona", "role": "user",  "timezone": "America/New_York" },
    { "user_uuid": "2b00d6f3-...", "name": "Casey",           "role": "user",  "timezone": "America/New_York" },
    { "user_uuid": "1809c459-...", "name": "Cielona Boco",    "role": "owner", "timezone": "America/New_York" }
  ]
}
POST/mcp/tools/getServicetitanSpecialistServices
{
  "user_uuid": "3d2ed2c0-a8fc-45d7-9f67-fc3e6b898bb2"
}
200response
{
  "user_name": "Michelle Arcona",
  "user_timezone": "America/New_York",
  "services": [
    { "event_type_uuid": "b050bcf6-...", "name": "Haircut Only | $50",                 "duration": 50  },
    { "event_type_uuid": "9a858539-...", "name": "Fine Density Haircut & Finish | $70",  "duration": 60  },
    { "event_type_uuid": "c1f70bb1-...", "name": "Full Head + Gloss + Finish | $335",    "duration": 210 },
    { "event_type_uuid": "3c01fa3d-...", "name": "All Over Keratin Treatment | $300",    "duration": 240 }
  ]
}
ServiceTitan logoWorks with ServiceTitan
§ 07 — Setup & why it's not just another ServiceTitan wrapper

Setup in 3 steps. Battle-tested on real ServiceTitan shops.

You connect ServiceTitan once. AnyCRM imports your Business Units, Job Types, Technician roster, skills, zones, and arrival windows. AnyCRM also wires up the receiving end inside your CRM so lead events from the AI Receptionist land where your business logic can act on them. Then the AI Receptionist starts capturing calls and booking Jobs the same afternoon. No middleware. No prompt-engineering by you.

S.01

Connect ServiceTitan (Tenant ID + Integration App Key, 5 minutes)

AnyCRM is already registered as a ServiceTitan Integration on the Developer Portal. Every request the AI Receptionist makes carries AnyCRM's integration credentials alongside your tenant's OAuth bearer token, so ServiceTitan can see exactly which integration created which Job and which Appointment in the audit trail. From the Integrations page in your ServiceTitan account, install AnyCRM, grant the requested scopes (CRM, JPM, Dispatch read+write, plus read on settings), and copy the Tenant ID. Both the OAuth grant and the App Key are revocable from your ServiceTitan account at any time.

S.02

Import Business Units, Job Types, Technicians, skills & zones. Wire up your CRM's lead-receiving flow.

AnyCRM imports every Business Unit (with active flag and tax rules), every Job Type (with default duration, priority, and required skill set), every Technician (with Business Unit assignments, position, home zone, license categories), and your booking-provider arrival-window configuration. Membership tiers and Service Agreement types are read so the AI Receptionist can recognise them on returning callers. AnyCRM also freezes the Campaigns and Cancel Reasons so the AI Receptionist can only attribute and cancel with values that actually exist in your tenant. Inbound-call source attribution is locked (always AI Receptionist Call or AI Receptionist Web) so reporting stays consistent. During onboarding we set up the receiving flow inside your CRM so the lead events from the AI Receptionist land where your business logic can act on them. AnyCRM does NOT replicate your pricebook, your Campaign tagging rules, or your recall workflows. Your CRM decides what happens after a lead is captured. AnyCRM just delivers a clean event.

S.03

Drop the AI Receptionist on your phone line and your site

Forward your business number to the AI Receptionist's number and paste the chat widget into your site. The same AI Receptionist (same team roster, same ServiceTitan tenant, same Business Units, same lead-event pipe into your CRM and your ad platforms) answers both voice and web. Live the same afternoon.

Why not just use ServiceTitan's Schedule Engine and online booking widget?

Schedule Engine and ServiceTitan's online booking are excellent at the steps AFTER a homeowner has chosen to come to your website to book. They expose your arrival windows, qualify the Job Type, and write into ServiceTitan natively. They don't pick up the phone. A call at 9pm with a no-heat emergency goes to a missed call, or an answering service that doesn't know your Business Units, your Job Types, your Membership tiers, or which Technicians are qualified for what. The AI Receptionist is the layer BEFORE all of that. It picks up the call, triages the symptom into the right trade and Job Type, surfaces Membership priority for returning callers, books the Appointment on a qualified Technician's board (through the same booking-provider surface Schedule Engine uses, with the same audit attribution and the same arrival-window rules), AND sends the same lead event straight into your CRM's downstream business logic plus your ad platforms server-side. So your ServiceTitan reporting, your analytics, and your Google / Facebook Ads bidding all start optimising on a real conversation, not a missed call.

For your developer: the enrichment layer (raw ServiceTitan API vs our MCP tools)

Every tool the AI Receptionist calls is an opinionated wrapper inside AnyCRM. AnyCRM does the messy work for you. Dedup by phone then email, Customer + Location creation, Job Type resolution, Business Unit attribution, skill matching, arrival-window math, Campaign attribution, error handling, lead-event delivery into your CRM, and server-side conversion tracking into your ad platforms. All of it happens before the LLM ever sees a response. So the AI Receptionist reasons over clean, AI-aligned payloads instead of raw CRM internals.

Capturing a new lead

Raw APIWriting a Customer straight into ServiceTitan looks simple. But ServiceTitan has no implicit dedup. Call the Customer endpoint twice with the same phone and you get two Customers, two Locations, two Job histories, and a fractured Membership view. The service address is a separate first-class object that needs the Customer ID and a valid US/CA address (typos here mean the dispatch map can't place the pin). Customer type is set-once on creation. Nothing in raw ServiceTitan fires a server-side conversion event to your ad platforms, so call-driven and chat-driven leads never get optimised for.
Our MCPcreateOrUpdatesServicetitanContact accepts name, phone, email, service_address, customer_type, and the inferred Business Unit. AnyCRM queries existing Customers by phone then email, picks the surviving Customer (or creates a new one with the right values in the right order), normalises the service address and creates or reuses the Location, attaches the call summary as a Customer note, sends the lead event straight into your CRM (with source AI Receptionist Call or AI Receptionist Web), AND fires a server-side conversion event into your ad platforms using the origin of your registered domain. All in one AnyCRM call.

Booking the Job

Raw APICreating a Job in ServiceTitan looks like one call but it has hidden required structure. You need the Customer, the Location, the Business Unit, the Job Type, a priority, AND a Campaign (the Campaign is how ServiceTitan attributes the lead source. Omit it and the Job lands with no source attribution, which corrupts your marketing reporting). The Appointment is a separate child object, and ServiceTitan validates that the assigned Technician's skills cover the Job Type's required skill set. Mismatches return a 400 with an unfriendly message. Arrival windows aren't free-form datetime. They're chosen from your tenant's configured booking-provider slots, and times are interpreted in the TENANT's timezone, not the caller's.
Our MCPcreateServicetitanContactAppointment takes phone, service_address, symptom, scheduled_datetime (a naive date and time, no offset needed), and invitee_timezone. AnyCRM resolves the right Business Unit and Job Type from the symptom, resolves the right qualified Technician from the lane + skill match, picks a valid arrival window aligned to your booking-provider configuration, sets the AI Receptionist Campaign (locked at setup) so source attribution is preserved, creates the Job and Appointment in one server-side flow, sends the same lead event straight into your CRM with the booking context, fires the server-side conversion event into your ad platforms, and returns both local and tenant times in the response.

Cancelling with a reason

Raw APICancelling an Appointment in ServiceTitan can mark the Appointment cancelled, but the Cancel Reason must reference an existing value from your tenant's settings. Free text is rejected. There is also a separate Job-level state. A poorly-built integration that only cancels the Appointment leaves the parent Job stuck in Scheduled, cluttering the dispatch board and triggering recall workflows. To preserve the audit trail you have to read the Appointment and Job, write a note on the Customer with the reason, patch the Appointment with the right Cancel Reason, AND transition the Job state so dispatch doesn't keep trying to recover it. None of these are atomic by default.
Our MCPcancelServicetitanAppointment takes phone and reason. AnyCRM resolves the soonest upcoming Appointment, maps the caller's free-text reason to your tenant's configured Cancel Reason (locked at setup), writes the reason as a Customer note AND on the Job's history, patches the Appointment with the right Cancel Reason, and transitions the Job to the correct cancelled state. All in one AnyCRM call. No deletion, full audit trail, dispatch board reflects reality.

Every AnyCRM tool for ServiceTitan follows the same AI-alignment contract, so the AI Receptionist never has to think about transport:

  • Naive datetimes in, tenant-timezone-aligned shape out. The AI Receptionist passes 2026-05-15T11:00:00 and a timezone string. AnyCRM aligns it to your tenant's booking-provider arrival windows and converts to the tenant's timezone.
  • Phone is the identity. Cancel and reschedule never need a Job number at the AI Receptionist layer. Phone and soonest-upcoming resolves inside AnyCRM.
  • Job Type, Business Unit, Campaign, and Cancel Reason come from setup, not the LLM. The AI Receptionist can't invent a Job Type, tag a free-text Campaign, or cancel with a free-text reason. Every value is frozen against your tenant's configuration.
  • Existing Customers and Memberships are sacred. If a Customer exists in ServiceTitan, AnyCRM updates the existing record and preserves Membership tier, Service Agreement, and prior Job history. New Customers are only created when no match exists.
  • Skill-aware booking. AnyCRM refuses to assign a Job Type to a Technician whose skills don't cover the required license categories. Instead it falls back to the next qualified Technician on the board, never failing silently.
  • Every lead event leaves AnyCRM in two places at once. Your CRM gets the lead event so your business logic can run. Your ad platforms get the server-side conversion event so bidding optimises against real conversations. Both happen on the same AnyCRM call. No race conditions, no missing events.
  • Flat, deterministic shapes. Every AnyCRM response has the same top-level keys across every tool, so the AI Receptionist's prompt never grows with edge-case branching.
  • Errors are messages, not codes. An error from ServiceTitan becomes a one-sentence reason the AI Receptionist can repeat to the caller without translation.
  • Idempotent reschedules. If a reschedule fails mid-flight, the original Appointment and Job are preserved. The homeowner never ends up with no service window.

Multi-trade setup. Business Units, Technician skills & system-prompt assembly

Most ServiceTitan shops run multiple Business Units (HVAC, Plumbing, Electrical, Drain) with their own Job Types, their own Technicians, and their own arrival-window rules. AnyCRM imports all of it once, links each Technician to the Business Units and Job Types they actually run, and bakes the result into the AI Receptionist's system prompt at setup time. Not at runtime. The AI Receptionist doesn't query your roster on every call. It already knows who runs what trade out of which depot.

  1. Roster import. AnyCRM imports your ServiceTitan Technicians once and writes each one into its database keyed by crm_user_id (with name, role, Business Units, home zone, license categories, position).
  2. Per-Technician Job Types & skills. For each Technician AnyCRM resolves the Job Types they're qualified for (intersection of Business Unit + skill set + license category) with default duration and priority. One call per person, cached.
  3. Trade visibility. Each Business Unit + Job Type combination is flagged Public, Private, or Ignored. The AI Receptionist only routes to and books on Public lanes. You toggle this in the AnyCRM dashboard without re-deploying (useful when a Business Unit is paused for staffing).
  4. Lead-event receiving flow inside your CRM. During onboarding we wire up the flow inside your CRM that receives lead events from AnyCRM. That's where your Campaign tagging policy, Membership-priority routing, and recall-workflow triggers live. AnyCRM doesn't try to own them.
  5. System-prompt assembly. The cached roster, Business Unit, Job Type, and Membership-tier JSON is prepended to the AI Receptionist's system prompt before the humaniser splits (personality, etiquettes, tone, speech style). So the AI Receptionist reads the shop before it reads its own instructions.
  6. Runtime stays minimal. On a live call the AI Receptionist makes at most one availability call and one booking call. Never a roster lookup. Updates to Technicians, Business Units, Job Types, or skills re-run the cache. The AI Receptionist picks them up on its next deploy.

The end result: the AI Receptionist can match "my AC isn't blowing cold, it's 95 outside" → HVAC Business Unit → Service Call - No Cool Job Type → a refrigerant-certified Technician in the caller's home zone → the next valid arrival window on that Technician's board → a booked ServiceTitan Job + Appointment with the Customer's Membership tier surfaced → a lead event delivered straight into your CRM → a server-side conversion event in your ad platforms. Without a single roster query during the call.

Currently running for HVAC contractors, plumbing shops, electrical contractors, drain & sewer specialists, and multi-trade home-services franchises. Anyone whose dispatch board is in ServiceTitan but whose phone keeps ringing after the CSRs have logged off.

ServiceTitan logoWorks with ServiceTitan
§ 08 — How AI receptionists usually fail, and why ours can't

How most AI Receptionists built on Smith.ai, My AI Front Desk, or even ServiceTitan's own native AI Voice Agent fall short for HVAC, plumbing, electrical, and multi-trade home-services shops that use ServiceTitan. And why AnyCRM closes the gap.

Most AI Receptionists fall short on ServiceTitan in the same handful of ways. Third-party services (Smith.ai, My AI Front Desk) duplicate Customers, invent Job Types and Business Units, leak Campaign attribution, miss skill-aware Technician assignment, and run web/voice conversions on separate stacks. ServiceTitan's own native AI Voice Agent fixes most of the booking-side gaps natively — Adaptive Capacity, Membership Greetings, Job-Type Selection, dispatch-board awareness — but it only works on calls arriving through ServiceTitan's phone surface, treats conversion attribution as a ServiceTitan-internal concern (no server-side path to Google / Facebook / LinkedIn Ads), and keeps dispatch policy inside ServiceTitan's configuration surface rather than alongside your web-form flow. AnyCRM closes the remaining gaps. Each booking-side failure is solved one layer down inside AnyCRM, and the lead event flows through one unified pipe into your CRM AND your ad platforms server-side regardless of which phone surface the call came in on.

Duplicate Customers and orphaned Locations

Affects:My AI Front DeskSmith.ai
Why it happensServiceTitan has no implicit dedup. Send the same caller twice and you get two Customers, two Locations, two Job histories, and a fractured Membership view. My AI Front Desk runs on a Zapier-style "Create Customer" action — a single API call that hands the caller straight to ServiceTitan with no "search first" step, because Zapier surfaces don't compose multi-step API choreography. Same caller, slightly different phone formatting? Duplicate. Email-only inquiry from the chat widget? Duplicate. Smith.ai's native ServiceTitan integration does "match calls to existing customers to keep records up to date" and "create new customer records when a new lead calls" — the right shape — but the create happens after the call ends, not live during the booking flow, so dedup state at the moment the AI Receptionist is deciding what to say is still stale. ServiceTitan's native AI Voice Agent recognises returning Customers and VIP Members natively (its own product page says it "knows if the customer is an existing customer, or a VIP member") — it's the one place that surface has a structural edge — but the rest of this section's failure modes still apply to it.
Why ours can'tAnyCRM does NOT do a one-shot create. AnyCRM first searches ServiceTitan by normalised phone, then by email, then decides whether to update the existing Customer or create a new one. A returning caller lands on the existing Customer with a new note on the Location, never as a duplicate. The Membership tier, Service Agreement, and Job history all stay attached. This costs an extra API call per Customer-create. AnyCRM does it anyway, because the alternative is the duplicate-Customer mess My AI Front Desk users live with, and the after-the-call dedup window that Smith.ai users live with.

Inventing Job Types, Business Units, and Cancel Reasons

Affects:My AI Front DeskSmith.ai
Why it happensEvery meaningful field on a ServiceTitan Job is keyed against a tenant-configured value. Job Type, Business Unit, Campaign, priority, and on cancellation the Cancel Reason. My AI Front Desk's Zapier-style action takes whatever the AI generates and posts it. There is no "read your tenant's real values first" step in a Zapier path. It's a single action. So the AI invents a Job Type like "AC Repair" when your tenant accepts something else, the write 400s (or worse, succeeds against a Job Type from another Business Unit). Smith.ai's native integration schedules through ServiceTitan's Scheduling Pro and creates Customer records, which constrains some of the values — but how it handles unknown Job Types or invalid Business Units isn't exposed in published materials. ServiceTitan's AI Voice Agent ships a "Job-Type Selection" capability that lets you "customise job types and dispatch fees to alert the Voice Agent to what it can, and can't book" — this is the one place that competitor matches AnyCRM's frozen-enum approach.
Why ours can'tAnyCRM reads your tenant's real values at setup, in a separate call to ServiceTitan's settings endpoints, and bakes them into the AI Receptionist's system prompt as a frozen table. So when the AI Receptionist captures a lead, it CAN ONLY pick from values that actually exist in your tenant. This is several extra setup-time API calls that My AI Front Desk doesn't make, and gives AnyCRM the same write-time safety ServiceTitan's Voice Agent has by being native — without the lock-in to a single platform.

Jobs with no source attribution (the Campaign trap)

Affects:My AI Front DeskSmith.ai
Why it happensServiceTitan uses Campaigns as the single source of marketing attribution. A Job written without a Campaign shows up in revenue but not in the lead-source reports your marketing team uses to spend their next dollar. My AI Front Desk's Zapier-style "Create Job" action doesn't set a Campaign because Zapier surfaces don't enforce required-but-optional structural fields. Every booked call lands as "unknown source" in ServiceTitan's reporting. Smith.ai's native integration creates Customer records and books through Scheduling Pro, but how it sets Campaign attribution on the resulting Job isn't exposed in published materials. ServiceTitan's AI Voice Agent books natively through Adaptive Capacity and writes its own attribution to ServiceTitan's reporting, with the trade-off that it only sees calls that arrive through ServiceTitan's phone surface — calls to a number bridged from outside that surface fall outside the Voice Agent's attribution loop.
Why ours can'tAnyCRM always sets the Campaign to the dedicated AI Receptionist Campaign you configured at setup. Source attribution is preserved on every Job, and your marketing reporting stays clean. The Campaign isn't a variable the LLM can forget. It's a constant from setup. AnyCRM does this attribution step where My AI Front Desk skips it, and unlike ServiceTitan's Voice Agent, AnyCRM works against any phone surface.

Booking on a Technician without the right skill or license

Affects:Smith.aiMy AI Front Desk
Why it happensServiceTitan validates that the assigned Technician's skill set covers the Job Type's required skills, but it does so with a generic 400. My AI Front Desk's Zapier action takes whichever Technician name the AI generates and posts it — no "is this person skill-qualified?" check, no license-category check. So a refrigerant-certification Job Type gets assigned to a Tech without the certification (a regulatory liability, not just a dispatch one), or the booking 400s and weaker integrations either retry blindly or fall back to dumping the Job on a dispatch supervisor for manual triage. Smith.ai's human receptionists rely on the receptionist's memory of who carries which certification. Fine on a Tuesday morning, less reliable on a Friday at 8pm with a relief receptionist. ServiceTitan's AI Voice Agent books with Adaptive Capacity (its own page describes booking "according to job type, location, required skill sets, and more") — it has the tenant data to enforce skill-aware assignment, but the published materials don't expose whether it filters by specific license categories like refrigerant cert or master electrician licence before checking availability.
Why ours can'tAnyCRM does the heavy work in multiple steps: matches the trade from the symptom, looks up the right Technician from the AnyCRM roster, filters out Technicians whose license categories don't cover the Job Type's required skills, AND falls back to the next qualified Technician on the board if the first match is unavailable. The 400 path from ServiceTitan is never reached because AnyCRM refuses to assemble a payload it knows will fail. Smith.ai/My AI Front Desk can't do this because their architecture is one-shot.

Appointments that don't reach the right dispatch board

Affects:My AI Front DeskSmith.ai
Why it happensServiceTitan's Appointment is keyed to the Job's Business Unit, and dispatch boards are filtered by Business Unit. My AI Front Desk's Zapier-style "Create Job" action takes whichever Business Unit the AI infers, with no constraint that the Job Type must belong to that Business Unit. So a plumbing call gets routed to the HVAC Business Unit because both share a Technician name, creating an Appointment invisible to the team actually responsible for the work. Smith.ai receptionists working from a generic playbook book on whichever Business Unit name they remember. The Plumbing dispatcher doesn't see it, the HVAC dispatcher doesn't recognise it, and the Job sits while the homeowner doesn't get a truck. ServiceTitan's AI Voice Agent books "straight to the dispatch board with a real-time, unified knowledge of technician availability" (per its own page) — it natively respects the dispatch-board model, but the trade-off is the same lock-in cited above: it only works on calls arriving through ServiceTitan's phone surface.
Why ours can'tAnyCRM resolves the Business Unit from the symptom-to-trade map at setup, then constrains the Job Type lookup to Job Types valid for that Business Unit. Cross-Business-Unit mis-bookings are structurally impossible. AnyCRM refuses to assemble a payload that pairs a Job Type with a Business Unit that doesn't list it. AnyCRM does three checks (trade → Business Unit → valid Job Type intersection) where Smith.ai/My AI Front Desk do one.

Cancellation that strands the Job on the dispatch board

Affects:My AI Front DeskSmith.ai
Why it happensAn Appointment cancellation in ServiceTitan is not the same as a Job cancellation. My AI Front Desk's Zapier-style cancel action (where it exists at all) patches only the Appointment — that's the only operation the Zapier surface exposes. The parent Job stays in Scheduled on the dispatch board, triggering recall workflows, follow-up tasks, and (in some tenants) automatic re-dispatch. The homeowner already cancelled, but dispatch keeps trying to recover the Job. Smith.ai receptionists ask the caller why and log a summary as a Customer note, but how cancellation handling reaches the Appointment Cancel Reason and the parent Job state isn't exposed in published integration materials. ServiceTitan's AI Voice Agent ships a Reschedule Appointments capability natively, and confirms existing appointments — but its product page treats cancel-with-reason as part of the human CSR's job, not the Voice Agent's, so the Job-state transition still lands on a human.
Why ours can'tAnyCRM's cancellation is multi-step. Find the soonest upcoming Appointment, capture the caller's reason, map it to your tenant's configured Cancel Reason, write the reason as a Customer note AND on the Job's history, patch the Appointment with the right Cancel Reason, AND transition the parent Job to the correct cancelled state. The dispatch board reflects reality, recall workflows don't fire, and the audit trail captures why the slot opened. Four operations where Smith.ai/My AI Front Desk do one (and usually the wrong one).

Losing Membership status on returning callers

Affects:My AI Front DeskSmith.ai
Why it happensServiceTitan Memberships are a separate first-class object linked to the Customer, with their own type, status, and pricing rules. My AI Front Desk's Zapier-style "Create Customer" action creates a duplicate Customer (see failure mode #1), which orphans the Membership. The new Customer has no Membership attached, so the Job lands without the member-priority arrival window, without the member-rate pricing, and without the recall workflow that ties Memberships to maintenance Jobs. Smith.ai's native integration matches calls to existing customers, which preserves the link to the Membership — but how member-rate pricing and member-priority arrival windows flow through to the resulting Job isn't exposed in published materials. ServiceTitan's AI Voice Agent ships "Membership Greetings" natively and its own page confirms it "knows if the customer is an existing customer, or a VIP member" — this is another place that competitor has a structural edge over the Zapier-based receptionists.
Why ours can'tAnyCRM queries existing Memberships for any matched Customer and surfaces the active Membership tier to the routing layer. Booking flows respect Membership priority for arrival-window selection and tag the Job for member-rate pricing automatically. Membership status is never lost on a returning caller because AnyCRM never creates a duplicate Customer to orphan it from. AnyCRM does the Membership-lookup-then-route step where My AI Front Desk skips it entirely, and unlike ServiceTitan's Voice Agent, AnyCRM is portable across phone surfaces.

Encoding your dispatch policy in the prompt or in middleware

Affects:My AI Front DeskSmith.aiServiceTitan AI Voice Agent
Why it happensMy AI Front Desk ships a hardcoded "Create Job" action that fires on every inbound call. There is no "only create the Job at this priority if the caller is actually an emergency" logic. The action is single-step, so every after-hours call becomes a standard-priority Job in the default Business Unit, clogging your dispatch board and burning standby Technician capacity. The moment you change your Campaigns, your Membership tiers, or your priority rules, you have to go back into Zapier and rebuild the zap. Smith.ai's AI tier and human receptionists work from playbooks that drift out of date as your real dispatch policy evolves. ServiceTitan's AI Voice Agent is customisable per Job Type and dispatch fee — the firm controls the rules — but the policy lives inside ServiceTitan's configuration surface rather than in the same flow that handles your web form / online-booking conversions, which means you maintain two policy surfaces instead of one.
Why ours can'tAnyCRM does not encode your dispatch policy at all. AnyCRM sends a clean lead event straight to your CRM, into the receiving flow we wire up for you at onboarding. YOUR flow decides what happens: new Campaign? Update the flow. New Membership tier? Update the flow. New priority Job Type? Update the flow. AnyCRM's behaviour stays consistent because AnyCRM's job stops at the conversation. Smith.ai/My AI Front Desk can't separate these concerns because their architecture forces business policy into either Zapier middleware or a hardcoded action. ServiceTitan's Voice Agent lets you own policy but keeps it in a separate surface from your web-form intake flow.

Web leads and AI Receptionist leads run on two separate conversion-tracking stacks

Affects:Smith.aiMy AI Front DeskServiceTitan AI Voice Agent
Why it happensSmith.ai, My AI Front Desk, and ServiceTitan's own AI Voice Agent all treat phone and chat conversions as separate from web form / online-booking conversions. ServiceTitan's native Marketing Pro Ads supports campaign-level attribution inside ServiceTitan's reporting, but the Voice Agent doesn't advertise a server-side conversion event back to Google Ads, Facebook Ads, or LinkedIn Ads when it books a Job — that gap is left to the firm to bridge with Zapier or its own integration work. So your Ad platforms only see the website form-fills and online-booking submissions, the bidding optimises for that (lower-intent) audience, your Cost per Lead looks deceptively low, ROAS reporting becomes a fiction, and the high-intent homeowner who calls at 9pm with a no-heat emergency stays invisible to your Ad stack. Worse, when these competitors DO fire any tracking, it's client-side — blocked by ad-blockers and degraded under iOS / Safari tracking restrictions.
Why ours can'tAnyCRM runs your website conversions AND your AI Receptionist conversions through the same Conversion Lift pipeline. Same event shape, same source taxonomy, same delivery to your CRM, AND the same server-side conversion event into Google Ads, Facebook Ads, and LinkedIn Ads. Using the verified origin of your registered domain. Server-side means it can't be blocked client-side and doesn't degrade on iOS or Safari. The result is what Smith.ai/My AI Front Desk/ServiceTitan's Voice Agent structurally don't deliver: lower Cost per Lead, higher ROAS, smaller CAC, complete analytics funnels, and attribution that doesn't fragment between web and voice.

The AI Receptionist is honest because AnyCRM doesn't let it lie. And AnyCRM is sophisticated because it doesn't pretend to own policy that belongs inside your CRM, while quietly fixing the unified-conversion-tracking gap that even ServiceTitan's native Voice Agent doesn't close.

ServiceTitan logoWorks with ServiceTitan
§ 09 — Side-by-side comparison

AnyCRM vs Smith.ai, My AI Front Desk, ServiceTitan's native AI Voice Agent on ServiceTitan

CapabilityAnyCRMSmith.aiMy AI Front DeskServiceTitan AI Voice Agent
Live ServiceTitan Job + Appointment booked DURING the call Yes. Native ServiceTitan Job + Appointment, Business-Unit-matched, on a qualified Technician's dispatch board.Partial. Schedules through Scheduling Pro per their integration page; depth on Business Unit / Job Type intersection not exposed in published materials.Partial. Zapier-style "Create Job" without Business-Unit/Job-Type intersection guard.Yes. Native to ServiceTitan, books "straight to the dispatch board with real-time, unified knowledge of technician availability" per their product page.
Dedup-before-write on phone and email Yes. Always, live during the call.Yes, but after the call ends. Native integration does "match calls to existing customers" per their integration page — but the dedup state during the live AI Receptionist conversation is still stale.No. Zapier action has no search step.Yes (first-party tenant data access).
Preserves existing Customer + Membership on returning callers Yes. Existing Customer and Membership tier are sacred.Yes for Customer match. Whether member-rate pricing and member-priority arrival window flow through to the resulting Job isn't exposed in published materials.No. Duplicate Customer orphans the Membership.Yes. Ships "Membership Greetings" natively; product page confirms it recognises returning Customers and VIP Members.
Routes by trade and Business Unit (HVAC / Plumbing / Electrical / Drain) Yes. Trade-to-Business-Unit-to-Job-Type chain is part of AnyCRM's roster.Manual, depends on the receptionist.No structural guard.Yes via native dispatch-board access (Adaptive Capacity); specific trade-to-Business-Unit guards not exposed in published materials.
Job Types, Business Units, Campaigns, and Cancel Reasons frozen from your real tenant values Yes. Read at setup, baked into the prompt as a frozen table.Not API-enforced.No. Writes can fail on unknown values.Yes for Job Types and dispatch fees ("Job-Type Selection" + Custom Dispatch Fee Messaging in product); Campaign and Cancel Reason behaviour not exposed in published materials.
Skill-aware Technician assignment (refrigerant cert, gas-line license, master electrician) Yes. License categories filtered before write.Receptionist memory.No.Books with Adaptive Capacity by job type and required skill sets per product page; filtering by specific license categories (refrigerant cert, master electrician) not exposed in published materials.
Campaign attribution set on every Job (no "unknown source" leaks) Yes. AI Receptionist Campaign locked at setup.Native integration creates Customer records; Campaign attribution on the resulting Job not exposed in published materials.No. Campaign field rarely set by Zapier action.Writes its own attribution natively, but only for calls arriving through ServiceTitan's phone surface.
Cancellation preserves the audit trail and transitions the parent Job state Yes. Appointment patched, Job transitioned, reason on Customer + Job history.Logs a call summary as a Customer note; Cancel Reason + parent-Job state transition not exposed in published materials.No. Patches Appointment only, Job stuck on dispatch board.Reschedule yes (natively). Cancel-with-reason and parent-Job state transition treated as the CSR's job in the published product, not the Voice Agent's.
Reschedule in place (no cancel-then-rebook) Yes.Manual.No.Yes (native Reschedule Appointments capability).
Dispatch policy delegated to YOUR CRM's own flow Yes. Lead event delivered straight into your CRM, into the receiving flow we wire up at onboarding.No. Policy lives in the receptionist's training.No. Hardcoded "Create Job" action.Partial. Firm owns the rules and thresholds inside ServiceTitan's Voice Agent configuration, but that surface is separate from the flow handling your web-form / online-booking leads.
Unified conversion pipe: web forms AND AI Receptionist → CRM + ad platforms server-side Yes. Same shape, same source taxonomy, same server-side delivery to your CRM and your ad platforms.No. Web and voice run on separate stacks.No. Web and voice run on separate stacks.No. Voice Agent attribution lives inside ServiceTitan reporting; web-form / online-booking attribution lives elsewhere.
Server-side conversion events sent to Google Ads, Facebook Ads, and analytics (origin = your registered domain) Yes. Every call and chat booking lands server-side.No.No.Not part of the Voice Agent product per published materials. Marketing Pro Ads handles ad-platform attribution separately; server-side conversion events for AI-booked Jobs aren't exposed.
Source attribution stays consistent across web and voice Yes. AI Receptionist Call, AI Receptionist Web, plus your web form identifiers.Manual / inconsistent.No standardised taxonomy.Native ServiceTitan source only for calls arriving through the Voice Agent surface.
Scale ceiling Bounded by ServiceTitan API limits, not by staffing.Bounded by human receptionist staffing for the human tier.Bounded by Zapier rate limits and action contracts.Bounded by ServiceTitan's Voice Agent capability surface and pricing tier.
ServiceTitan logoWorks with ServiceTitan
§ 10 — Your ServiceTitan data passes through. It doesn't stick.

Your ServiceTitan data passes through AnyCRM. It doesn't stick.

AnyCRM processes your ServiceTitan data to answer the call. Then forgets it. The only thing AnyCRM persists is a conversation history ID so the AI Receptionist can recognise a returning caller. Customers, Locations, Jobs, Appointments, Memberships. All of it stays in ServiceTitan, owned by your tenant.

What AnyCRM stores

Conversation history IDs only. So the AI Receptionist can pick up where it left off if a caller hangs up and rings back. No call audio, no transcripts of Customer records, no caller PII.

What AnyCRM doesn't

Caller names, phone numbers, service addresses, ServiceTitan Customer IDs, Job histories, Membership data, your Technician roster, your Business Unit revenue, your dispatch board. None of it. AnyCRM reads what it needs, hands it to the LLM, fires the events, and discards the payload.

Where data lives

In your ServiceTitan tenant and in whatever systems your CRM's flow forwards lead events to. Customers, Locations, Jobs, Appointments, notes, Memberships all live in ServiceTitan. Source-attributed (always AI Receptionist Call or AI Receptionist Web), attributed to AnyCRM in the integration audit log, revocable. AnyCRM does not build a shadow CRM alongside yours.

Revocation

Revoke the AnyCRM integration in your ServiceTitan account → Integrations page (or rotate the App Key on the Developer Portal) and the AI Receptionist loses access immediately. There is no "export your data" step because there is no data to export. It was never AnyCRM's to hold.

For your developer: OAuth scopes & the smallest-surface principle

ServiceTitan uses scoped OAuth plus a per-integration App Key. AnyCRM requests only the smallest set of scopes required for the booking lifecycle. Nothing for accounting, nothing for inventory, nothing for payroll.

  • CRM Customers + Locations (read + write). Read and write Customers and service Locations, dedup against existing records by phone then email.
  • JPM Jobs + Appointments (read + write). Read availability and write Jobs + Appointments on the routed-to Technician's board, plus reschedule and cancel.
  • Dispatch Technicians (read). Read the Technician roster at setup time, including Business Unit assignments, position, home zone, and active flag.
  • Settings (read). Read Business Units, Job Types, Cancel Reasons, Campaigns, and Membership Types at setup, so every value the AI Receptionist uses is frozen against your tenant's configuration.
  • Not requested: accounting, inventory, payroll, pricebook prices, technician earnings, financing, marketing-spend data, your other integrations.

Same OAuth grant any ServiceTitan integration uses. Just a smaller surface. AnyCRM holds the OAuth bearer token and the integration App Key (every write is signed by AnyCRM's integration credentials, so each Job and Appointment change is attributable to AnyCRM in ServiceTitan's audit log). The LLM never sees the token, and every tool call is logged with the operation name, never the raw payload.

ServiceTitan logoWorks with ServiceTitan
§ 11 — Pricing & the Transparency Ladder

$36 to get started. No monthly subscription. No commission on voice minutes. Ever.

The AI Receptionist industry has settled into a quiet little racket: wrap a public voice provider (usually Eleven Labs) and a public chat platform in your own UI, sell it back on a monthly subscription with a metered minute allowance, and pocket a 3–5× markup on every minute your customer's caller spends on the phone. The customer never sees the underlying price. We did not want to build that business.

AnyCRM uses Eleven Labs for voice. We say that out loud because it is true and because pretending otherwise would be the start of a small lie that grows. You pay Eleven Labs directly — at Eleven Labs' published price — and AnyCRM charges 0% commission on top. We make money from the Quickstart, the DIY Upgrades, and the optional Custom Implementation. Not from your call volume. The more customers call your business, the better — for you, not us.

The Transparency Ladder — you choose how far up you climb.

Most AI Receptionist products sell one thing: a monthly plan with a minute cap. AnyCRM sells five things, ordered by how much we do for you. Start at $36 with a prompt-and-pasted DIY agent. Stop there if it's enough. Or keep climbing through the upgrades to a full custom implementation with MCP tools, conversion tracking, and a CRM-side flow we configure for you.

Step 1
The Quickstart
$36 one-time

A prompt pack and a deployment guide. You wire up a basic AI Receptionist on web chat and voice using OUR humanizer prompts and OUR step-by-step videos.

  • Two humanizer prompts (warmth, pacing, filler words)
  • Web chat + voice setup videos
  • Same-afternoon live deployment
  • No MCP tools (no booking writes into your CRM)
  • No conversion tracking
  • No CRM-side lead-event flow
Step 1b · Order bump
30-min 1:1 Setup Call
+$63 one-time

Add this at checkout. We walk through your setup together so the Quickstart lands faster, without you reading the docs alone.

  • Live setup walkthrough
  • Humanizer prompt tuning to your voice
  • Q&A about your industry's quirks
Step 2
Availability & Booking Upgrade
$98–$196 one-time

Adds the first round of MCP tools so the AI Receptionist actually books appointments into your CRM (not just talks about booking them).

  • getAvailability + createContactAppointment MCP tools
  • Live booking into your CRM
  • Dedup-before-write on email and phone
  • Still DIY — you wire the tools yourself with our videos
Step 3
Full Lifecycle Upgrade
$196–$392 one-time

Adds search, reschedule, and cancel MCP tools. Now the AI Receptionist owns the whole appointment lifecycle — the same one we describe in the Availability and Lifecycle sections above.

  • Search + reschedule + cancel MCP tools
  • Audit-preserving cancellation
  • Specialist / team-member routing if your CRM supports it
  • Still DIY — conversion tracking and CRM flow not included

How AnyCRM stacks up against the monthly-subscription crowd.

Here is what you would pay each provider to handle 500 voice minutes a month — a fair mid-volume number for a service business that picks up after hours. Sourced directly from each vendor's published pricing page.

Cost & structure AnyCRM Smith.ai My AI Front Desk Vocaly AI
Pricing model One-time fee ($36 → $850+) + you pay Eleven Labs directly Monthly subscription, billed per call Monthly subscription, billed per minute Monthly subscription, billed per minute
Entry tier $36 one-time $300/mo (30 calls) $99/mo (200 voice min) $399/mo (2,500 min)
Cost for ~500 voice min / month $0 to AnyCRM + ~$25–85 paid directly to Eleven Labs ~$2,100/mo (Pro tier, ~300 calls) $99 + 300 overage min @ $0.25 = $174/mo $399/mo (2,500 min cap)
Commission / markup on voice minutes 0%. You pay Eleven Labs directly. Bundled (per-call pricing hides minute markup) ~3–5× markup on Eleven Labs' published rate Bundled (rate not disclosed)
Hard monthly minute cap No cap. Eleven Labs scales with your traffic. Yes, by call count Yes (200 min on $99 tier) Yes (2,500 min on $399 tier)
Underlying voice provider disclosed Yes — Eleven Labs. We say it openly. N/A (human receptionists) Not disclosed Not disclosed
CRM-side lead-event flow built for you Yes (Custom Implementation, tuned to your industry) No No (Zapier action list only) No (custom tier only, opaque)
Server-side conversion tracking to Google / Facebook / LinkedIn Ads Yes (Custom Implementation) No No No
Cost over 12 months at ~500 min/mo $36–$850 one-time + ~$300–$1,020 paid to Eleven Labs ~$25,200 ~$2,088 ~$4,788

Pricing as listed on each vendor's published pricing page (Smith.ai, My AI Front Desk / Frontdesk, Vocaly AI, Eleven Labs) at time of publication. Eleven Labs Conversational AI is currently $0.05–$0.17/min depending on plan; "$25–85 paid directly" assumes you sit on the Free, Starter, or Creator plan for low-volume usage. Smith.ai is human-staffed; My AI Front Desk & Vocaly AI are AI-only.

The math is uncomfortable for the industry. A service business paying My AI Front Desk $174/mo for 500 voice minutes is paying roughly $0.35/min, when Eleven Labs' own published rate for that traffic is $0.05–$0.17/min. The difference is pure margin sitting between you and the underlying provider. AnyCRM removes that layer. The Quickstart is $36 once. The Custom Implementation is a one-time quote. You pay your voice provider at their price. We never touch your call volume.
ServiceTitan logoWorks with ServiceTitan
§ 12 — The arithmetic

One backend. Six channels. Stacked ROI.

Indicative monthly numbers based on what service businesses already see from a single channel — multiplied by the channels you switch on. Update the agent once; every channel reflects it.

Channel
Customer reach
Leads / mo
Conv. value
Monthly ROI
Website ChatChatKit by OpenAI
100%
45–80
$150 / lead
$6,750 – $12,000
Voice AIEleven Labs
85%
30–50
$200 / lead
$6,000 – $10,000
WhatsAppBird Platform
78%
35–60
$125 / lead
$4,375 – $7,500
Instagram DMsBird Platform
65%
25–45
$100 / lead
$2,500 – $4,500
MessengerBird Platform
55%
20–35
$100 / lead
$2,000 – $3,500
TelegramBotFather direct
35%
15–25
$100 / lead
$1,500 – $2,500
Combined deployment
170–295
$23,125 – $40,000
The single-backend advantage. Six channels, one agent. Update the prompt once and every surface reflects it instantly — no middleware subscriptions, no fragmented flows, no Zapier per-execution billing.
ServiceTitan logoWorks with ServiceTitan
§ 13 — How it works

Four steps. One afternoon.

No Zapier. No n8n. If you can copy and paste, you can do this.

01

Open the Quickstart

You get the prompt pack, the humaniser prompts, and the deployment guide.

02

Connect ServiceTitan

One API key. The agent reads contacts and writes appointments — both ways.

03

Pick your channel

Web chat, voice line, or both. Same backend, same brain.

04

Go live

Test five calls yourself. Send the number to your team. Done.

ServiceTitan logoWorks with ServiceTitan
§ 14 — Get started

Live by tonight. Booking customers by tomorrow.

$36 once. If it doesn't work for your business, you've lost less than dinner.

ServiceTitan logoWorks with ServiceTitan