Room Bundles let you define multiple room types for a single property, or combine an itinerary of a room with rate features—additional services that come with a rate and conditions of sale—to your users beyond a standard price.
Key concepts and workflow
With Room Bundles, you can offer additional combinations of physical room types with different service packages.
The following image shows examples of Room Bundles:
In this example, the first bundle is likely the base room, with a discount for only one adult occupant. The second is a different room type which is available for up to 3 adult occupants. The third is another room type within the same property. The fourth is a "premium" package of the base room, which might include amenities such as free breakfast or a later checkout.
The following images show examples of rate features:
Displaying Room Bundles and rate features in search results is governed by the same selection process as standard room rates. For information about the benefits of Room Bundles, see Use Room Bundles and rate features.
Defining Room Bundles
You define Room Bundles and rate features in Transaction messages. The root
element of a Transaction message is
The structure of the Transaction message depends on what you are doing: defining the metadata about the Room Bundle or rate feature, or updating the Room Bundle's pricing/availability.
- Define Room Bundle and rate feature metadata with
<Result>. For more information, see Defining room and package metadata. Room Bundles use existing
<RoomData>elements for their physical room descriptions.
- Pricing and availability
- Define Room Bundle pricing and availability with the
<RoomBundle>element in a
<Result>for each package/itinerary combination. For more information, see Defining pricing and availability.
Room Bundle metadata
When defining Room Bundles and rate features, you typically define the description, additional services that are part of the rate, and other information about the Room Bundle ahead of time. This information is known as the Room Bundle metadata. You then reference this metadata in your pricing updates, but don't include it in the pricing update messages.
When you define Room Bundles, use existing
<RoomData> elements for the
physical room descriptions and
<PackageData> elements for the rate features
and terms that aren't part of the physical room description.
<PackageData> elements can significantly
reduce the size of your Hotel List Feed and
Hotel Price Feed
because it reduces the amount of repetitive data sent in Transaction
For example, data such as a room name and description is typically repeated
for every itinerary. You can use the
<PackageData> elements to define this type of data once.
Itinerary-specific Room Bundle data is then merged with the stored room and
package definitions for display to the end user.
Google matches your metadata with your itinerary-specific data to render the
contents of your ads. There is special
processing to combine the names and descriptions from the
allowing the physical room to be described in
and rate features and package details to be in
If you define both the room data and package data for a single room or Room Bundle, Google includes both in the ad output, separated by a hyphen.
Room Bundle data is gathered from all sources and combined, using precedence rules, to produce the final data for a given hotel, itinerary, and Room Bundle. The ordering is as follows, from lowest to highest precedence:
- (Lowest) Partner data
- Property data
<RoomData>, where the
<PackageData>, where the
Defining pricing and availability
To define Room Bundle pricing and availability, use a
<RoomBundle> element in a Transaction message for each
package/itinerary combination. The
should be inside the
Note that when you use Room Bundles, you must include one that matches the
room's base rate, taxes, and fees (specified in the
child element of
<Result>, the contained set of Room Bundles overwrites the
existing set for that property/itinerary combination. If you don't define any
Room Bundles or rate features in the
<Result> element, then all Room
Bundles are removed and only the basic room for that hotel/itinerary shows up in
Be sure to use elements such as
<Name> to make your Room
Bundles more attractive to potential customers and be sure they match the
hotel's landing page. In this example, you would define names and other
descriptive information in the metadata.
Defining room and package metadata
You define room and package metadata in a Transaction message that is separate from the pricing and availability data. By defining this data ahead of time, your pricing updates do not need to include repetitive information such as descriptions, photo URLs, amenities, and other data about each and every room/package for each and every itinerary.
Google stores the metadata for you and inserts it into your ads when they are displayed. You can update room and package metadata at any time with a new Transaction message.
In the Transaction message, you set a package ID and a room ID on each block
that you then reference in your
<Result> blocks of pricing updates.
If the room and package data changes (for example, if you add a new room type in a property), send a new Transaction message that contains the updated room and package data. Google replaces the existing metadata about a room or package with the new data.
Google recommends that you define metadata during your initial setup.
After pre-defining the metadata, you only need to reference the
<PackageID> values in your
pricing updates rather than include all that
information again. Google uses those IDs to match rooms
and Room Bundles with the stored metadata. This can greatly reduce
the overall size of your Transaction messages.
Because prices for room/itinerary combinations change much more frequently than the room or package descriptions, defining metadata once and then referring to it is a much more efficient use of Transaction messages. In addition, errors such as mismatching room descriptions can be eliminated by using metadata rather than defining data inline.
The recommended and most efficient method of defining metadata and pricing separately is shown below:
<!-- Efficient method of defining Room Bundles --> <!----- Occupancy of 2 example ------> <Transaction timestamp="2019-04-18T16:20:00-04:00" id="12345678"> <!-- Part1: Define RoomData and PackageData in PropertyDataSet --> <!-- Note: Once defined it does not have to be repeated for future Transaction Messages. --> <!-- PropertyDataSets can also be defined and sent in their own Transaction Message --> <!-- separately from pricing. Google can be configured to pull just PropertyDataSets --> <!-- once per day (or on a predefined frequency). --> <PropertyDataSet> <Property>180054</Property> <!-- Can be reused by multiple Room Bundles --> <RoomData> <RoomID>060773</RoomID> <Name> <Text text="Single Queen Room - Non-Smoking" language="en"/> <Text text="Chambre de la Roi Premium - Pas de Fumeurs" language="fr"/> </Name> <!-- Room can accommodate 4, but bundle is for 2 --> <Capacity>4</Capacity> </RoomData> <RoomData> <RoomID>436233</RoomID> <Name> <Text text="Premium King Room - Non-Smoking" language="en"/> <Text text="Chambre de le Roi Premium - Pas de Fumeurs" language="fr"/> </Name> <!-- Room can accommodate 4 and bundle is for 4 --> <Capacity>4</Capacity> </RoomData> <!-- Can be reused by multiple Room Bundles --> <PackageData> <PackageID>P54321</PackageID> <Occupancy>2</Occupancy> <ChargeCurrency>web</ChargeCurrency> <Refundable available="1" refundable_until_days="7" refundable_until_time="18:00:00"/> <ParkingIncluded>1</ParkingIncluded> <InternetIncluded>1</InternetIncluded> </PackageData> <PackageData> <PackageID>P12345</PackageID> <Occupancy>4</Occupancy> <ChargeCurrency>web</ChargeCurrency> <Refundable available="1" refundable_until_days="1" refundable_until_time="18:00:00"/> <BreakfastIncluded/> <ParkingIncluded>1</ParkingIncluded> <InternetIncluded>1</InternetIncluded> </PackageData> </PropertyDataSet> <Result> <!-- Note: By default, the top level result price should be the cheapest price available for a minimum of 2 occupants. --> <Property>180054</Property> <Checkin>2017-10-07</Checkin> <Nights>2</Nights> <!-- Any attribute below won't be inherited by bundles or baserates --> <Baserate currency="USD">199.99</Baserate> <Tax currency="USD">25.12</Tax> <OtherFees currency="USD">2.00</OtherFees> <Occupancy>2</Occupancy> <OccupancyDetails> <NumAdults>2</NumAdults> </OccupancyDetails> <!-- Efficient method of defining Room Bundles --> <!-- Part 2: Reference RoomData and PackageData through ID --> <!-- Baserate and attributes must match at least one room bundle below --> <!-- Base Room Bundle --> <RoomBundle> <RoomID>060773</RoomID> <PackageID>P54321</PackageID> <!-- Price for 2 ("occupancy") is repeated and matches the Baserate and attributes provided above --> <Baserate currency="USD">199.99</Baserate> <Tax currency="USD">25.12</Tax> <OtherFees currency="USD">2.00</OtherFees> </RoomBundle> <!-- Premium Room Bundle --> <RoomBundle> <RoomID>436233</RoomID> <PackageID>P12345</PackageID> <!-- Price for 4 ("occupancy"), any eligible room bundle with 2 or more occupancy will be displayed --> <Baserate currency="USD">298.88</Baserate> <Tax currency="USD">42.12</Tax> <OtherFees currency="USD">10.00</OtherFees> </RoomBundle> <!-- Continue providing all available RoomBundle rates under matched property for 2 or more occupancies --> </Result> </Transaction>
Comparing occupancy and capacity
When defining Room Bundles, you must understand the difference between occupancy and capacity:
- Occupancy is the number of guests that a Room Bundle is intended to
apply to. For example, the "Honeymoon Package" has an occupancy of two.
You set the value of a package's occupancy by using the
- Capacity is the maximum number of people that a room can physically
accommodate. The capacity of a room is always equal to or higher than the occupancy.
For example, the "Honeymoon Suite" in your hotel has a maximum capacity of six people,
but you price a bundle for two guests. You set the value of a package's capacity by
When pricing a Room Bundle, you must give the price for the number of guests
that the bundle is intended to be for (the value specified in the bundle's
<Occupancy> element). If
set to two, then the price in that package must be for two people. You cannot
<Occupancy> to four guests, and set the bundle's price
for two guests.
Pricing shared rooms
You also use Occupancy and Capacity in Room Bundles to set prices for shared
room (e.g., hostel) accommodations. For example, to set a per person price for a
dorm room that has 8 beds, you would set Occupancy to
8, and identify it as such in the
<RoomData> name. See example.
Updating Room Bundles
This section describes how to remove a Room Bundle that is no longer available and how to update the price of an existing Room Bundle.
Removing a Room Bundle
Room Bundles are different from hotel prices in the way that you remove them.
To remove a room/itinerary combination from inventory, you set the
remove a Room Bundle for a given room/itinerary, remove the
<RoomBundle> element from the
<Result> block in the Transaction
Room Bundles in your data feeds are considered a set, which number anywhere from 0 to tens of them. When you send Room Bundles to Google, you send the current, complete set. You do not change values of an individual Room Bundle to mark a previously-available one as unavailable. Whatever set of bundles is in the most recent Transaction message replaces the current set.
For example, there are bundles A, B, C, and D. You first send a message that defines the set of room bundles A, B, C and D. Later, if bundle B sells out, you re-send the entire set with bundles A, C, and D only. If all Room Bundles have sold out, send an empty set of Room Bundles.
Changing Room Bundle prices
To change the price of a Room Bundle, set the new
<Baserate> in the
Every time you update a room/itinerary's
<Result> block in
your Transaction messages, you must include a complete set of
available Room Bundles for each
<Result>. Google replaces the existing
set of Room Bundles with the new set. If you do not include any Room Bundles in
<Result>, then Google removes all Room Bundles for that room/itinerary.
Updating Room Bundle metadata
You update Room Bundle metadata with a response to a
You respond to a Query message with a Transaction message that defines the room and package metadata for the specified hotels. For more information, see Query Messages.