The repeat caller keeps arriving as a brand-new customer
In short
Intake dedupe fails on the service location, not the person. A household shares one number, a landlord calls about three addresses and a tenant calls about one, so caller ID alone can never resolve who is on the line. Match in order — inbound number, then normalised service address, then equipment at that address — and ask one confirming question before you write anything.
Key takeaways
- The unit being served is an address, not a person. Match the place and the person resolves itself.
- Caller ID is a first filter, never a decision. Households, landlords and mobile numbers all break it.
- Sample 50 near-duplicate pairs and record which field differed. That distribution is the whole diagnosis.
- Run number, then normalised address, then equipment — and stop at the first unambiguous hit.
- Link records mid-call, never merge. Merging is a reviewed operation with an undo, not a phone decision.
- An agent that cannot read history cannot dedupe. Read scope is the cause nobody checks first.
The matcher is looking for the wrong object. A trades business does not serve people, it serves addresses with equipment in them, and the person on the phone is whoever happened to pick it up this time. Match on the caller and you get a new record every time the husband rings instead of the wife, the tenant instead of the landlord, or the site manager instead of head office.
The cost is not the tidy database. It is the membership that does not apply, the two-year-old install nobody sees, the technician arriving without the model number, and the follow-up sequence firing at a customer of six years as though they were new — which is one of the ways review requests fire at the wrong moment.
Confirm it before you change the matcher
Two measurements. The first tells you how big the problem is and where it enters; the second tells you which field is failing. Neither takes longer than an afternoon.
- Compute a duplicate rate by acquisition channel. For every customer record created in the last 90 days, test whether a customer already existed at the same normalised service address. Split the result by channel — phone agent, web form, technician-created, imported — because a blended figure hides which one is bleeding.
- Pull 50 near-duplicate pairs at random from that set. For each pair, record exactly which fields matched and which differed: number, surname, street line, unit designator, postcode, equipment serial.
- Tally the differing field. One field usually accounts for more than half the pairs, and that tally is your ranked cause list rather than the generic one below.
- Check the agent's read scope before anything else. Confirm by reading the credential, not by asking, that the intake agent can query customers and service history at all. An agent with write access and no read access produces a duplicate on every call, and the symptom looks identical to a bad matcher.
Five causes, ranked by how often they turn out to be it
| Cause | Signature in the sample | Cheapest check |
|---|---|---|
| Matching on caller ID only | Numbers match, surnames differ; or numbers differ and everything else matches | Count records sharing one number, and count customers whose calls arrive from more than one number |
| Unnormalised addresses | Street lines differ by abbreviation, unit designator or punctuation only | Group by postcode and eyeball the street lines inside each group |
| One customer, several service locations | Same payer name, different addresses, both created as customers | Look for landlords, letting agents and multi-site commercial names in the duplicate set |
| Tenant versus owner | Same address, different people, both created — often months apart | Check whether any record type distinguishes occupier from bill payer |
| Agent cannot read history | Every agent-created record is new; the rate is near 100 percent for that channel | Read the credential's scopes; a two-minute check that ends the investigation |
The first two dominate almost everywhere. Caller ID fails because a number identifies a handset, not a household: two adults share a landline, a mobile is ported between people, a landlord's number appears on jobs at addresses they will never visit, and withheld or spoofed numbers arrive with nothing at all. Address matching fails because nobody normalises before comparing, so 'Flat 2, 14 Oak St' and 'Apt 2 14 Oak Street' are different strings and therefore different customers.
That second failure has a twin worth knowing about, because it is the same broken address doing two jobs. An address that will not normalise usually will not geocode either, so the same call that creates a duplicate also passes a boundary test it should have failed — the mechanism behind jobs booked ninety minutes outside the service area. Fix normalisation once and both symptoms move.
The match order an agent can actually run mid-call
Three signals, in strength order, each one narrowing the last. The agent stops at the first unambiguous hit and spends no further conversational turns on identity.
- Normalise the inbound number to a single canonical form — E.164 is the usual choice — and look it up, so a national format and an international one collide rather than diverge. One match is a candidate, not a decision. Zero means continue; more than one means continue, and do not guess.
- Ask for the service address, normalise it, and match on the location. This is the real key. Parse to structured components — building, unit, thoroughfare, locality, postcode — expand abbreviations on both sides, and compare the components rather than the string. Then geocode and treat coordinates within a few metres as the same place even when the text disagrees.
- If the address still resolves to two or more records, ask about the equipment. What is on the plate, where the unit sits, roughly when it went in. Equipment is the strongest identifier a homeowner can supply from memory and the one an existing customer usually answers instantly.
- Confirm before writing. One question, phrased against something the caller can verify, and an explicit fallback to a new record when the answer is no.
- Write a link, never a merge. If two records still look like one place, attach the job to the more complete record and flag the pair for review with both identifiers. Merging is a reviewed operation with an undo path, not something decided in the eleventh second of a phone call.
The one question that resolves most calls
The failure here is asking a question that puts the burden of matching on the caller. 'Are you an existing customer?' gets an unreliable yes from people who called a different company two years ago and a no from people whose partner booked the last visit. Ask instead about a fact the record already holds.
- Anchor on the place. 'Is this for the property on Oak Street?' A caller either recognises the address or does not, and there is no judgement involved.
- Anchor on the equipment when the address is ambiguous. 'Is this the unit in the loft, or the one in the garage?' Two units at one address is exactly the case a pure address match cannot split.
- Anchor on the last visit only when it was recent. 'We were with you in March about the boiler pressure — same property?' Beyond a few months this reads as surveillance rather than service.
- Never read back a full address to an unverified caller. Offer the street or the first line and let them complete it. This costs nothing conversationally and is the difference between confirming a record and disclosing one.
One caution on where these questions sit. Identity work belongs after the caller has said what is wrong, not before it. Front-loading verification into the opening turn is one of the reliable ways to lose the call outright, which is the pattern in callers hanging up in the first eight seconds. Take the problem first, match while they talk, confirm once.
A phone number tells you which handset dialled. It does not tell you which house has no hot water, and the house is the thing you are being asked to fix.
The model that stops it recurring
Most platforms already separate these objects and most operators use only the first. If your records collapse them, no matcher will hold, because the matcher is being asked to make one row mean four things.
| Object | The question it answers | The duplicate it prevents |
|---|---|---|
| Customer | Who is billed and holds the agreement | A landlord with nine properties becoming nine customers |
| Service location | Which address is being worked on | One property splitting because the payer changed |
| Contact | Which person may be called, and about what | A household creating a record per adult |
| Equipment | Which asset sits at that location | A second unit at one address booked as a second property |
The tenant-versus-owner case is where this earns its keep. The occupier is the contact who must be called to arrange access; the landlord or agent is the customer who authorises and pays. Modelled as one row, whichever of them rings last overwrites the other. A third-party warranty dispatch has the same two-party shape for a different reason, set out in why a home warranty dispatch books differently.
What to build, and what to leave alone
The deliverable is small and specific: one match service, called by every channel, returning a ranked candidate list with a score and a reason per candidate. Phone, web form and technician app all call the same endpoint, because three matchers guarantee three definitions of duplicate. Behind it sits a review queue with a named owner, a daily clearing time and a merge that can be undone. Against a platform like ServiceTitan, Jobber or Housecall Pro that is a narrowly scoped piece of internal tooling and operations software reading the operator's own API access, not a migration.
Two things to leave alone for now. Do not attempt a retrospective mass merge before the inbound rate is fixed, or you will merge into a system still producing new pairs. And do not confuse this with reconciling records across two systems after a migration, which has different keys and belongs with platform integration and data.
The rest of the intake path — what a booking must capture, how tiers are decided, what an agent may promise — is mapped across intake and call capture, within our field service and trades work.
Frequently asked questions
Short answers to the follow-ups this page tends to raise.
Why does our AI booking agent create a duplicate customer for callers we already know?
Because it is matching a person against a phone number when the thing it needs to identify is a property. Numbers move between people, households share one line, and landlords call about addresses they never visit, so caller ID resolves cleanly only for single-occupant customers who always ring from the same handset. Match the normalised service address instead and the person becomes a contact on the record rather than the record itself.
Should the agent merge records during the call?
No. Link the job to the best candidate and flag the pair for review. A merge collapses history, membership status, equipment and billing under time pressure with no second opinion, and an incorrect merge is far more expensive to reverse than a duplicate is to clean up. Merging belongs in a reviewed queue with an undo path and a named owner.
What address matching is good enough for a service business?
Parse to structured components, expand abbreviations on both sides, compare the components, then geocode and treat near-identical coordinates as the same place. Component comparison catches the abbreviation and punctuation differences that string matching misses; the geocode catches the cases where the text genuinely differs. Flag anything that geocodes to a locality centroid rather than a specific building, because those match everything nearby and nothing precisely.
How do we tell a duplicate from two genuinely separate customers at one address?
Use the equipment and the agreement, not the name. Two flats in one converted house are separate service locations with separate units and separate agreements even though the street line is identical; a husband and wife at one house share both. If your records cannot express that difference, the model is the problem rather than the matcher.
- intake
- customer data
- deduplication
- voice agents
The work behind this page
Builds from our portfolio that this page draws on.
FieldRoute
An AI field-service platform that auto-dispatches the best-matched technician, optimizes routes, and tracks first-time-fix against every SLA.
OperationsPatient Front Desk
AI receptionist for clinics — auto intake, smart scheduling, and insurance verification before the patient walks in.
Healthcare AIRead next
- The agent keeps booking jobs an hour past the edge of the mapThe out-of-area jobs cluster at the perimeter and swallow the slot they were booked into. A postcode allow-list cannot see that, because the boundary is a property of the day, not of the map.diagnostic
- Callers are hanging up in the first eight secondsAnswer rate looks healthy, booking rate does not, and the recordings are 9 seconds long. The agent is being judged before it has had a chance to do anything.diagnostic
- A home warranty dispatch is not a customer callA warranty dispatch arrives with an authorisation number, a covered scope someone else defined, and a payer who is not in the house. Booking it like a retail call produces uncloseable jobs.definition
- A no-heat call got booked as a routine tune-upA job sits on the board at routine priority and the recording describes an emergency. Before retuning anything, join booked jobs to their transcripts and score them against your own tier table.diagnostic
- Emergency, urgent, same-day, routine: four tiers and who defines themThere is no industry-wide definition of an emergency call. The operator writes one, and until those conditions exist as data no intake agent applies them consistently.definition
- The calls were answered overnight and the board is empty at 7amThe overnight calls were answered and the intent captured, and the jobs still vanished in the handoff. Four counts, five ranked causes, and the report that lands before the board opens.diagnostic
Working on something in this space?
Tell us where you are in a sentence or two. We'll tell you honestly whether we're the right team, and what a sensible first slice of the work looks like.
Start the conversation