Evalgent
Back to Blog
Voice AI Testing

AI Receptionist for Home Services: Is It Booking Right?

Deepesh Jayal
16 min read
AI Receptionist for Home Services: Is It Booking Right?
On this page

Your AI receptionist books thousands of jobs a week across hundreds of contractor accounts. Your dashboard says "booked." It does not say "booked right." A job can land with the wrong unit, a drain code for a water heater, or an unagreed slot. Nobody notices until a tech stands in the wrong driveway.

This post is for product teams at field service management (FSM) software that ship an AI phone agent to contractors. It gives one scorecard for AI receptionist booking accuracy across HVAC, plumbing, roofing, pool, lawn and rental. Each field gets a definition, a source of truth, a pass rule and a threshold. Our home services QA pillar covers how to test the agent before release. This post covers how to measure it after.

44%
Average street-name transcription error rate across 15 speech models (Zhou et al., arXiv 2026)
77.8%
Street address accuracy for an ASR-then-extract cascade (Singla et al., arXiv 2023)
65.6%
Full-name accuracy for the same cascade (Singla et al., arXiv 2023)

Why "booked" is not the same as "booked right"

A booking call is the front door to a workflow. The agent hears the caller, writes a job to the FSM, picks a slot, assigns a tech and sends a confirmation. Each hop can corrupt the record without raising an error.

The speech layer is the first weak point. A February 2026 study tested 15 speech models from OpenAI, Deepgram, Google and Microsoft on U.S. street names. It found an average transcription error rate of 44%. Routing distance errors were twice as large for speakers whose first language was not English.

Entity extraction is the second weak point. An Interactions AI paper compared extraction straight from speech against a transcribe-then-extract cascade. The cascade reached 77.8% street address accuracy and 65.6% full-name accuracy. Human annotators scored 73.2% on addresses in the same test. Addresses are hard even for people.

The third weak point is state tracking. Amazon researchers ran a tracker trained on written dialogues against recorded spoken ones. Joint goal accuracy fell from 0.5427 to 0.0043. The test sets differed, so read that as direction, not size. Spoken calls break assumptions that typed chat does not.

None of these failures throws an exception. The FSM accepts a wrong address as happily as a right one. So AI receptionist booking accuracy has to be measured field by field, against evidence.

Booking accuracy: the share of AI-created bookings in which a given field matches the truth established from call audio, the FSM record and the technician's closeout.

The booking accuracy scorecard: eight fields

Most AI receptionist KPIs measure the call: answer rate, handle time, containment. They can look healthy while job records rot. The booking accuracy scorecard measures the record. It has eight fields. Five are critical, meaning one miss makes the booking wrong.

FieldPass ruleTruth sourceStarting thresholdCritical?
Customer matchLinked to the right existing customer, or a new one only when none existsFSM customer table + caller ID + audio97%Yes
AddressStreet, number, unit and ZIP match what the caller confirmedAudio + geocoder + tech arrival96%Yes
Job typeBooked code maps to the closeout code familyFSM job + tech closeout92%Yes
UrgencyPriority matches the trade's triage rules for the stated symptomsAudio + triage rules95%Yes
SlotDate and window equal what the caller acceptedAudio + FSM schedule95%Yes
Tech or territoryAssigned tech covers that zone and skillFSM dispatch + territory map93%No
Fees disclosedRequired fees stated before booking, amounts correctAudio + account fee config95%No
Confirmation sentSMS or email sent, delivered, details match the jobMessaging log + FSM job98%No

The thresholds are illustrative starting points, not industry benchmarks. No public benchmark for home services booking accuracy exists that we could find. Set yours from a two-week baseline, then tighten.

Customer match

Customer match asks one question: did the agent attach this job to the right person? Two errors count. A false merge books the job on a different customer with a similar name or shared phone. A false new creates a duplicate record for someone already on file.

A duplicate customer loses service history, equipment records and membership status. For HVAC, that means a plan member gets booked at full price. Our service agreement post traces that failure in detail.

