1. Room Mapping
Vervotech
  • Hotel Mapping
    • Getting Started
    • Access & Onboarding with Vervotech
    • Explore your providers
    • Integration and Go Live
    • Map Providers Content
    • Webhook
    • References
    • FAQ
    • Metadata Content
      • Get Master Hotel Facilities
      • Get Master Hotel Chains
      • Get Master Hotel Brands
      • Get Master Property Types
      • Get All Master Countries
      • Get All Vervotech IDs
    • Mappings
      • Get Mappings
      • Get New Mappings
      • Get Updated Mappings
      • Get Deleted Mappings
      • Get Mapping Statistics
      • Export Mappings File
      • Get Mapping Counts
      • Get Provider Hotel Mappings by Provider ID
      • Get Provider Hotel Mappings by Vervotech ID
    • Curated Content
      • Get Curated Content by Provider Hotel IDs
      • Get Updated Curated Content
      • Get Curated Content by Vervotech IDs
    • Provider Content
      • Get Unmapped Provider Hotels
      • Get Unmapped Provider Hotels V2
      • Create Unmapped Provider Hotels File
      • Get All Provider Names
      • Get Provider Content by Provider Hotel IDs
      • Get Provider Content by Vervotech IDs
    • Location Content
      • Get Location by ID
      • Get All Locations
    • Operational APIs
      • Review Mappings of Booked Hotels by File
      • Review Mappings of Booked Hotels
      • Start Mapping by SFTP Folder
      • Get Mapping History by Run ID
    • Dynamic Mapping APIs
      • Find Match
    • Dual Mapping APIs
      • Overview
      • Get Mappings by Provider Hotel ID
      • Get Mappings with Content by Provider Hotel ID
      • Get Dual Mapping API Statistics
  • Room Mapping
    • Getting Started
    • File Based Room Mapping (Offline)
    • Customized Room Mapping Rules and Case Study
    • References
    • FAQ
    • Mapping API
      • Map Rooms
      • Get Master Room Amenities
      • Get Master Room Attributes
      • Get Provider Names
      • Get All Provider Names
    • Async Room Mapping API
      • Get Async Room Mapping Response
      • Map Large Rooms Async
    • Board Basis Mappings
      • Get All Master Board Basis
      • Map Board Basis
  • Schemas
    • Schemas
    • Response
      • GetMasterHotelBrandsResponse
      • GetMasterPropertyTypesResponse
      • GetMasterCountriesResponse
      • FacilityGroupFixtures
      • GetMasterHotelChainsResponse
    • HotelContent
    • GetHotelsByLocationIdRes
    • RoomMappingBody
    • Unica.Core.Contracts.Location.MasterLocationListRes
    • GetMasterHotelBrandsResponse1
    • CuratedHotels
    • GetHotelsByPolygonRes
    • RoomMappingBody2
    • Unica.Core.Contracts.Location.MasterLocationRes
    • GetMasterPropertyTypesResponse2
    • CuratedHotelsWithLocationContent
    • GetMappingsCountRes
    • KeyValue
    • Unica.Core.Contracts.Models.Airport
    • GetMasterCountriesResponse3
    • ReviewHotels
    • Unica.Core.Contracts.Models.ApiResponse
    • FacilityGroupFixtures4
    • ProviderMappingsStats
    • ProviderFacility
    • Unica.Core.Contracts.Models.Bed
    • GetMasterHotelChainsResponse5
    • MappingsStats
    • Unica.Core.Contracts.Models.Billing.AccountUsageBalance
    • ReviewMappingsofBookedHotelsRequest
    • ProviderRoomContent
    • Unica.Core.Contracts.Models.Billing.BillingEntry
    • LocationByPolygonRequest
    • RoomMappingRequest
    • Unica.Core.Contracts.Models.Billing.BilllingHistory
    • ProviderHotelIdentifiers
    • GenericResponse
    • Unica.Core.Contracts.Models.Billing.UsageBalanceDetails
    • ProviderHotelIdentifier
    • GetUnmappedHotelsResponse
    • GetMasterRoomAmenitiesResponse
    • Unica.Core.Contracts.Models.ConnectedLocation
    • GetMasterHotelChainsResponse
    • GetUnmappedHotelsV2Response
    • GetMasterRoomAttributesResponse
    • Unica.Core.Contracts.Models.DownloadStats
    • HotelChains
    • GetProviderContentResponse
    • MappedRoomRate
    • Unica.Core.Contracts.Models.DownloadStatsStatus
    • HotelMapping
    • GetProviderContentByHotelIdsResponse
    • RoomMappingResponse2
    • Unica.Core.Contracts.Models.Facility
    • HotelProviderIdentifier
    • GetCuratedContentResponse
    • ErrorResponse
    • Unica.Core.Contracts.Models.GetAllCountriesResV3
    • AsyncRoomMappingResponse
    • Bed
    • GetUpdatedCuratedContentResponse
    • Unica.Core.Contracts.Models.GetAllHotelBrandsRes
    • Status
    • GetMappingStatisticsResponse
    • Unica.Core.Contracts.Models.GetAllHotelChainsRes
    • Message
    • ReviewMappingsofBookedHotelsResponse
    • Unica.Core.Contracts.Models.GetAllMasterTagsResV3
    • StatusCode
    • GetProviderMappingResponse
    • Unica.Core.Contracts.Models.GetAllPropertyTypesRes
    • FacilityGroupFixtures
    • GetProviderMappingByProviderResponse
    • Unica.Core.Contracts.Models.GetMappingHistoryReq
    • GuestReview
    • GetMappingHistoryByRunIdResponse
    • Unica.Core.Contracts.Models.GetMappingsCountRes
    • CategoryRating
    • GetProviderNamesResponse
    • Unica.Core.Contracts.Models.GetProviderMappingStatsRS
    • Facility
    • GetProviderHotelIdsByVervotechIdResponse
    • Unica.Core.Contracts.Models.HotelsAPI.HotelContentField
    • GetMasterHotelBrandsResponse2
    • NearByLocation
    • GetAllVervotechIdsResponse
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.CreateUnmappedProviderHotelsFileReq
    • GetMasterPropertyTypesResponse3
    • TrainStations
    • StartMappingByFtpFolderResponse
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.CuratedHotelWithLocationMapping
    • GetMasterCountriesResponse4
    • PointOfInterests
    • PropertyContent400Error
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetCuratedContentByVervotechIdsReq
    • FacilityGroupFixtures5
    • ConnectedLocations
    • PropertyContent404Error
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetCuratedContentWithLocationRes
    • GetMasterHotelChainsResponse6
    • Neighbourhoods
    • HotelChain404Error
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetMappingByProviderRes
    • GetMasterHotelBrandsResponse3
    • Stadiums
    • MasterCountry404Error
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetMappingsRes
    • GetMasterPropertyTypesResponse4
    • LocationMapping
    • BucketFolderNotFound
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetMasterFacilityGroups
    • GetMasterCountriesResponse5
    • GetMasterHotelBrandsResponse
    • ProviderNames404Error
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetOSMLocationsRQ
    • FacilityGroupFixtures6
    • HotelBrands
    • PropertyType404Error
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetProviderContentByProviderIdsReq
    • GetMasterHotelChainsResponse7
    • GetMasterPropertyTypesResponse
    • Error401
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetProviderContentByVervotechIdsReq
    • PropertyTypes
    • Error403
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetProviderContentRes
    • GetMasterCountriesResponse
    • Error426
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetUnmappedProviderHotelsReq
    • Countries
    • Error500
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetUnmappedProviderHotelsRes
    • Room
    • Error503
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetUnmappedProviderHotelsV2Req
    • Locations
    • Facility404Error
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetUnmappedProviderHotelsV2Res
    • ResumeKey
    • TotalHotelsCount404Error
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetUpdatedCuratedContentRes
    • Error
    • LocationsRS
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.GetVervotechIdsRes
    • UnmappedHotelContent
    • Location404Error
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.HotelProviderIdentifierV3
    • HotelsByLocationIdRes
    • Location400Error
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.MasterFacilityGroups
    • Tag
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.ProviderHotelIdsRes
    • schema1
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.ProviderHotelMappings
    • schema2
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.ProviderMapping
    • schema3
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.ProviderMappingRes
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.ProviderMappingType
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.ReviewBookedHotelsReq
    • Unica.Core.Contracts.Models.HotelsAPI.HotelMappingV3.StartMappingByFtpFolderRes
    • Unica.Core.Contracts.Models.Image
    • Unica.Core.Contracts.Models.ImageSize
    • Unica.Core.Contracts.Models.KeyValue
    • Unica.Core.Contracts.Models.Link
    • Unica.Core.Contracts.Models.MappingStats
    • Unica.Core.Contracts.Models.MappingStatsRes
    • Unica.Core.Contracts.Models.MasterChain.HotelBrand
    • Unica.Core.Contracts.Models.MasterChain.HotelChain
    • Unica.Core.Contracts.Models.MasterLocation.LocationMappingRes
    • Unica.Core.Contracts.Models.MasterTags.Tags
    • Unica.Core.Contracts.Models.Neighbourhood
    • Unica.Core.Contracts.Models.PoI
    • Unica.Core.Contracts.Models.ProviderHotelHistory
    • Unica.Core.Contracts.Models.ProviderHotelHistoryRes
    • Unica.Core.Contracts.Models.ProviderHotelIdentifier
    • Unica.Core.Contracts.Models.ProviderMappingStats
    • Unica.Core.Contracts.Models.RawMapHotel
    • Unica.Core.Contracts.Models.Room
    • Unica.Core.Contracts.Models.RoomArea
    • Unica.Core.Contracts.Models.Stadium
    • Unica.Core.Contracts.Models.TrainStation
    • Unica.Core.Contracts.Models.VerifyMapping
    • Unica.DataContracts.Common.Address
    • Unica.DataContracts.Common.Bed
    • Unica.DataContracts.Common.CategoryRating
    • Unica.DataContracts.Common.CheckinInfo
    • Unica.DataContracts.Common.CheckoutInfo
    • Unica.DataContracts.Common.Contact
    • Unica.DataContracts.Common.Description
    • Unica.DataContracts.Common.DistanceUnit
    • Unica.DataContracts.Common.Facility
    • Unica.DataContracts.Common.Fee
    • Unica.DataContracts.Common.FeeType
    • Unica.DataContracts.Common.GeoCode
    • Unica.DataContracts.Common.GuestReview
    • Unica.DataContracts.Common.Image
    • Unica.DataContracts.Common.ImageSize
    • Unica.DataContracts.Common.KeyValue
    • Unica.DataContracts.Common.Link
    • Unica.DataContracts.Common.PointOfInterest
    • Unica.DataContracts.Common.Policy
    • Unica.DataContracts.Common.ReviewDistribution
    • Unica.DataContracts.Common.Room
    • Unica.DataContracts.Common.RoomArea
    • Unica.DataContracts.Common.Statistics
    • Unica.DataContracts.Common.UserReview
    • Unica.DataContracts.HotelMappingV3.DTORawMapHotel
    • Unica.DataContracts.HotelMappingV3.ProviderHotel
    • Unica.DataContracts.MasterLocation.MasterLocation
    • Unica.Host.Web.Controllers.GetProviderNamesRes
    • Unica.Services.CoreService.Models.GetProviderMappingMappingRq
    • Unica.Services.CoreService.Models.HotelMappingReq
    • NewHotelMapping
    • UpdatedHotelMapping
    • DeletedHotelMapping
  1. Room Mapping

