Give the listing, offer, property, and match separate IDs
We use a source-scoped listing ID for the exact advertisement, an offer ID for the commercial offer, a property ID for the likely physical asset, and an association ID for the decision that links an offer to a property. The fourth ID matters: confidence and evidence belong to the match, not to either record it connects.
A price edit should not change the property ID. A portal republishing an advertisement under a new ID may change the source listing ID without creating a new home. Keeping those events separate prevents overwritten history and lets us undo a bad match without deleting the observations behind it.
Use signals that do not fail in the same way
We start with deterministic relationships and exact structured references. Then we compare normalized address, coordinate precision, unit number, floor, typed area, bedrooms, and property category. Agreement across several independent facts is stronger than a large pile of correlated text features.
Descriptions, agent details, and perceptual image similarity are supporting evidence only. Agencies reuse copy, developments reuse renders, portals round map pins, and adjacent units share layouts. A model that treats those as independent votes becomes confidently wrong in exactly the densest inventory.
Keep conflicting source claims after the match
Two genuine offers for one property can disagree on price, area, availability, or amenities. We group the assertions but do not flatten them into an unexplained winner. A preferred value keeps the source, observed time, transformation, competing values, and selection rule behind it.
When new evidence contradicts a match, we can split the association and recompute the property view without destroying either source history. That is the practical difference between canonicalization and destructive deduplication.
Measure false merges before celebrating fewer rows
A falling row count is not proof that identity resolution improved. We review precision and false-merge rate alongside duplicate reduction, then sample automatic matches, review-band candidates, large clusters, and dense developments where similar units coexist.
The acceptance invariant is simple: every canonical property resolves to at least one source offer; every offer resolves to its original observation; and every match can be explained and reversed. If any of those links is missing, the identity layer is not ready to trust.
- Sample the largest and fastest-growing property clusters.
- Review matches built mostly from text or shared media.
- Confirm split and rematch operations preserve observation history.
- Track precision by market and source pair, not only globally.