An entity resolution pipeline turns inconsistent names, addresses, and customer records into reliable links between records that refer to the same real-world entity. This guide presents a reusable workflow for normalization, candidate generation, similarity scoring, confidence thresholds, manual review, and ongoing quality measurement.
Overview
Entity resolution, also called record linkage or entity matching, is the process of deciding whether two records describe the same person, organization, household, product, or account. It is broader than simple duplicate detection: the records may not be identical, and they may come from systems with different formats, missing fields, spelling conventions, or data quality problems.
A practical pipeline should not rely on one fuzzy matching score. Instead, it should narrow the comparison set, compare fields using methods appropriate to each field, combine the evidence, and route uncertain cases to a controlled outcome. The main outcomes are usually:
- Match: the records are sufficiently likely to represent the same entity.
- Non-match: the evidence indicates different entities.
- Review: the evidence is incomplete or conflicting and needs a person or a later decision rule.
This separation matters because false positives can merge two customers, corrupt financial history, or attach activity to the wrong account. False negatives leave duplicate records unresolved and can fragment reporting. A good system makes both error types visible rather than hiding them behind a single threshold.
Before implementing similarity logic, define the entity being resolved, the source systems involved, the fields available, and the consequences of a wrong match. A customer master-data workflow may require conservative matching, while an internal contact-cleanup task may tolerate more manual review. The risk profile should influence every later decision.
Step-by-step workflow
1. Define the matching objective and canonical record
Start with a clear output. Are you linking incoming transactions to an existing customer table, merging duplicate profiles, or building a crosswalk between systems? Decide which dataset is authoritative, whether links are one-to-one or one-to-many, and how conflicts will be handled.
Create a stable internal entity identifier. Do not use a name, email address, or source-system ID as the universal identity key unless its uniqueness and ownership are well established. Preserve the original source values alongside cleaned values so decisions can be audited and corrected.
2. Profile the input data
Measure missingness, duplicate rates, character sets, common abbreviations, field lengths, and formatting patterns. Inspect examples rather than looking only at aggregate counts. A name field may contain titles, initials, family names, or multiple people. An address field may combine apartment numbers, postal codes, and delivery instructions in inconsistent ways.
Identify source-specific behavior. One system may store a phone number with a country code, while another removes it. One may use a transliterated name, while another preserves non-Latin characters. These differences should become explicit rules in the pipeline rather than unexplained exceptions in a model.
3. Build a field-aware normalization pipeline
Normalization creates comparable representations without erasing useful evidence. Common steps include Unicode normalization, case folding, whitespace cleanup, punctuation handling, tokenization, and consistent treatment of diacritics. The right sequence depends on the field and locale.
For names, consider removing or separately storing titles, standardizing punctuation, and retaining token order as well as a sorted-token representation. For addresses, parse components when possible: house number, street, unit, locality, region, and postal code. For telephone numbers, apply country-aware formatting rules. For email addresses, preserve the original value and normalize only transformations that are valid for your systems.
Keep multiple representations when they serve different purposes. A canonical form can support exact matching, while a display-preserving form supports review. The normalization pipeline guide provides a useful framework for separating safe transformations from domain-specific rules.
4. Generate candidates before calculating detailed similarity
Comparing every record with every other record becomes expensive and can create many accidental similarities. Candidate generation, often called blocking, limits detailed comparisons to plausible pairs.
Use one or more blocking keys, such as a normalized postal code, phone suffix, email domain plus local-part prefix, house number and street token, or an initial-based name key. Combine several passes so that a missing or incorrect value in one field does not eliminate a genuine match. Blocking keys should be permissive enough to preserve likely matches but selective enough to control noise and cost.
Do not treat a blocking key as proof of identity. Two people can share an address, and common names can produce large candidate groups. Blocking only determines which pairs deserve further examination.
5. Compare fields with appropriate similarity methods
Different fields need different forms of approximate string matching. Edit distance can help with short spelling errors, while Jaro-Winkler may be useful for some short names. Trigram similarity can handle shared character sequences and token variation. Phonetic matching can help with sound-alike names, but it should be treated as supporting evidence rather than a final decision because unrelated names can share a phonetic code.
For addresses, compare components separately where possible. A matching postal code and house number may be more informative than a high whole-string score. For names, compare both the full normalized string and token-level forms. For multilingual data, define locale-aware handling for scripts, transliteration, and diacritics instead of assuming that one universal normalization rule is safe. See the multilingual fuzzy matching guide for considerations that affect cross-language pipelines.
6. Combine evidence into an interpretable score
Start with a transparent weighted rule or a supervised model only when you have reliable labeled examples. A rule might give stronger weight to an exact email or phone match, moderate weight to a compatible name and address, and a penalty to contradictory values. Missing fields should usually be treated as missing evidence, not as evidence of a mismatch.
Record field-level similarities, exact-match indicators, blocking paths, and contradiction flags. An overall score without these details is difficult to debug and difficult for reviewers to trust. Also consider pair-level constraints: two incoming records should not both be assigned to the same canonical entity if the business relationship is one-to-one, unless an explicit exception applies.
7. Set match, review, and non-match thresholds
Use at least two thresholds: an upper threshold for automatic matches and a lower threshold below which pairs are rejected. The interval between them becomes a review queue. Thresholds should be calibrated against labeled examples that resemble production data, not chosen solely because a score looks intuitive.
Review threshold tuning and validation guidance when setting these boundaries. Examine errors by source, field completeness, language, geography, and entity type. A single global threshold may be convenient, but segment-specific thresholds can be safer when data quality varies substantially.
Tools and handoffs
A maintainable pipeline usually has distinct stages: ingestion, profiling, normalization, candidate generation, scoring, decisioning, review, and publishing. Store the output of each stage or enough metadata to reproduce it. This makes it possible to explain why a pair matched and to rerun only the affected stage after a rule change.
Use database functions for simple normalization and exact joins, and use a search or similarity engine when candidate retrieval requires trigrams, approximate string matching, or larger-scale indexing. A data matching API can be useful when you need a reusable service boundary, but evaluate its field controls, audit output, language support, latency, and ability to preserve source data. The comparison of open-source entity resolution tools can help organize that evaluation.
Manual review should be a designed handoff, not an informal spreadsheet. Give reviewers the original values, normalized values, field-level scores, source systems, and the reason the pair entered the queue. Capture decisions using stable labels such as match, non-match, insufficient information, or possible household/shared entity. Those decisions become valuable training and validation data.
Publish a link table rather than overwriting source records. Include source record ID, canonical entity ID, decision, score, rule or model version, reviewer status, and timestamps. This supports rollback, audits, incremental processing, and corrections when a rule changes.
Quality checks
Build a labeled evaluation set containing confirmed matches and confirmed non-matches. Include difficult cases: common names, shared addresses, changed phone numbers, transliteration differences, missing fields, and records from each important source. Track precision for automatic matches and recall for the resolution task, but also inspect the absolute error examples.
Monitor false positives and false negatives separately. A high overall match rate can conceal harmful overmatching, while a conservative system can appear accurate by rejecting too many pairs. Measure review volume, decision consistency, unresolved records, and the distribution of scores over time.
Add operational checks around the matching logic:
- Alert when a source suddenly has unusual missingness or formatting.
- Check that normalized values are deterministic and versioned.
- Review unusually large candidate blocks, which may indicate an overly broad key.
- Detect one canonical entity receiving an unexpected number of records.
- Verify that rerunning the same input produces the same result unless a versioned rule changed.
- Sample automatic matches and rejected pairs for periodic human review.
Document business exceptions explicitly. For example, shared household addresses, company subsidiaries, joint accounts, and recycled phone numbers may require relationship-specific rules. These are not merely algorithmic edge cases; they define what identity means in your application.
When to revisit
Revisit the pipeline whenever a source system changes its schema, formatting, validation rules, or identifier behavior. New regions, languages, customer segments, or acquisition channels can also change the error patterns enough to require new normalization and blocking rules.
Review thresholds after collecting a meaningful set of manual decisions, especially if the review queue grows, reviewers disagree frequently, or downstream teams report incorrect merges. A change in the cost of false positives versus false negatives is also a reason to recalibrate the decision policy.
Make updates versioned and measurable. Keep the previous pipeline available for comparison, run a backtest on labeled records, compare match and review outcomes, and publish the new rule or model only after checking for regressions by source and entity type. Reprocess historical records when the correction affects prior links, but preserve the old decisions so downstream changes remain explainable.
To put this workflow into practice, begin with one entity type and a small labeled sample. Profile the fields, implement reversible normalization, add one or two blocking passes, and expose field-level evidence before optimizing for scale. Then establish the three-way decision—match, review, non-match—and monitor errors continuously. A modest, auditable entity resolution pipeline is usually more valuable than an opaque system that produces a larger number of automatic links.