Customized Room Mapping Rules and Case Study

This document describes how the Room Mapping engine decides that two supplier rooms are equivalent, the four rule types that govern grouping behavior, the configuration parameters available to integrators, and a worked case study showing how the rules combine on real input.
ℹ️ Who configures these rules? During client onboarding, the Vervotech Support team configures rules based on each client's property portfolio and mapping requirements. Customers do not typically self-serve rule configuration, but understanding the rule taxonomy helps integrators interpret behavior and request adjustments accurately.

1. Overview of the rule engine#

Room Mapping Rules define how room data from multiple sources — channel managers, OTAs, and PMS systems — is normalized, grouped, and displayed to end users. The rules ensure that similar rooms across different suppliers are matched correctly and presented with a consistent, unified display name.
The engine processes each input room through three logical phases:
1.
Parse and normalize. The engine reads the raw RoomName, RoomCode, Description, and any provided attributes (Bed, View, Refundability, BoardBasis). It expands abbreviations, resolves common synonyms, and extracts structured fields such as room category, bed type, view, and amenities.
2.
Apply mapping rules. Each of the four rule types described below is evaluated. Rules are applied in priority order when multiple could match.
3.
Group and emit output. Equivalent rooms across providers are placed under the same Group for the property. Each output record carries the standardized name, mapped attributes, group identifier, and a per-rate MatchScore (confidence). Rooms that cannot be matched confidently are returned into separate group so no input is lost.
Key principle: no input is dropped. Every input room is represented in the output, mapped or unmapped. This makes the engine safe to place inline in shopping flows without risk of disappearing inventory.

