Resolving customer identity across channels
This links people, not tickets. Deduplicating conversations that are the same
request is a different job; this one asks whether the person who called on Tuesday is
the person who emailed on Thursday, so that per-customer measures mean anything.
It matters because most per-customer CX metrics are silently wrong without it. Repeat
contact rate, first-contact resolution, cost to serve per customer, and "customers who
contacted us more than three times this month" all divide by a customer count that,
uncorrected, counts one person as three.
The asymmetry that sets every threshold
Merging two different customers is far worse than failing to merge one.
A false merge puts one person's data in another person's record. Depending on what is
then done with it — a support view, an export, an at-risk list, a reply that
references the wrong history — it ranges from a bad metric to a data-protection
incident. A missed merge just leaves a metric slightly conservative.
So: precision over recall, deliberately and explicitly. Set thresholds so the
system under-merges, route the ambiguous middle to human review rather than resolving
it automatically, and state the direction of your remaining error when you report.
Signals, ranked by reliability
Use them in this order, and stop as soon as a deterministic signal settles it.
| Signal |
Reliability |
Notes |
| Authenticated account id |
Highest |
If the channel captures it, nothing else is needed. |
| Verified email on the account |
High |
Verified, not merely present in a header. |
| Phone number, normalised |
Medium-high |
Normalise to a canonical international format first. |
| Unverified email |
Medium |
Free-mail addresses are frequently shared or mistyped. |
| Name + company |
Low |
Never sufficient alone. |
| Device, session or cookie |
Low |
Shared machines and household devices. |
| Name alone |
Never |
Not a signal. Do not use it, at any confidence. |
Deterministic first, probabilistic second. Resolve everything you can on exact
matches of high-reliability identifiers, then apply fuzzy matching only to what remains
— and only to raise candidates for review, not to merge.
The traps
Each of these produces confident false merges, and every one of them is common.
- Shared and role addresses.
support@, accounts@, info@, billing@ reach one
address for many people. These are the single biggest source of catastrophic merges,
because they are high-volume and look like a strong signal. Detect them by volume and
by distinct-name count against the same address, and exclude them from automatic
matching.
- Your own staff's addresses and numbers. Internal test accounts, agents' own
emails, forwarded threads, and no-reply senders all accumulate into one enormous
fake customer. Build the exclusion list before, not after.
- Shared phone numbers. Households, small businesses, and switchboard main lines.
A single main number for a company is a company identifier, not a person identifier.
- Phone normalisation. The same number appears with and without country code, with
spaces, dashes, parentheses, leading zeros and local trunk prefixes. Normalise to
E.164 with a known default region before comparing, and record when you had to guess
the region — a guessed region is a wrong number.
- Extensions and short codes attached to a main number.
- Name transliteration and script. The same person's name may appear in different
scripts or transliterations across channels, and the same transliteration serves many
distinct names. This makes name matching both a false-negative and a false-positive
source, which is why it stays out of the matching logic.
- Email plus-addressing and dots. Provider-specific normalisation rules differ; be
conservative, and do not apply one provider's rules to another's domain.
- Legitimate identifier changes. People change email addresses and phone numbers.
A customer whose identifiers changed looks like two customers, and this is a
correct conservative outcome rather than a bug — say so instead of loosening the
rules to catch it.
- Company versus person. For B2B support, decide up front which grain you are
resolving to. Many questions ("how much effort does this account cost us") want the
company; others ("is this person contacting us repeatedly") want the person.
Resolving to the wrong one silently answers a different question.
Method
- Define the grain — person or account — and say which.
- Build the exclusion list: role addresses, internal addresses, no-reply senders,
switchboard numbers, known test accounts.
- Normalise identifiers: emails lowercased and trimmed, phones to E.164, account
ids to a canonical form.
- Deterministic pass: group on exact matches of high-reliability identifiers.
Use transitive closure carefully — A matches B on email, B matches C on phone, so
A, C are one person. One bad edge merges a whole cluster, which is why the
exclusion list comes first. Cap cluster size and review anything unusually large;
an oversized cluster is nearly always a shared identifier you missed.
- Candidate pass: for what remains, generate candidate pairs on weaker signals and
score them. Do not auto-merge.
- Three bands: auto-merge (high confidence, deterministic), review queue
(ambiguous), leave separate (default). Report the size of each band — the review
queue's size determines whether this is operationally viable at all.
- Validate on a hand-labelled sample. Take a sample of merges and a sample of
near-misses, label them, and report precision and recall. Precision is the number
that matters; quote it with an interval.
Reporting metrics on resolved identities
- State the resolution rate: what share of conversations carry a usable identifier
at all. Voice records in particular often lack one, and unresolvable conversations
must be reported as a separate bucket rather than counted as unique customers, which
inflates the denominator exactly where the data is weakest.
- Give per-customer distributions, not means. Support contact per customer is
heavily right-skewed; the mean describes nobody. Report the distribution and the
tail.
- Say which direction the error runs. With precision-first thresholds, unique
customer counts are biased high and per-customer contact counts biased low. Anyone
using the numbers needs to know that.
Guardrails
- Linking identities creates a richer personal-data record than either source held.
That has data-protection implications for purpose, retention and access. Flag it;
do not decide it.
- Never write merges back into a production system from an analysis. Identity
merges in a helpdesk are typically irreversible. If the output is intended to be
applied, it becomes a reviewed mutation with a plan, a bound and an audit log — not
a side effect of a report.
- Do not build a cross-customer profile beyond the question asked.
- Report ids and aggregates, never transcripts.
- Do not use identity resolution to link a customer to an individual's personal
identity outside the support relationship.
Present results to the user
- Grain and method — person or account, which signals, which thresholds, and the
precision-first stance.
- Coverage — resolution rate, and the unresolvable bucket by channel.
- Band sizes — auto-merged, queued for review, left separate.
- Validation — precision and recall on the labelled sample, with sizes.
- Excluded identifiers, and what they were.
- The metrics asked for, as distributions, with the direction of the residual
error stated.
- What is not resolvable with the data available, and what identifier would fix
it.
1---2name: cx-customer-identity-resolution3description: Use to link one customer's conversations across channels and identifiers so per-customer support effort, repeat contact and multi-channel journeys can be measured. Trigger for "which customers contacted us on multiple channels", "how many separate tickets are actually the same person", "true contact rate per customer", stitching voice calls to email threads, or any per-customer metric where the helpdesk has no shared customer key.4---56# Resolving customer identity across channels78This links **people**, not tickets. Deduplicating conversations that are the same9request is a different job; this one asks whether the person who called on Tuesday is10the person who emailed on Thursday, so that per-customer measures mean anything.1112It matters because most per-customer CX metrics are silently wrong without it. Repeat13contact rate, first-contact resolution, cost to serve per customer, and "customers who14contacted us more than three times this month" all divide by a customer count that,15uncorrected, counts one person as three.1617## The asymmetry that sets every threshold1819**Merging two different customers is far worse than failing to merge one.**2021A false merge puts one person's data in another person's record. Depending on what is22then done with it — a support view, an export, an at-risk list, a reply that23references the wrong history — it ranges from a bad metric to a data-protection24incident. A missed merge just leaves a metric slightly conservative.2526So: **precision over recall, deliberately and explicitly.** Set thresholds so the27system under-merges, route the ambiguous middle to human review rather than resolving28it automatically, and state the direction of your remaining error when you report.2930## Signals, ranked by reliability3132Use them in this order, and stop as soon as a deterministic signal settles it.3334| Signal | Reliability | Notes |35| --- | --- | --- |36| Authenticated account id | Highest | If the channel captures it, nothing else is needed. |37| Verified email on the account | High | Verified, not merely present in a header. |38| Phone number, normalised | Medium-high | Normalise to a canonical international format first. |39| Unverified email | Medium | Free-mail addresses are frequently shared or mistyped. |40| Name + company | Low | Never sufficient alone. |41| Device, session or cookie | Low | Shared machines and household devices. |42| Name alone | **Never** | Not a signal. Do not use it, at any confidence. |4344**Deterministic first, probabilistic second.** Resolve everything you can on exact45matches of high-reliability identifiers, then apply fuzzy matching only to what remains46— and only to raise candidates for review, not to merge.4748## The traps4950Each of these produces confident false merges, and every one of them is common.5152- **Shared and role addresses.** `support@`, `accounts@`, `info@`, `billing@` reach one53 address for many people. These are the single biggest source of catastrophic merges,54 because they are high-volume and look like a strong signal. Detect them by volume and55 by distinct-name count against the same address, and exclude them from automatic56 matching.57- **Your own staff's addresses and numbers.** Internal test accounts, agents' own58 emails, forwarded threads, and no-reply senders all accumulate into one enormous59 fake customer. Build the exclusion list before, not after.60- **Shared phone numbers.** Households, small businesses, and switchboard main lines.61 A single main number for a company is a company identifier, not a person identifier.62- **Phone normalisation.** The same number appears with and without country code, with63 spaces, dashes, parentheses, leading zeros and local trunk prefixes. Normalise to64 E.164 with a known default region before comparing, and record when you had to guess65 the region — a guessed region is a wrong number.66- **Extensions and short codes** attached to a main number.67- **Name transliteration and script.** The same person's name may appear in different68 scripts or transliterations across channels, and the same transliteration serves many69 distinct names. This makes name matching both a false-negative and a false-positive70 source, which is why it stays out of the matching logic.71- **Email plus-addressing and dots.** Provider-specific normalisation rules differ; be72 conservative, and do not apply one provider's rules to another's domain.73- **Legitimate identifier changes.** People change email addresses and phone numbers.74 A customer whose identifiers changed looks like two customers, and this is a75 *correct* conservative outcome rather than a bug — say so instead of loosening the76 rules to catch it.77- **Company versus person.** For B2B support, decide up front which grain you are78 resolving to. Many questions ("how much effort does this account cost us") want the79 company; others ("is this person contacting us repeatedly") want the person.80 Resolving to the wrong one silently answers a different question.8182## Method83841. **Define the grain** — person or account — and say which.852. **Build the exclusion list**: role addresses, internal addresses, no-reply senders,86 switchboard numbers, known test accounts.873. **Normalise** identifiers: emails lowercased and trimmed, phones to E.164, account88 ids to a canonical form.894. **Deterministic pass**: group on exact matches of high-reliability identifiers.90 Use transitive closure carefully — A matches B on email, B matches C on phone, so91 A, C are one person. **One bad edge merges a whole cluster**, which is why the92 exclusion list comes first. Cap cluster size and review anything unusually large;93 an oversized cluster is nearly always a shared identifier you missed.945. **Candidate pass**: for what remains, generate candidate pairs on weaker signals and95 score them. Do not auto-merge.966. **Three bands**: auto-merge (high confidence, deterministic), review queue97 (ambiguous), leave separate (default). Report the size of each band — the review98 queue's size determines whether this is operationally viable at all.997. **Validate on a hand-labelled sample.** Take a sample of merges and a sample of100 near-misses, label them, and report precision and recall. Precision is the number101 that matters; quote it with an interval.102103## Reporting metrics on resolved identities104105- **State the resolution rate**: what share of conversations carry a usable identifier106 at all. Voice records in particular often lack one, and unresolvable conversations107 must be reported as a separate bucket rather than counted as unique customers, which108 inflates the denominator exactly where the data is weakest.109- **Give per-customer distributions, not means.** Support contact per customer is110 heavily right-skewed; the mean describes nobody. Report the distribution and the111 tail.112- **Say which direction the error runs.** With precision-first thresholds, unique113 customer counts are biased high and per-customer contact counts biased low. Anyone114 using the numbers needs to know that.115116## Guardrails117118- **Linking identities creates a richer personal-data record than either source held.**119 That has data-protection implications for purpose, retention and access. Flag it;120 do not decide it.121- **Never write merges back into a production system from an analysis.** Identity122 merges in a helpdesk are typically irreversible. If the output is intended to be123 applied, it becomes a reviewed mutation with a plan, a bound and an audit log — not124 a side effect of a report.125- **Do not build a cross-customer profile beyond the question asked.**126- **Report ids and aggregates, never transcripts.**127- **Do not use identity resolution to link a customer to an individual's personal128 identity outside the support relationship.**129130## Present results to the user1311321. **Grain and method** — person or account, which signals, which thresholds, and the133 precision-first stance.1342. **Coverage** — resolution rate, and the unresolvable bucket by channel.1353. **Band sizes** — auto-merged, queued for review, left separate.1364. **Validation** — precision and recall on the labelled sample, with sizes.1375. **Excluded identifiers**, and what they were.1386. **The metrics asked for**, as distributions, with the direction of the residual139 error stated.1407. **What is not resolvable with the data available**, and what identifier would fix141 it.