Compute it nightly. For each AI-created customer, run a fuzzy match on phone, normalized address and last name against existing records. Any hit above your merge threshold goes to review. FieldPulse, for example, tags AI-created customers "Operator AI Generated", which makes this query easy to scope.

Address

Address accuracy needs the full service address to match: house number, street, unit and ZIP. Grade the stored address against what the caller said and confirmed on the audio. Then check the geocoder returned a rooftop result, not a street centroid. Finally, compare against the tech's GPS arrival or "address corrected" edits.

Units fail most often. "Apartment 4B" becomes "4" or vanishes. New subdivisions fail the geocoder. Score the field as failed if any part is wrong. Partial credit hides the truck that went to the wrong building.

Job type

Job type is where most home services booking errors start. It drives duration, skill, parts and price, so job type accuracy gets the lowest starting threshold and the closest watch. Pass when the booked job code maps to the same family as the tech's closeout code. A "no cool" booking closed as "capacitor replacement" passes. A "drain clog" booking closed as "water heater replacement" fails.

You need a mapping table from booking codes to closeout families. Build it per account, because contractors name codes differently. The HVAC wrong-tech post shows how one wrong word routes the wrong technician. The plumbing booking errors post shows how a wrong duration ruins a day.

Urgency

Urgency asks whether the priority matches the symptoms the caller described. Grade it against the account's triage rules, not against hindsight. A "no heat, 40 degrees inside" call booked for next Thursday fails. So does a "slow drip under the sink" booked as an emergency dispatch at night rates.

Urgency errors run both ways. Under-triage risks safety; over-triage burns on-call techs. See HVAC after-hours answering and emergency plumbing answering for trade rules.

Slot

Slot accuracy compares the stored date and arrival window with what the caller accepted on the audio. "Tuesday morning" stored as Tuesday 1–5 p.m. fails. So does "the 14th" stored as the 4th. Also fail any slot that collided with an existing job for the same tech.

Read the audio, not the summary. A summary can say "booked Tuesday" when the caller said "not Tuesday." Lawn and cleaning routes reshuffle on weather, so see rain-day rescheduling for that variant.

Tech or territory

This field checks the assigned tech covers the address zone and holds the skill for the job type. Some FSM agents assign techs directly. Workiz documents that Genius Answering can auto-assign by "service areas," "skills (job types)" and availability. When the agent assigns, a wrong job type cascades into a wrong tech. Score both, so you can see which one caused the miss.

Fees disclosed

Fees disclosed checks two things. Did the agent state every fee the account requires, such as a trip fee or diagnostic fee? Was the amount right? Fee configs vary per contractor. That makes this field a pure config-to-speech test.

Vendors say this out loud. Workiz's help center notes that with a fixed service price, the AI "will stick to that price — though it may occasionally forget to mention it" (Workiz). That candor is exactly why disclosure needs its own field.

There is a legal angle too. California's honest pricing law, Civil Code 1770(a)(29), took effect July 1, 2024. It covers most consumer goods and services and targets mandatory fees left out of an advertised price. The FTC's fee rule, 16 CFR part 464, is narrower. It covers only live-event tickets and short-term lodging. Ask counsel how either applies to a spoken quote. This is not legal advice. Quote-heavy trades should also read quote accuracy for lawn and cleaning.

Confirmation sent

Confirmation checks the message log, not the agent's promise. Pass when a text or email was sent, delivered, and its date, window and address match the FSM job. A confirmation with the old slot after a reschedule fails. Consent rules for these texts are covered in the pillar.

Three sources of truth: what was said, stored and found

Every field needs evidence. Three sources supply it. The call audio says what the caller asked for. The FSM record says what the agent wrote. The tech closeout says what was really there.

Matrix of eight booking accuracy fields against four evidence sources, call audio, FSM record, tech closeout and message log, marking which source is the primary truth for each field.