2. Mapping rules reference#

There are four rule types in the Room Mapping engine. All four are owned and configured by Vervotech Support Team.
#Rule NameDescriptionInputExpected OutputPriority
1Bedding Mapping RuleMerge similar bed types into one group and set which bed type is preferred for display.Source bed types (e.g., Double, Queen, King)Single bedding group with a preferred display label (e.g., "King preferred")Configurable per rule (1 = highest)
2Attribute Mapping RuleIgnore specific room attributes during grouping so that rooms differing only by those attributes are still matched together.List of attributes to ignore (e.g., HasBalcony, SmokingAllowed)Rooms grouped under a single unified name despite the ignored attributeGlobal scope
3Category Similarity RuleGroup similar room categories under a single unified category name.Source categories (e.g., Standard, Classic, Basic)Unified category display name (e.g., Standard)Evaluated alongside other rules
4View Matching RuleMap similar room view descriptions to a single unified display name.Source views (e.g., Sea View, Oceanfront, Partial Ocean View)Unified view name (e.g., Ocean View)Case-insensitive by default
Each rule is described in detail below.

2.1 Bedding Mapping Rule#

Purpose: Merge similar bed types into a single group and set which bed type is preferred for display.
When to use: When a property receives room data with multiple bed type labels (e.g., "Double", "Queen", "King") that should be treated as equivalent for matching purposes.
Worked example of the rule pattern:
Source Bed TypeDirectionMerged GroupDirectionDisplay Name
Double➜
Queen➜One Group➜Queen preferred
King➜
Configuration parameters:
ParameterDescriptionExample
Source Bed TypesList of bed types to merge into one groupDouble, Queen, King
Display PreferenceThe bed type label shown to end usersQueen preferred
PriorityRule evaluation order when multiple rules apply1 (highest)
Best practices:
Always confirm the client's preferred display bed type before configuring.
Group only genuinely interchangeable bed types — do not merge Single with Queen.
Set priority carefully when a room could match multiple bedding rules.
✅ Tip: A hotel lists rooms as "Double Room" on Supplier A and "Queen Room" on Supplier B. With this rule, both are grouped together and displayed as "Queen preferred" to the end user.

