Platform module
Hotel mapping and normalisation
The same property from many suppliers, resolved to one object.
How does hotel mapping work?
Hotel mapping resolves the same property arriving from several suppliers into one record. TravelCore scores name, geography, address and identifiers, then sorts candidates into three bands: matched automatically, rejected, or held for a human. Uncertain matches are reviewed by a person rather than merged on a threshold, because a wrong merge sells the wrong hotel.
This is the hardest problem in hotel distribution and the reason companies exist to solve only it. Three suppliers return the same Dubai hotel as 'Downtown Grand Dubai', 'Grand Downtown Hotel & Suites' and 'GRAND DOWNTOWN DXB', at three slightly different coordinates, with three different address formats and three unrelated internal ids. Without resolution, your search page shows the same hotel three times, your cheapest-rate logic is wrong, and your customer sees a mess.
TravelCore resolves properties through a layered match: exact identifier match where a shared identifier exists, then geospatial proximity within a tight radius, then normalised name similarity, then address and postal-code agreement, then corroborating signals such as star rating, room count and phone number. Each candidate pair carries a confidence score.
The part that matters commercially is what happens in the middle band. High-confidence matches merge automatically. Low-confidence pairs are rejected. The uncertain band goes to a human review queue rather than being guessed, because a wrong merge sells a room in the wrong building and that costs more than the review does.
This module is real code rather than a diagram, and it runs on this page. The engine below is the same TypeScript the test suite imports, covered by 37 tests over the cases that cost money, executing in your browser across a fixture catalogue. Move a threshold and the bands move, because there is no pre-computed result to move instead.
The hard part
Room mapping is harder than property mapping
Two suppliers agreeing on the hotel can still disagree on the room. 'Deluxe King City View' and 'Superior Double, City Facing' may or may not be the same product, and getting it wrong means a guest arrives to a different room than they paid for. Room mapping runs as a separate stage with its own confidence bands and its own review queue.
Capabilities
- Deterministic match on shared identifiers where available
- Geospatial candidate generation within a tuned radius
- Name normalisation across transliteration, chain prefixes and legal suffixes
- Address and postal-code corroboration
- Confidence scoring with automatic, rejected and review bands
- Human review queue for the uncertain band
- Room-type mapping across supplier room descriptors
- Content merge policy: which supplier wins for images, description and amenities
- Stable, deterministic property ids: an unchanged catalogue always yields the same ids
- Arabic-to-Latin matching via consonant skeletons, so cross-script records can meet at all
- Every decision carries the signals that produced it, so a merge can be explained months later
How it resolves
From many supplier records to one property
The uncertain band is the whole game. Merging a hotel wrongly sells a room in the wrong building, which costs far more than a human review does.
The same property arrives from every connected supplier under its own id, name, address and coordinates.
Geospatial proximity plus normalised name similarity narrows millions of pairs to a reviewable set.
Identifier, geo, name, address, star rating, room count and phone are weighted into one confidence score.
High confidence merges automatically. Low confidence is rejected. The uncertain band goes to human review rather than being guessed.
One stable TravelCore property id, one content set, and a supplier reference list underneath it.
Run it yourself
The engine, executing in your browser
Everything below is produced by the same modules the test suite imports, running now over a fixture catalogue of supplier records. There is no demo copy of the algorithm and no pre-computed result — move a threshold and watch the bands move.
Live
Move a threshold and the engine re-runs
This is the same code the test suite runs, executing in your browser over 19 supplier records. Nothing here is pre-computed.
Raise this and confident merges fall back to human review.
Lower this and weaker pairs stop being discarded.
Records in
19
Properties out
15
Auto-merged
4
Needs review
5
Rejected
2
Comparisons avoided
160
Candidate generation compared 11 pairs instead of the 171 a naive matcher would. At nineteen records that is a curiosity; at a million properties it is the difference between a nightly job and an impossible one.
The cases it has to get right
Each was chosen because getting it wrong costs money in a specific way. Open one to see the records and every signal that decided the outcome.
Downtown Grand Dubai
Dubai · AE · 5★ · 320 rooms
25.19720, 55.27440 · giata 1094422
Grand Downtown Hotel & Suites
Dubai · AE · 5★ · 318 rooms
25.19755, 55.27462 · giata 1094422
Every signal, and what it contributed
The review queue, as a person would receive it
Sorted by score, each with the two signals that moved it most. This is the band the whole design exists to protect: a wrong merge sells a room in the wrong building, and that costs far more than the review does.
Jeddah Corniche Resort↔Jeddah Corniche Resort & Spa
0.95Both records come from the same supplier. If they really are one property, that is a duplicate in their catalogue and worth telling them about.
Grand Downtown Hotel & Suites↔GRAND DOWNTOWN DXB
0.82Coordinates 83m apart — plausible for one building. Names partly agree: "grand downtown" vs "grand downtown dxb".
فندق قصر النيل ريزيدنس↔Qasr El Nil Residence
0.77Coordinates agree to 34m. Names partly agree: "قصر النيل ريزيدنس" vs "qasr nil".
Marina Bay Suites Tower A↔Marina Bay Suites Tower B
0.75Names agree after normalisation (marina bay tower). Addresses broadly agree.
Riyadh Business Park Hotel↔Business Park Riyadh by Anwa
0.72Names partly agree: "riyadh business park" vs "business park riyadh anwa". Coordinates 194m apart — plausible for one building.
Resolved properties
Property ids are derived from cluster membership, so an unchanged catalogue always produces the same ids — otherwise every downstream booking reference would break.
| Property id | Name | Suppliers |
|---|---|---|
| tvc_htl_64f19263 | Downtown Grand Dubai | sup_alphasup_betasup_gamma |
| tvc_htl_7597ab67 | فندق الأهرام | sup_betasup_gamma |
| tvc_htl_19504e15 | Alexandria Corniche Palace | sup_epsilonsup_zeta |
| tvc_htl_806e4c0e | Marina Bay Suites Tower A | sup_alpha |
| tvc_htl_cc2848dc | Marina Bay Suites Tower B | sup_beta |
| tvc_htl_8dc25f18 | فندق قصر النيل ريزيدنس | sup_alpha |
| tvc_htl_793f2fe3 | Qasr El Nil Residence | sup_delta |
| tvc_htl_f940a899 | Nile Tower Hotel | sup_alpha |
| tvc_htl_d8f5e2d9 | Nile Tower Hotel Cairo | sup_beta |
| tvc_htl_663abe51 | Riyadh Business Park Hotel | sup_alpha |
| tvc_htl_49431917 | Business Park Riyadh by Anwa | sup_delta |
| tvc_htl_69b50bd3 | Jeddah Corniche Resort | sup_beta |
| tvc_htl_6ab50d66 | Jeddah Corniche Resort & Spa | sup_beta |
| tvc_htl_6b6c78fd | Zamalek Garden Inn | sup_alpha |
| tvc_htl_669b9307 | Sofitel Gezirah Towers | sup_gamma |
Related
The rest of the core
Booking engine
One flow from search to voucher, for every product type.
Pricing and markup engine
Net rate to final price, by rule, versioned and auditable.
Supplier control center
Onboarding, credentials, mapping runs and honest health data.