The Libra OnDemand Matching Engine automatically processes reservations data coming in from the PMS and matches incoming guest information with guest profiles (or Contact records) that already exist in the system. The main goal for matching is to find the correct guest profile for each stay, avoiding duplicate profiles and updating profile data with new information.
I’d like to take a moment to explore how matching works and what options you have to manage this process.
Does the Reservation have a profile?
When a new or updated reservation record comes in, the system looks at whether or not it comes with a guest profile associated with it by the property management system. Some PMS systems, like Opera or Springer Miller, would always have a guest profile record for each stay. Others, like Epitome PMS, may very well have reservations that are not tied to any guest profile. Although we’d like to think that each profile that the PMS sends us is unique to that guest, it may not always be the case. There could be duplicate profiles in the PMS database, or there could be several separate PMS databases at a hotel chain, each holding it’s own profile data for the same guests that happened to stay in several hotels.
Consider this example: Guest A stays in Property 1, and then the same guest stays in Property 2, which has it’s own PMS system. As far as properties are concerned, since their PMS systems may not even be connected, there will be two separate guest profiles coming in to the CRM. There could also be cases when one and the same PMS will have duplicate profiles for the same guest. Our goal is to keep CRM data clean and avoid duplicates as much as possible. As long as there are enough matching data points (such as name, address or phone number) for this guest among the two separate records that we receive, Libra OnDemand will keep just one Contact profile for this guest, which will be linked to the separate profiles in each PMS system via a special object called “Contact PMS Link”.

Do Profiles match?
To perform its matching, Libra OnDemand places each incoming profile record into a separate object called “Reservation Match Queue Item” and triggers an automatic batch process that attempts to find a match among Contact profiles that have already been created. Matching is done through a set of pre-configured criteria. The way this works is that there are corresponding sets of matching formulas in the Contact and Match Queue objects. These formulas reference record field data within three data sets (called Groups) that are getting matched. For a match to be successful, at least one formula field in each of groups 1 and 2 must match beween the Contact and Match Queue Item, or two formula fields in group 3 must match with each other.
Matching Object Structure
|
Contact object
|
Reservation Match Queue Item object
Profile Matching Group
|
| GROUP 1 FORMULA 1 (eg., guest name) |
GROUP 1 FORMULA 1 (eg., guest name) |
| GROUP 2 FORMULA 1 (eg., guest phone) |
GROUP 2 FORMULA 1 (eg., guest phone) |
| GROUP 2 FORMULA 2 (eg., guest email) |
GROUP 2 FORMULA 2 (eg., guest email) |
| GROUP 3 FORMULA 3 (eg., guest freq stay id) |
GROUP 3 FORMULA 3 (eg., guest freq stay id) |
| GROUP 3 FORMULA 1 (eg., guest name) |
GROUP 3 FORMULA 1 (eg., guest name) |
| GROUP 3 FORMULA 2 (eg., guest email) |
GROUP 3 FORMULA 2 (eg., guest email) |
Matching Rules
((GROUP 1, FORMULAS 1 OR 2) AND (GROUP 2, FORMULAS 1 OR 2 OR 3 OR 4))
OR (GROUP 3, FORMULAS 1 AND 2)
By using formulas to define matching fields, Libra OnDemand allows its clients to configure match criteria based on their specific requirements. For example, some clients will want to use the full guest name as a match criteria, others will prefer to match by first letter of the first name and full last name.
In the above example match will be found if the guest name and either of the guest’s phone, email or frequent stay id will be the same between incoming profile record and existing contact information (groups 1 and 2 match), of if both matching fields in group 3 will be equal to each other.
Shall we use the PMS Id?
Formula fields can be used to reference any field on the Contact or Match Queue objects, however they cannot be used for referencing profile’s PMS Ids (unique record identifiers in the source PMS system), as these Ids are not Contact-specific, but rather PMS Link-specific (each Contact by definition can have multiple PMS links and consequently multiple PMS Ids). For this reason we have included the options on the Site record to specify whether or not PMS Ids should be used for matching in any of the match groups.
The settings in this example would add the PMS Id field data to matching groups 2 and 3. This way, if the guest’s name (group 1) and either profile PMS Id, phone, email or freq stay id (group 2) are matched, or both the guest name and profile PMS Id (group 3) are matched, then the system considers them to be one and the same profile.
What happens after the match?
Once the match is complete and the matching Contact record is found, the system will update existing Contact profile with new data, taking into account the ‘Sync Contact Resolution’ setting defined in the Site configuration. There are three possible options that determine what happens if there is conflicting field data between what is stored in Libra OnDemand and what is coming from the PMS:
- LOD wins (in case of conflict, data in Libra will not be changed)
- PMS wins (in case of conflict, PMS will override Libra data)
- Most Recent Update (most recently updated record will override the field data)
Additional rule to consider is that null or blank field value updates will never be applied, and record deletions will not cause records in Libra to be deleted.

What if the match is not found?
If the match is not found, there are two possible scenarios, defined by the ‘Always Use PMS Profile’ Site setting. If the setting is set to Yes, the system will stop the matching process and create a new Contact record in Libra OnDemand, connected to the corresponding PMS profile via the Contact PMS Link. When Always Use PMS Profile is set to No, of if there was no PMS profile with this reservation in the first place, the system will continue it’s matching process, looking for a match of data on the incoming Reservation record (as opposed to incoming Profile record) with Contacts and other Reservations that already exist in Libra OnDemand.
Reservation to Profile match
The Reservation to Profile match is looking for matches between data on newly created or updated Reservations and data on Contact profiles already existing in the system. In this case the system is using the ResToProfile matching groups in the Reservation Match Queue Item object. These groups are compared to corresponding matching groups in the Contact object. If match is found, we attach this reservation to the matched contact. With no match, we continue to the next step, which will match the incoming reservation with all other reservations that already exist in the system.
Reservation to Reservation match
This is the final step in the matching process. The system will look for a match with other Reservations, using the Reservation matching groups in the Reservation Match Queue Item object and corresponding groups in Reservations. These other reservations may or may not have Contact profiles associated with them, and with match, the system will create a new Contact and link it to all matched records. If no match is found, the system will just save the new Reservation without creating a new Contact.
In other words, if a reservation came from the PMS without a profile, and there were no matching Contacts or other Reservations found, the system will save this reservation without any Contact attached to it. This means that guests staying the in the hotel only once will not be treated by the system as a Contact until their second stay, at which point a Contact profile will be created and attached to both instances of this guest’s stay.
Matching Algorithm
Libra OnDemand Matching Algorithm