2.2 Attribute Mapping Rule#

Purpose: Ignore specific room attributes during the grouping process so that rooms differing only by those attributes are still matched together.
When to use: When certain attributes (e.g., HasBalcony, SmokingAllowed) should not affect whether two rooms are considered the same type.
Worked example of the rule pattern:
Room Source DataIgnored AttributeGrouped Result
Deluxe Room with BalconyHasBalconyDeluxe Room
Deluxe Room without BalconyNo Attribute detectedDeluxe Room
Deluxe Room (Smoking)SmokingAllowedDeluxe Room
Configuration parameters:
ParameterDescriptionExample
Ignored AttributesAttributes excluded from matching logicHasBalcony, SmokingAllowed
ScopeApply globally or per propertyGlobal
Best practices:
Only ignore attributes that the client confirms are irrelevant for their use case.
⚠️ Warning: Aggressive attribute-ignoring can collapse rooms that travelers actually want to distinguish (e.g., smoking vs. non-smoking). Confirm scope explicitly before going live.

2.3 Category Similarity Rule#

Purpose: Group similar room categories under a single unified category name.
When to use: When different suppliers or channels use different category labels for what is essentially the same room tier.
Worked example of the rule pattern:
Source CategoryDirectionUnified Category
Standard➜
Classic➜Standard
Basic➜
Configuration parameters:
ParameterDescriptionExample
Source CategoriesList of category names to treat as equivalentStandard, Classic, Basic
Unified CategoryThe display name for the merged groupStandard
Best practices:
Group only valid categories together and review it quarterly or monthly basis.

2.4 View Matching Rule#

Purpose: Map similar room view descriptions to a single unified display name.
When to use: When rooms across sources have different view labels that should resolve to the same view type for the end user.
Worked example of the rule pattern:
Source ViewDirectionUnified View
Sea View➜
Oceanfront➜Ocean View
Partial Ocean View➜
Configuration parameters:
ParameterDescriptionExample
Source ViewsList of view names to mergeSea View, Oceanfront, Partial Ocean View
Unified View NameThe display name for all matched viewsOcean View
Best practices:
Confirm with the client whether partial views (e.g., "Partial Ocean View") should be grouped with full views or kept separate.
✅ Tip: A beachfront resort lists rooms as "Sea View" on one channel, "Oceanfront" on another, and "Partial Ocean View" on a third. This rule unifies them all under "Ocean View."

3. Board-basis normalization#