No single source is enough. The closeout cannot show a misheard slot. The audio cannot show a misdescribed job. Join all three on the job ID.

Use the audio, not only the transcript. A transcript is one model's guess at the audio. If the speech model misheard "4B" as "4," the transcript agrees with the wrong record. Grading the transcript against the record then scores a pass. A grader that reads only transcripts is a deaf referee. This is why Evalgent judges calls from the audio itself, with evidence for each verdict.

Separate agent errors from caller errors

A mismatch between booking and closeout is not always the agent's fault. Callers misname equipment. They say "furnace" for a heat pump. Grading every mismatch as an agent error punishes the agent for things it could not know.

So classify each miss with a short decision tree.

Decision tree that compares said versus stored, then stored versus found, and sorts each booking into correct, capture error, triage error or caller-limited.

1. Said vs stored. If the stored field differs from what the caller confirmed, it is a capture error. The agent misheard or miswrote.

2. Stored vs found. If they match, the booking is correct.

3. Required question asked? If stored and found differ, check the audio. If the agent skipped a required triage question, it is a triage error.

4. Caller-limited. If the agent asked the right questions and the caller still described it wrong, log it as caller-limited.

Capture and triage errors count against the agent. Caller-limited misses do not, but a rising rate means your triage questions need work.

Worked math: why 95% per field is not 95% per booking

Field scores compound. Suppose one week looks like the image at the top of this post: customer match 97%, address 96%, job type 88%, slot 94%. If errors were independent, the clean rate across those four would be:

0.97 × 0.96 × 0.88 × 0.94 = 0.770

Only 77% of bookings would be right on all four fields. Add urgency at 95%, territory at 93%, fees at 97% and confirmation at 98%. The all-field clean rate drops to about 65%. These are illustrative numbers, and real errors correlate. A wrong job type often drags tech and urgency with it. Still, the lesson holds. Report both per-field accuracy and a clean-booking rate across the five critical fields.

How many bookings to sample each week

You cannot hand-grade 2,400 bookings a week. A sample with a confidence interval tells you whether a drop is real.

Use the Wilson score interval for proportions. The NIST Engineering Statistics Handbook recommends it over the usual normal approximation, whose lower limit can go negative. At a true accuracy of 92%, here is the 95% interval by sample size:

Bookings graded95% interval at 92%Half-width
5081.2–96.8%±7.8 pts
10085.0–95.9%±5.4 pts
20087.4–95.0%±3.8 pts
40088.9–94.3%±2.7 pts
80089.9–93.7%±1.9 pts
Bar chart of Wilson 95 percent confidence interval half-width for a 92 percent booking accuracy at sample sizes from 50 to 800 bookings per week.

Four hundred graded bookings a week gives about ±2.7 points. That is enough to act on. In the example week, job type scored 88% on 400 bookings. Its interval is 84.4–90.8%. The upper bound sits below the 92% threshold, so the alert is real, not noise.

Per-account accuracy is different. One contractor may book 30 jobs a week. At n=30 the interval spans more than 20 points. Roll per-account scores up over four to eight weeks before you call any one account a problem.

Stratify the sample

A random sample under-represents the calls that break. Stratify across five dimensions:

  • Trade. HVAC, plumbing, roofing, pool, lawn and cleaning, rental.
  • Time. Business hours vs after-hours, which carry the urgency risk.
  • Customer status. New vs existing, which drives customer-match risk.
  • Language and audio. Spanish calls, speakerphone, job-site noise.
  • Account config age. Accounts changed in the last 14 days.

Over-sample the risky strata, then weight results back to true volume. Our multi-tenant testing guide covers config clustering for the last stratum.

Code: computing the scorecard

Below is a simplified Python sketch. It assumes you have already joined graded bookings into one table. Each row holds the job ID, trade and a pass flag per field.

# Simplified: field-level booking accuracy with Wilson intervals.
import math
import pandas as pd

FIELDS = ["customer", "address", "job_type", "urgency", "slot",
          "tech_territory", "fees", "confirmation"]
