Entity resolution inside an organization is a solved-enough problem: pick a canonical source, define a key, fix the records that do not conform. None of those three moves is available when one of the datasets belongs to someone else.
What changes when you cannot fix the source
Internal resolution converges because errors get corrected and the corrections persist. External resolution does not converge. The third-party file refreshes monthly, reintroduces the variants you resolved, and occasionally changes its own identifiers without notice.
This means resolution cannot be a one-time cleanup producing a merged table. It has to be a maintained mapping, versioned, that survives the source changing underneath it.
You are not cleaning data. You are maintaining a translation between two things that will keep drifting apart.
Represent the match, not the merge
The common design merges matched records into a golden record, which discards the evidence and makes the decision unreviewable. The alternative keeps both records and stores the match as its own object with attributes.
- The signals that supported the match, individually, with their weights
- A confidence value, and a threshold recorded as of the version in force
- The date established and the source file versions on both sides
- Any human adjudication, with who and when
- An explicit unresolved state, distinct from unmatched
Keeping the match as an object costs storage and buys the ability to answer why two records were linked — which is exactly the question that arrives when a downstream number is disputed.
Where embeddings help and where they mislead
Vector similarity is effective for the blocking step: reducing a quadratic comparison space to a tractable candidate set, tolerantly, across spelling and formatting variation. That is genuine value and hard to replicate with deterministic blocking alone.
It is not a match decision. Two records can be semantically close and refer to different entities — a parent and its subsidiary, two branches, a person and their relative at the same address. The decision needs the discriminating fields, and similarity is not one of them.
Where cross-organisational resolution effort goes
Relative weighting from delivery practice, not a measured statistic — shown to rank where attention belongs.
Measuring without a truth set
There is rarely ground truth for cross-organizational matches, which tempts teams to report a match rate and stop. A match rate measures throughput, not correctness, and can be increased by lowering the threshold.
The workable substitute is a stratified manual review: sample matches at several confidence bands, adjudicate them carefully, and estimate precision per band. It is modest work, it produces defensible numbers, and it tells you where the threshold should actually sit rather than where it was guessed.
The match object, specified
Keeping the match rather than merging is the central recommendation, and it is worth stating exactly what the object holds.
| Attribute | Purpose |
|---|---|
| Left and right record references | Both originals remain intact and independently refreshable |
| Supporting signals, individually | A challenge can be examined signal by signal |
| Contradicting signals | Recording what did not agree is as informative as what did |
| Score and threshold in force | A later threshold change does not silently rewrite past decisions |
| Source file versions and date | The match is reproducible against the data as it stood |
| Adjudication, if any | Human decisions survive re-runs instead of being overwritten |
| State | Matched, unmatched, and unresolved are three different things |
The last row carries more weight than it appears to. Collapsing unresolved into unmatched loses the distinction between "we determined these are different" and "we could not tell," and downstream consumers will treat both as a confident negative.
Blocking, scoring, deciding — three separate stages
Conflating these is the most common structural mistake, and separating them makes each one improvable independently.
Blocking reduces an infeasible comparison space to a candidate set. It should be generous — a pair missed here is unrecoverable later — and this is exactly where vector similarity is valuable, because it tolerates the spelling and formatting variation that deterministic keys do not.
Scoring evaluates each candidate pair across discriminating fields, producing a comparable value. This is where the identifiers, dates, and geography do the work.
Deciding applies thresholds and routing, producing matched, unmatched, or unresolved. Keeping this separate means the threshold can move without recomputing anything, and the effect of moving it can be estimated before it is applied.
Systems that use embedding similarity as the decision — rather than as the blocking step — inherit its central weakness: semantic closeness is not identity, and a parent and subsidiary are about as close as two records can be.
Living with a source that keeps moving
The defining constraint is that the external file refreshes and reintroduces variation you already resolved. Handling this well is mostly about where the resolution decisions live.
- Store matches against stable record content, not against row positions or provider-assigned keys that can be reissued
- On refresh, re-run resolution and diff the result rather than rebuilding from scratch
- Preserve human adjudications across refreshes explicitly — they must survive, or reviewers stop bothering
- Report what changed each cycle: new matches, broken matches, newly ambiguous cases
- Alert on structural changes in the source — a new format, a changed identifier scheme, a coverage shift
The broken-match report is the one that earns its keep. A link that existed last month and does not this month is either a genuine corporate change worth knowing about or a data quality event worth investigating, and both are things the business wants surfaced rather than silently absorbed.
Estimating precision without ground truth
The absence of truth data tempts teams into reporting a match rate, which measures throughput and can be improved by lowering the bar. A stratified review gives a defensible number for modest effort.
Bucket matches by score into several bands. Sample from each band — more heavily from the bands near the threshold, where the decisions are actually contested. Have someone adjudicate the sample carefully, blind to the score. Compute precision per band.
The output is a curve showing how precision falls as score falls, which is exactly what is needed to place the threshold deliberately rather than by intuition. It also tells you where the unresolved band should sit — the region where precision is too low to auto-accept and too high to discard.
A few hundred adjudicated pairs produce this. It is the least expensive high-value measurement in the whole area and it is skipped more often than not.
How downstream systems should consume the mapping
The final discipline is indirection. Downstream systems query the versioned mapping, never the external file directly.
This sounds like an abstraction for its own sake and is not. It is what allows the external source to change format, reissue identifiers, or shift coverage without breaking every report and model built on top of it. The mapping absorbs the churn; consumers see a stable interface.
It also makes reproducibility achievable. A report produced in March can be reproduced by querying the March version of the mapping, even though the underlying file has refreshed six times since. Without indirection that reproduction is impossible, and the question of why last quarter's number differs becomes unanswerable.
When not to do this at all
Resolution is expensive to build and expensive to maintain, and there are cases where the honest recommendation is to avoid it.
If the external source publishes a stable identifier that your records can adopt directly, adopt it and skip the probabilistic layer entirely. If the decision the join supports tolerates ambiguity — a rough market sizing, a directional trend — a fuzzy aggregate may be sufficient and a maintained mapping is over-engineering. And if the external dataset is a one-time input for a single analysis that will not be repeated, a manual reconciliation of the few hundred rows that matter is cheaper than any system.
The case for building is narrow and specific: a recurring join, feeding a decision where a wrong link has a cost, against a source you cannot correct. That combination genuinely requires the machinery. Anything less usually does not.
What it costs to run, not just to build
- Refresh processing — modest, and it recurs on the source's cycle rather than yours
- Adjudication — the standing human cost; scales with source volatility, not data volume
- Precision re-estimation — periodic stratified review to confirm the thresholds still hold
- Schema drift response — unplanned, occasionally urgent, when the source changes format
- Storage of versions — cheap, and the thing people economize on and later need
The adjudication line is the one that determines whether the system survives. A mapping with no one adjudicating contested links accumulates unresolved states until downstream consumers start treating unresolved as unmatched, at which point the careful representation has been discarded by convention.
Explaining a link to someone who disputes it
The payoff for keeping match evidence arrives in a specific moment: a number is questioned, the question traces to a link, and someone asks why two records were treated as one.
With evidence retained, that is a short conversation with an artifact at the centre — these identifiers agreed, these fields agreed, this one did not, the score was here, the threshold was here, and a person confirmed it on this date. The disagreement becomes about whether the threshold is right, which is a productive argument.
Without it, the conversation is about whether the system can be trusted, which is not productive and tends to end with someone rebuilding the join in a spreadsheet. That outcome is common enough to be worth designing against explicitly.
Frequently asked questions
It can propose and explain, which is useful for triage. Final adjudication on consequential links benefits from a human, and the explanation is what makes that review fast.
Through the versioned mapping, never by joining directly to the external file. That indirection is what lets the mapping absorb the source's drift without breaking everything built on it.