Board-basis strings are normalized to one of five standard values.
Standard Board BasisMeaningExample Keywords
Room OnlyNo meals included.no meals, only room, room-only, accommodation only, RO
Bed and BreakfastBreakfast only.bed and breakfast, bed & breakfast, continental breakfast, breakfast included, b&b, BB
Half BoardBreakfast plus lunch or dinner.half board, half-board, hb, breakfast & lunch, breakfast & dinner
Full BoardBreakfast, lunch, and dinner.full board, full-board, fb
All InclusiveBreakfast, lunch, dinner, and drinks.all inclusive, all-inclusive, all meals, ai

4. Case study — mapping a multi-supplier hotel#

The following case study walks through a representative example combining all four rule types. It uses a hypothetical hotel and three suppliers, but reflects the kinds of inputs platforms regularly send.

4.1 Scenario background#

A mid-size online travel platform aggregates inventory from three suppliers — Supplier A, Supplier B, and Supplier C — for Hotel Aurora, a 180-room urban property. Each supplier returns the property's flagship "Deluxe King — Ocean View" room, but each describes it differently:
SupplierRoomNameRoomCodeBedViewOther
Supplier ADeluxe King Room with Sea View, BalconyDLX-K-SV-B1 King BedSea ViewHas balcony
Supplier BDLX 1QUEEN OCEANFRONTDK-OFQueenOceanfront—
Supplier CClassic Room — Double — Partial Ocean View (Smoking)CLS-D-01DoublePartial Ocean ViewSmoking

4.2 Challenge#

Without mapping, the platform's search results show three separate rows for what is essentially the same room tier. Travelers see what looks like three distinct rooms with three different prices, when in reality only the price meaningfully differs. Two business problems follow:
Conversion friction. Travelers spend extra time investigating, and room duplication makes the process more confusing, often leading them to switch to different Provider.

4.3 Mapping rules applied#

The engine processes the three records, applying each of the four rule types:
1.
Bedding Mapping Rule — Double, Queen, and King are merged into one bedding group with display preference set to Queen preferred. Supplier A's "1 King Bed", Supplier B's "Queen", and Supplier C's "Double" all resolve to the same canonical bed group.
2.
Attribute Mapping Rule — HasBalcony is configured as an ignored attribute for this client. Supplier A's balcony attribute is therefore not used to separate it from the others. SmokingAllowed is also ignored, so Supplier C's smoking variant is not split off.
3.
Category Similarity Rule — Deluxe and Classic are configured as equivalent categories with unified display name Deluxe. Supplier C's "Classic Room" is therefore unified with Supplier A's and Supplier B's "Deluxe" rooms.
4.
View Matching Rule — Sea View, Oceanfront, and Partial Ocean View are merged into the unified view Ocean View. Case-insensitive matching ensures variants like "OCEANFRONT" or "ocean view" all resolve correctly.
The cumulative effect: all three rooms are recognized as the same standardized room despite different bed labels, different view names, balcony/no-balcony differences, smoking/non-smoking differences, and different category strings.

4.4 Result / output#

The mapping engine returns a single standardized group containing all three supplier rates. Conceptually:
{
"standardRooms":[
  {
    "standardName":"Deluxe, Queen, Ocean view"
     "mappedRates": [
    {
      "inputIndex": "1",
      "Provider": "Supplier A",
      "RoomCode": "DLX-K-SV-B",
      "MatchScore": 97
    },
    {
      "inputIndex": "2",
      "Provider": "Supplier B",
      "RoomCode": "DK-OF",
      "MatchScore": 92
    },
    {
      "inputIndex": "3",
      "Provider": "Supplier C",
      "RoomCode": "CLS-D-01",
      "MatchScore": 86
    }
  ]
  }
]
}
Supplier A receives the highest MatchScore (closest textual match to the canonical name). Supplier B scores slightly lower because its bed and view diverge textually but resolve via rules. Supplier C scores lowest among the three but is still confidently grouped because three of the four rule types contribute supporting evidence.

4.5 Outcome / business value#

After deploying mapping, the platform consolidates the three rows into a single search result for Hotel Aurora's Deluxe Queen — Ocean View, with the lowest-priced supplier surfaced as the headline rate. Three downstream effects follow:
Cleaner UX. Travelers see one row per room type, not three. Decision fatigue drops.
Better margin awareness. The platform can route bookings to whichever supplier offers the best rate per room without risk of misrouting due to ambiguous descriptions.

For rule-configuration changes, integration support, contact customersuccess@vervotech.com.
Previous
File Based Room Mapping (Offline)
Next
References
Built with