Tracking item consumption and other new features

One of several new features in our upcoming May 2011 release is the ability to track the actual consumption of menu items (also known as “Function Items”) during a catering event. You’re now able to enter how many items were served as opposed to simply tracking how many items were ordered on the group’s banquet event order (BEO). 

Once consumption is entered for each item, you can generate a Banquet Check, using the same Google Docs option that you use for creating BEOs and Event Contracts. 

Several other function item-related features have found their way into this release. Many of our clients have been asking for additional ways to categorize Service Items. In addition to tracking item types (such as Food & Beverage) and item categories (such as Food, Beverage, Liquor, etc.), you can now create sub-categories (Hors d’Oeuvres anyone?)

To make it even easier to sort through multiple menu items on a function, we’ve added the ability to sort through function items by simply clicking on the column header for item name, category, sub-category, quantity, price and service times. 

And last but not least, we’ve implemented support for Open Items by allowing users to add ad-hoc items to functions and simply edit item’s name, price and description right there on the fly, without the need to make changes to item configuration.

The May 2011 release will be generally available on May 9th, with Libra OnDemand managed package versions starting from 1.164 and up.


The secrets of matching

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



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



The power of Rollup Batch Jobs 

Ever wanted to do a query on guests that have stayed with you more than a certain number of times? Or spent more than X amount of dollars on food & beverage? Or wanted to see the arrival list sorted by the number of repeat visits your guests have had at your hotel?

All of these tasks are easily accomplished with the help of the recently released feature called “Rollup Batch Jobs”, which allows numeric aggregation of field data from child to parent objects. Batch Rollups take advantage of salesforce batch apex, and run on a pre-defined schedule against your entire database.

Lets say you want to aggregate, or roll up, the total number of actual past stays for each guest (= Contact) record that you have in your database. Using Rollup Batch Jobs you can specify the child object (Reservation), parent object (Contact), the field you are aggregating (Reservation Id) and what operation you want to perform (in this case, CNT or Count). You can also specify the filter criteria of Reservation Status = “Checked Out” to exclude all future or cancelled reservations. Set this job to run once a day, and you got yourself a field on a Contact that will show you how many times this person has stayed with you in the past. You can then use this field to query email lists, in reporting or as a lookup formula field to display on a reservation.

Rollup Batch Jobs are installed as an unmanaged package to your Libra OnDemand org, using the following links:

Rollup Settings: https://login.salesforce.com/?startURL=%2Fpackaging%2FinstallPackage.apexp%3Fp0%3D04tA00000001ode

Rollup Extension: https://login.salesforce.com/?startURL=%2Fpackaging%2FinstallPackage.apexp%3Fp0%3D04tA00000001xZw

Once installed, go to a newly created tab called “Rollup Batch Jobs” and create a new entry, entering the Rollup Job name, the name of the Parent and Child objects (use their API names, such as lod4__Reservation__c for Reservations and Contact for contacts). If you would like to limit what child records are being queried by the job, enter Query filter such as lod4__Status__c=’O’ to limit reservations to only those that are in the Checked Out status.

You can run Rollup Jobs on a schedule, or have them follow the completion of a previous rollup job. This way you can build sequences of jobs, such as Stat Reservations rolling up to Reservations, Reservations rolling up to Contacts and Contacts rolling up to Accounts.

The first job in a sequence must have the ‘Run Every’ (n minutes) field filled in, which will determine how frequently the job runs. A typical setting would be once every 60 minutes for an hourly job, or 1440 for a job that runs every 24 hours.

Once the Rollup Job is created, you’d need to specify which fields need to be rolled up. Simply enter the Parent field (use the field’s API name), Child field and what operation you are performing (Count, Max, Min or Sum).

You can monitor the performance of Rollup Batch Jobs by going to Setup->Admin Setup->Monitoring, then selecting Scheduled Jobs to view the status of scheduled jobs, or Apex Jobs to view each job’s progress.

We hope you will find Rollup Batch Jobs a useful addition to your Libra OnDemand tool set. 


VerticalResponse and Email Delivery

Libra OnDemand has partnered with VerticalResponse for it’s mass email services, using VerticalResponse’s APIs to deliver seamless integration to Libra OnDemand CRM users. What that means is that any mass emails that you send from Libra OnDemand using the Libra OnDemand Campaign and List management tools are actually processed and sent via VerticalResponse.

VerticalResponse is a leader in email marketing, with over 75,000 customers worldwide and a ton of experience in delivering and managing mass emails. Making sure that your email actually reaches the recipient is obviously important for your email campaigns, and our partnership with VerticalResponse helps our customers achieve some of the highest levels of deliverability in the industry.

This post provides a digest of VerticalResponse’s best practices and recommendations for email deliverability.

What Does VerticalResponse Do to Ensure Excellent Email Delivery?

We’re Anti-Spam

Everyone says they’re anti-spam, but we really, really mean it.  We respond to and investigate every single complaint that comes in to our abuse desk, we quickly work to resolve issues with clients who receive complaints (before they start causing delivery problems), and we even look over every email newsletter launched through our system to make sure nothing suspicious or fraudulent can make it out the door. This keeps complaints to a minimum, which is a big part of maintaining a strong reputation for our IP Addresses.

We Automate Bounce / Unsubscribe Processing

By automating this process (like many of our competitors), we ensure no users can abuse our IP Addresses by ignoring bounces and unsubscribes. This also helps us keep an excellent reputation.

We Use Feedback Loops