CRITICAL = ["customer", "address", "job_type", "urgency", "slot"]
THRESHOLDS = {"customer": .97, "address": .96, "job_type": .92,
              "urgency": .95, "slot": .95, "tech_territory": .93,
              "fees": .95, "confirmation": .98}

def wilson(passes: int, n: int, z: float = 1.96):
    if n == 0:
        return (0.0, 0.0)
    p = passes / n
    d = 1 + z * z / n
    c = (p + z * z / (2 * n)) / d
    h = z * math.sqrt(p * (1 - p) / n + z * z / (4 * n * n)) / d
    return (c - h, c + h)

def scorecard(df: pd.DataFrame, weights: pd.Series) -> pd.DataFrame:
    """df: one row per graded booking, bool column per field.
    weights: stratum weight per row (true volume / sampled volume)."""
    rows = []
    for f in FIELDS:
        graded = df[df[f].notna()]
        n = len(graded)
        passes = int(graded[f].sum())
        acc = (graded[f] * weights[graded.index]).sum() / weights[graded.index].sum()
        lo, hi = wilson(passes, n)
        rows.append({"field": f, "n": n, "accuracy": round(acc, 3),
                     "ci_low": round(lo, 3), "ci_high": round(hi, 3),
                     "alert": hi < THRESHOLDS[f]})
    clean = df[CRITICAL].all(axis=1).mean()
    rows.append({"field": "clean_booking", "n": len(df),
                 "accuracy": round(clean, 3)})
    return pd.DataFrame(rows)

The alert fires only when the upper bound sits below threshold, so a noisy week pages no one. Fields that do not apply stay null and leave the denominator. The Wilson bounds use the unweighted sample, a simplification; correct for design effect if weights vary widely.

Trade-specific notes

The scorecard is the same for every trade. The weak field is not.

TradeField most at riskWhyRead next
HVACJob type, urgencyHeat pump vs furnace; no-heat and no-cool triageWrong tech, 7 mistakes
PlumbingUrgency, job typeActive leaks, gas smell, water heater vs drainMissed emergencies
RoofingAddress, slotNew storm addresses; surge-day double bookingInspection booking, storm leads
PoolJob type, customer matchEquipment names; route customers on fileEquipment names, ticket errors
Lawn and cleaningFees, slotQuoted price; weather reschedulesQuotes, rain days
Equipment rentalJob type, slotModel names; pickup and return datesRental orders

Vendor notes by trade

HVAC and plumbing weight job type and urgency highest. Grade gas and active-leak calls as their own stratum and expect near-zero misses. Score booked duration against closeout labor time too.

Roofing breaks on address and slot under storm surge. JobNimbus describes its AssistAI as answering "every call when your team can't", so roofing CRMs see the same overflow.

Pool calls are mostly existing route customers. Skimmer's AI Phone "creates a lead in Skimmer" with name, contact, pool type and reason for calling. Grade pool type and reason as job-type subfields.

Lawn, cleaning and rental lean on quotes and dates. QuoteIQ describes a "Virtual Call Team" that answers calls and qualifies leads. Zuper's CSR Agent, per a September 2026 report, "books the inspection and creates the job record before the call ends." Booking agents now live inside the FSM across trades. One shared scorecard pays off.

How to run a weekly booking accuracy audit

1. Pull the week's AI bookings. Export every job the agent created, with job ID, account, trade, timestamps and call recording ID.

2. Draw a stratified sample. Pick about 400 bookings across the five strata above. Over-sample after-hours, new customers and recently changed accounts.

3. Join the three sources. Attach call audio, the FSM job as first written, later edits, the tech closeout and the message log.

4. Grade each field. Grade said vs stored from the audio. Grade stored vs found from the closeout. Mark fields that do not apply as null.

5. Classify each miss. Tag it capture, triage or caller-limited using the decision tree.

6. Compute the scorecard. Calculate weighted accuracy, Wilson intervals and the clean-booking rate. Alert when an upper bound falls below threshold.

