Skip to content

Platform module

Hotel mapping and normalisation

The same property from many suppliers, resolved to one object.

Design-partner previewBuilt and demonstrable; onboarding a limited number of design partners.

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.

Stated plainly:This module is built and demonstrable, and is onboarding a limited number of design partners. It is not yet carrying production volume across many customers.

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.

Supplier records

The same property arrives from every connected supplier under its own id, name, address and coordinates.

Candidate generation

Geospatial proximity plus normalised name similarity narrows millions of pairs to a reviewable set.

Scoring

Identifier, geo, name, address, star rating, room count and phone are weighted into one confidence score.

Decision bands

High confidence merges automatically. Low confidence is rejected. The uncertain band goes to human review rather than being guessed.

Unified property

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.

Stated plainly:The catalogue is fixtures, not live supplier data: coordinates are plausible for their cities but are not real property locations, and no supplier named here is a real company. The matching logic is production code, covered by 37 tests, and is in design-partner preview rather than running at aggregator scale.

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.

0.82

Raise this and confident merges fall back to human review.

0.55

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.

sup_alphaA-118322

Downtown Grand Dubai

Dubai · AE · 5★ · 320 rooms

25.19720, 55.27440 · giata 1094422

sup_betaHB-7741201

Grand Downtown Hotel & Suites

Dubai · AE · 5★ · 318 rooms

25.19755, 55.27462 · giata 1094422

Every signal, and what it contributed

externalId+4.00Shared identifier agrees (giata).
geo+2.60Coordinates agree to 45m.
name+0.80Names partly agree: "downtown grand dubai" vs "grand downtown".
address+0.80Addresses broadly agree.
starRating+0.70Both rated 5★.
phone+1.00Phone numbers match.
roomCount+0.40Room counts agree (320 vs 318).

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 ResortJeddah Corniche Resort & Spa

0.95

Both 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 & SuitesGRAND DOWNTOWN DXB

0.82

Coordinates 83m apart — plausible for one building. Names partly agree: "grand downtown" vs "grand downtown dxb".

فندق قصر النيل ريزيدنسQasr El Nil Residence

0.77

Coordinates agree to 34m. Names partly agree: "قصر النيل ريزيدنس" vs "qasr nil".

Marina Bay Suites Tower AMarina Bay Suites Tower B

0.75

Names agree after normalisation (marina bay tower). Addresses broadly agree.

Riyadh Business Park HotelBusiness Park Riyadh by Anwa

0.72

Names 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 idNameSuppliers
tvc_htl_64f19263Downtown Grand Dubaisup_alphasup_betasup_gamma
tvc_htl_7597ab67فندق الأهرامsup_betasup_gamma
tvc_htl_19504e15Alexandria Corniche Palacesup_epsilonsup_zeta
tvc_htl_806e4c0eMarina Bay Suites Tower Asup_alpha
tvc_htl_cc2848dcMarina Bay Suites Tower Bsup_beta
tvc_htl_8dc25f18فندق قصر النيل ريزيدنسsup_alpha
tvc_htl_793f2fe3Qasr El Nil Residencesup_delta
tvc_htl_f940a899Nile Tower Hotelsup_alpha
tvc_htl_d8f5e2d9Nile Tower Hotel Cairosup_beta
tvc_htl_663abe51Riyadh Business Park Hotelsup_alpha
tvc_htl_49431917Business Park Riyadh by Anwasup_delta
tvc_htl_69b50bd3Jeddah Corniche Resortsup_beta
tvc_htl_6ab50d66Jeddah Corniche Resort & Spasup_beta
tvc_htl_6b6c78fdZamalek Garden Innsup_alpha
tvc_htl_669b9307Sofitel Gezirah Towerssup_gamma