Data Deduplication Strategies at Enterprise Scale
On this page
Why Enterprise Deduplication Is Hard
Small lists with a few thousand records can be deduplicated with simple exact matching. Enterprise databases with millions of records across dozens of systems require a fundamentally different approach.
The challenges at scale:
- Volume. Comparing every record to every other record is O(n^2). At 10 million records, that is 50 trillion comparisons. Even at 1 million comparisons per second, that would take over 1.5 years.
- Variety. The same entity is represented differently across systems (CRM says "John Smith at IBM," marketing automation says "J. Smith at International Business Machines," billing says "JOHN SMITH at IBM Corp.").
- Velocity. New records enter the system constantly. Deduplication is not a one-time event; it must run continuously.
- Authority. When two records are duplicates, which one is correct? Different systems may hold different correct information (marketing has the right email, sales has the right phone number, billing has the right address).
- Relationships. Records have relationships (contacts belong to accounts, deals belong to contacts). Merging duplicates must preserve and correctly reassign all relationships.
Matching Strategies
Exact matching
The simplest approach: two records match if a field is identical after normalisation.
Normalisation steps:
- Lowercase all text.
- Remove leading/trailing whitespace.
- Remove punctuation.
- Standardise abbreviations (St -> Street, Inc -> Incorporated).
- Remove special characters.
Exact matching works for:
- Email addresses (after lowercasing).
- Phone numbers (after formatting to a standard format).
- Government IDs and account numbers.
- Domains.
Exact matching fails for:
- Names (Robert vs Bob vs Rob vs Bobby).
- Company names (IBM vs International Business Machines vs I.B.M.).
- Addresses (123 Main St vs 123 Main Street vs 123 Main St.).
For email-only deduplication, upload your lists to Email Extractor, which performs case-insensitive exact matching across all uploaded files.
Fuzzy matching
Fuzzy matching identifies records that are similar but not identical.
String similarity algorithms:
| Algorithm | How it works | Best for |
|---|---|---|
| Levenshtein distance | Counts single-character edits (insert, delete, substitute) | Typo detection (Smth vs Smith) |
| Jaro-Winkler | Weighted character matching, prefers matching prefixes | Names (John vs Jon, Smith vs Smithe) |
| Soundex / Metaphone | Phonetic encoding (words that sound alike get the same code) | Names that sound similar (Catherine vs Katherine) |
| n-gram similarity | Compares sequences of n characters | Company names, addresses |
| Cosine similarity | Vector comparison of character or word frequency | Longer text fields |
| TF-IDF | Term frequency-inverse document frequency | Company name matching |
Example: matching company names
| Record A | Record B | Levenshtein | Jaro-Winkler | Human judgment |
|---|---|---|---|---|
| IBM | International Business Machines | Very low | Very low | Same company |
| Microsoft Corp | Microsoft Corporation | High | High | Same company |
| Deloitte | Deloitte Touche Tohmatsu | Moderate | High | Same company |
| Apple Inc | Apple Federal Credit Union | Moderate | Moderate | Different entities |
String similarity alone cannot determine that IBM and International Business Machines are the same company. This requires a lookup table of known aliases or more sophisticated matching.
Composite matching
Combining multiple fields produces more accurate matches than any single field.
Composite match scoring:
Match score = (
weight_email * email_match(a, b) +
weight_name * name_similarity(a, b) +
weight_company * company_similarity(a, b) +
weight_phone * phone_match(a, b) +
weight_address * address_similarity(a, b)
)
if match_score > threshold:
flag_as_duplicate(a, b)
Example weights:
| Field | Weight | Rationale |
|---|---|---|
| Email (exact match) | 0.40 | Email is a strong unique identifier |
| Full name (Jaro-Winkler > 0.85) | 0.25 | Name combined with other fields is reliable |
| Company (Jaro-Winkler > 0.80) | 0.20 | Company context confirms identity |
| Phone (normalised exact) | 0.10 | Additional confirmation |
| Address (normalised fuzzy) | 0.05 | Weakest signal (people and companies move) |
Threshold interpretation:
- Score > 0.90: high-confidence duplicate (auto-merge).
- Score 0.70-0.90: probable duplicate (flag for review).
- Score < 0.70: probably not a duplicate (no action).
Machine learning matching
For large-scale, complex deduplication, machine learning models can be trained on human-reviewed examples.
Process:
- Generate candidate pairs using blocking (see below).
- Calculate features for each pair (string similarities, field matches, contextual features).
- Train a classifier (random forest, gradient boosting, neural network) on human-labelled examples of duplicates and non-duplicates.
- Apply the trained model to score all candidate pairs.
- Review edge cases and retrain periodically.
Advantages:
- Adapts to the specific characteristics of your data.
- Can capture patterns that rule-based approaches miss.
- Improves over time with more training data.
Requirements:
- Labelled training data (thousands of examples of duplicates and non-duplicates).
- Data science resources to build and maintain the model.
- Ongoing monitoring and retraining.
Scaling Deduplication
Blocking
The fundamental technique for scaling deduplication is blocking: instead of comparing every record to every other record, divide records into blocks and only compare records within the same block.
Blocking strategies:
| Blocking key | How it works | Reduces comparisons |
|---|---|---|
| First 3 characters of last name | Records with "Smi" only compared to other "Smi" records | Dramatically (assuming name distribution) |
| Email domain | Records with @example.com only compared to other @example.com records | By domain count |
| Postal code | Records in the same postal code compared | By geographic distribution |
| Soundex code | Records with the same phonetic code compared | Handles misspellings |
| Company name first word | Records with the same first word of company name compared | By company name uniqueness |
Multi-pass blocking:
Use multiple blocking keys in separate passes. A record that does not block together with its duplicate in pass 1 may block with it in pass 2.
- Pass 1: block by email domain.
- Pass 2: block by last name + first 3 characters of first name.
- Pass 3: block by phone number (normalised).
- Pass 4: block by company name + city.
Union the candidate pairs from all passes, remove duplicates among the candidate pairs, then score and evaluate.
Sorted neighbourhood
An alternative to blocking: sort records by a key, then compare each record to its neighbours within a sliding window.
- Choose a sorting key (e.g., concatenation of Soundex of last name + first initial).
- Sort all records by this key.
- Compare each record to the next w records in the sorted order (window size w, typically 5-20).
Advantages: simple to implement, handles slight variations in the sorting key. Disadvantages: similar records with very different sorting keys will be missed.
Distributed deduplication
For truly massive datasets (hundreds of millions of records), distribute the work:
- Map-Reduce: Map phase assigns records to blocks; Reduce phase compares within blocks.
- Apache Spark: Spark MLlib includes entity resolution components.
- Dedicated tools: Senzing, Tamr, Informatica MDM handle distributed entity resolution.
Merge Strategies
Deciding which record survives
When two records are confirmed duplicates, one must survive (or a new merged record is created).
Survival rules:
| Approach | How it works | When to use |
|---|---|---|
| Most recently updated | The record with the latest modification date survives | When recency indicates accuracy |
| Most complete | The record with the most populated fields survives | When completeness is the priority |
| Source priority | Records from higher-authority systems survive | When some systems are more reliable |
| Field-level best | Select the best value for each field from either record | When different records have different correct fields |
| Golden record | Create a new record with the best values from all duplicates | For master data management |
Field-level merge rules
| Field | Merge rule | Rationale |
|---|---|---|
| Keep the most recently verified; keep all valid emails as alternates | Email changes; multiple may be valid | |
| Name | Keep the most complete version (full name over initials) | John Robert Smith over J. Smith |
| Phone | Keep the most recent; keep all as alternates | Phone numbers change |
| Company | Keep the most recent | People change companies |
| Title | Keep the most recent | Titles change frequently |
| Address | Keep the most recent verified | Addresses change |
| Source | Concatenate all sources | Preserve provenance |
| Created date | Keep the earliest | Record lineage |
| Activity history | Merge all activities | Complete engagement history |
| Deals/opportunities | Reassign to surviving record | Preserve pipeline data |
| Notes | Concatenate with date stamps | Preserve all context |
Handling relationships
Merging records means reassigning relationships:
- Contacts to accounts: if two contact records at the same account are merged, simple. If they are at different accounts, investigate (did the person change companies, or is this a false match?).
- Deals/opportunities: reassign to the surviving record. Check for duplicate deals created because of duplicate contacts.
- Activities: merge email history, call logs, meeting records, notes. Preserve chronological order.
- Lists and segments: add the surviving record to all lists that either duplicate was on. Remove the non-surviving record.
- Subscriptions and consent: merge conservatively. If either record has an unsubscribe or consent withdrawal, honour it on the merged record.
Cross-System Deduplication
The multi-system problem
Enterprise organisations typically have the same contacts in:
- CRM (Salesforce, HubSpot, Dynamics).
- Marketing automation (Marketo, HubSpot, Pardot).
- Customer support (Zendesk, ServiceNow, Freshdesk).
- Billing/ERP (NetSuite, SAP, QuickBooks).
- E-commerce platform (Shopify, Magento).
- Event platforms (Cvent, Eventbrite).
- Data providers (ZoomInfo, Apollo).
Each system has its own record structure, identifiers and data quality.
Cross-system matching
Step 1: Extract and normalise
Export contacts from each system. Normalise field names, formats and values to a common schema.
Step 2: Create a common identifier
If no common identifier exists across systems (such as a customer ID), email address is the most reliable cross-system match key.
Upload all exports to Email Extractor to extract and deduplicate email addresses across all source files. This identifies which email addresses appear in multiple systems.
Step 3: Match and link
For records that share an email address, link them. For records that do not share an email address, use composite matching (name + company + other fields) to identify potential cross-system duplicates.
Step 4: Create or update the golden record
Establish one system as the master (usually CRM). Merge the best data from each source system into the master record.
Step 5: Maintain synchronisation
Set up ongoing sync between systems. When a record is updated in any system, propagate changes to the master. When a new record is created, check for duplicates before creation.
Master Data Management (MDM)
For organisations with complex data landscapes, a dedicated MDM platform manages entity resolution across systems:
| Platform | Approach |
|---|---|
| Informatica MDM | Hub-based MDM with matching and merge |
| Reltio | Cloud-native MDM with graph-based matching |
| Tamr | ML-powered entity resolution |
| Semarchy | Agile MDM with progressive enrichment |
| Profisee | Microsoft-ecosystem MDM |
| Senzing | AI-powered entity resolution engine |
Implementation
Phase 1: Assessment (week 1-2)
- Inventory all systems containing contact/company data.
- Count records in each system.
- Sample 1,000 records from each system and estimate duplicate rates.
- Map fields across systems (which fields exist where, what they are called).
- Identify the most reliable source for each field.
Phase 2: Pilot (week 3-4)
- Select one system (start with the CRM).
- Export all records.
- Apply blocking + matching on a sample (10,000-50,000 records).
- Review results manually (at least 200 flagged pairs).
- Calculate precision (what percentage of flagged pairs are true duplicates) and recall (what percentage of true duplicates were flagged).
- Tune thresholds and weights based on results.
Phase 3: Production deduplication (week 5-8)
- Run the tuned matching process on the full database.
- Auto-merge high-confidence duplicates (score > 0.90).
- Queue medium-confidence duplicates (score 0.70-0.90) for human review.
- Resolve reviewed pairs.
- Apply merge rules and reassign relationships.
- Verify data integrity after merging.
Phase 4: Prevention (ongoing)
- Implement duplicate detection on record creation.
- Set up automated matching on new records (daily or real-time).
- Establish data entry standards to reduce future duplicates.
- Schedule periodic full-database deduplication (quarterly).
- Monitor duplicate creation rate as a data quality metric.
Metrics
| Metric | Definition | Target |
|---|---|---|
| Duplicate rate | Duplicate records / total records | Under 3% |
| Precision | True duplicates / flagged duplicates | Over 95% for auto-merge |
| Recall | Flagged duplicates / total true duplicates | Over 85% |
| Merge accuracy | Correctly merged / total merged | Over 99% |
| Time to merge | Average time from flagging to resolution | Under 48 hours for auto-merge; under 1 week for review |
| New duplicate rate | New duplicates created per week | Declining trend |