7. Trace each alert to a cause. Group misses by account, prompt version, trade and audio condition. A job-type drop on one prompt release is a regression, not noise.

8. Turn misses into tests. Add each confirmed capture or triage error to your pre-release suite. Re-run it on the next prompt change.

Steps 4 and 8 are where tooling helps most. Evalgent's production monitoring takes pushed call recordings, transcribes them, maps them to scenarios and runs custom metrics on every call. Field checks like these can run as custom metrics. Before a release, it generates test scenarios from the agent's prompt and flows. It can replay misses with caller profiles that vary accent, pace and background noise. Human review stays in the loop for verdicts. Our production monitoring guide covers alert routing.

Reporting accuracy to contractors

Contractors will ask how the agent performs. Give each one its own AI receptionist booking accuracy scorecard, not the platform average. Show per-field accuracy over a rolling eight weeks, with interval bounds, plus capture errors fixed.

Avoid one headline number. A 95% blended score can hide an 88% job-type rate, and contractors feel job type in wasted truck rolls. The general scheduling metrics in our appointment scheduling metrics post work well alongside this field view.

Frequently asked questions

What is a good booking accuracy rate for an AI receptionist?

A good booking accuracy rate depends on the field. Reasonable starting thresholds are 97% for customer match, 96% for address, 95% for slot and urgency, and 92% for job type. These are illustrative, not industry benchmarks. Set your own from a two-week baseline, then tighten. Also track the clean-booking rate across critical fields, which runs lower.

How do you measure AI receptionist booking accuracy?

Measure AI receptionist booking accuracy field by field. Sample AI-created jobs each week. For each, compare what the caller said on the audio, what the agent stored in the FSM, and what the technician found at closeout. Score eight fields as pass or fail, compute weighted accuracy with Wilson intervals, and alert when an interval falls below threshold.

How many calls should you sample to audit an AI receptionist?

About 400 graded bookings a week gives roughly ±2.7 points of precision at 92% accuracy. That is enough to act on a platform-wide drop. One hundred bookings gives about ±5.4 points, which is too wide for fine thresholds. Per-contractor scores need four to eight weeks of pooled data before you draw conclusions.

What KPIs should an AI receptionist track for home services?

Home services AI receptionist KPIs should include record accuracy, not just call metrics. Track per-field accuracy for customer match, address, job type, urgency, slot, tech or territory, fees disclosed and confirmation sent. Add a clean-booking rate across critical fields. Keep answer rate and handle time, but never treat "booked" as "booked right."

How do you check if an AI booked the right job type?

Check job type by mapping the booked job code to the technician's closeout code family. A "no cool" booking closed as a capacitor replacement passes. A drain booking closed as a water heater replacement fails. Then review the audio to separate agent misses from callers who described the problem wrong despite the right questions.

What counts as a booking error for a field service AI?

A booking error for a field service AI is any critical field that does not match the truth. That covers wrong customer, wrong address or unit, wrong job type, wrong urgency or wrong slot. Classify each error as capture, triage or caller-limited. Only capture and triage errors count against the agent.

Can the tech closeout be used as ground truth?

The tech closeout is good ground truth for job type, address and territory, because the technician saw the site. It is weak for slot and fees, which only the audio shows. Closeout codes also vary by contractor, so build a mapping table per account. Combine closeout, audio and the FSM record rather than trusting any one.

How do FSM software teams report booking accuracy to customers?

FSM software teams should report booking accuracy per contractor, not as a platform average. Show per-field accuracy over a rolling eight weeks with confidence bounds. List fixed capture errors and their dates. Avoid one blended number, because a high average can hide a weak job-type score that contractors feel in wasted truck rolls.

The bottom line

AI receptionist booking accuracy is a per-field number, measured against what the caller said, what the system stored and what the tech found. Score eight fields weekly on a stratified sample of about 400 bookings, and act only when the interval clears your threshold.

Related Articles