We have feedback loops with every single ISP that is known to offer one (and maintain strong relationships even with those that don’t). This means if someone clicks Report Spam at Hotmail, that Hotmail trusts us to take action on the complaint.  It also means that when someone clicks such a button at a participating an ISP (like Hotmail), VerticalResponse users don’t have to worry they’ll accidentally send email to that person again as we automatically unsubscribe any trigger happy recipients who press the “Report Spam” button.

We Use Authentication Protocols

We authenticate client email through the use of the three currently major authentication protocols: SPF (Sender Policy Framework), Sender-ID, DomainKeys and DKIM. With SPF and Sender-ID we have published records that state our mail domains are allowed to send email marketing messages on behalf of our own IP Addresses. With DomainKeys and DKIM we sign each email with a key that the recipient server can then use to verify that we actually sent the email newsletter. These are a very important part of maintaining a good sending infrastructure.

We have a Dedicated Policy and Delivery Team

Our very experienced delivery management group is available to help with any questions regarding your specific email marketing messages (write them at delivery@verticalresponse.com).  They also work hard to ensure VerticalResponse’s reputation remains as strong as possible.

What Can You Do to Help Ensure Excellent Email Delivery and Response?

Keep a Clean Email Mailing List

Be sure everyone on the mailing list has specifically requested info from or about your company in one way or another. Also make sure you’re not mailing previously unsubscribed or bounced email addresses. That went out of style a long time ago.

Treat Subscribers with Respect

Don’t mail subscribers too often and clutter their inbox with email they don’t want. Set expectations at the time of sign-up: “This is what we’re going to send you. And we’re going to send it to you this often.” Also try to maintain a relationship with your email subscriber. Don’t email them sporadically once or twice a year and expect them to take action with your emails.

How often is too often? How sporadic is too sporadic?  I’d say once a week to once a month is a good range to keep in mind (though there are obviously situations where you may want to send more or less often), depending on your business type and what was promised at the time of sign-up. 

Design With Delivery in Mind

Don’t just put a big image together in Illustrator and think you’re good to go. Make sure the email newsletter is easy to read (consider paragraph length and fonts), that images are being used only to enhance the HTML / text content (not as the sole content), and that the email newsletter is something that the subscriber would expect to receive based upon their sign-up with you.

An excellent resource for more information is the VR Marketing Blog. You can also see more detail regarding email delivery in general by reading our whitepaper, VerticalResponse, Email Delivery, and You.


Tips & Hints for Email Marketing

Marketing to Your Customer Database

Libra OnDemand includes with powerful tools to market to your customer database. By combining rich CRM profile data with email marketing tools, you can segment your entire database by multiple criteria such as stay patterns, guest preferences, survey results, demographics data, spend history and others. You can then create highly targeted email campaigns that will have a high chance of striking home with their intended recipients.

First Sign Up for a Vertical Response Account

We use Vertical Response as our platform partner for email marketing services and CAN-SPAM compliance. We have created a strong integration with the Vertical Response solution, providing the ability to manage email marketing communications from within Libra OnDemand.
To get you started, please contact your Libra OnDemand account executive to sign you up for a VR account and to activate VR services for your organization.

Then Create Email Templates

Email Templates are created in the Communication Templates section of Libra OnDemand setup.

  1. Go to the Setup screen and navigate to the Administration Setup->Communication Templates->Email Templates section.
  2. Click the New button and create either a Custom or HTML template. If you already have a pre-designed html code for your template, simply copy and paste it to a new Custom template.

  3. For HTML templates, you would need to use a pre-defined Letterhead. Please refer to the following Help page for additional information about email templates and letterheads.

Remember that you can use the merge fields in the template editor to personalize your email content.

Create an Email List

Email Lists allow you to select members for email campaigns. There are two types of Email Lists: Standard (members are selected and added to the email list at the time of list creation) and Dynamic (members are added to the list at the time of campaign launch using pre-defined filter criteria). You would typically use standard lists for most of your email campaigns and you’d use dynamic lists mainly for pre-arrival and post-departure email communications.

  1. Click on the Email Lists tab, then click New to create a new Email List.
  2. Enter the list name and specify whether this is going to be a Standard or a Dynamic list. Click the Save button.
  3. Click Manage Members button to go to the member selection screen.
  4. Select whether you are going to build your list primarily from email addresses contained in the Contact or Reservation profiles.
  5. Select the Object for your search. If you are searching by main profile data of contacts or reservations, select Contact or Reservation as the object name. You can also search by any objects that are related to your primary object.
  6. Specify the Field name for the selected object and your search criteria. Click Go to display the results of your search.
  7. If you are creating a Standard list, select the list members that you want to add and click the Add Selected button.
  8. For Dynamic lists, click the Save Query button instead.

Now your Email List is ready and can be associated with email campaigns.

And Finally Create the Campaign!

  1. Click on the Email Campaigns tab and then New to create a new campaign.
  2. Use the Email Template field to select the template that you want to use.
  3. Use the Status field to track the approval process for the campaign. Only Reviewed campaigns can be activated for launch.
  4. Specify the Frequency of the campaign. Select ‘One Time’  to send the email only once. Use ‘Scheduled’ to be able to specify a time schedule for repeat campaigns. Click Save.
  5. Click the New Campaign List button to associate your email list(s) with the campaign.
  6. If you are creating a Scheduled campaign, click the New Campaign Schedule button to create a schedule of campaign launches. You can create Daily, Weekly and Monthly schedules.
  7. Now you are all set! Click the Activate button a the top of the screen to launch the campaign!