# Transaction (Property Data) Message

## Overview

The ARI Transaction (Property Data) message defines the information about each
property's room types and packages (or rate plans). Each room type data includes
a unique identifier (`RoomID`), localized name, description, and URLs to room
photos. Each package data includes a unique identifier (`PackageID`), localized
name, description, occupancy, and value-adds.

You can use a Transaction message to do the following:

- Define data for one or more properties.
- Define room type and package information for each property.
- Control product offerings.

Also, you can set actions to do the following:

- Add a room type and package to a property.

  > [!IMPORTANT]
  > **Key Point:** Room type has a limit of 3000 per property. Packages also has a separate limit of 3000 per property. You can use `<Transaction>` message to remove room types or packages.

- Remove a room type and package from a property.

- Add Loyalty points, a rewards program to a package or property.

For examples of transaction messages, see [Transaction (Property Data)
Examples](https://developers.google.com/hotels/hotel-prices/xml-reference/ari-property#property-data-examples).

### Required and optional elements

The [XML Reference](https://developers.google.com/hotels/hotel-prices/xml-reference/ari-overview)
provides descriptions of the required and optional elements. For details on
attributes and child elements, see [Transaction (Property Data) Elements \&
Attributes](https://developers.google.com/hotels/hotel-prices/xml-reference/ari-property#property-data-elements).

### Syntax and schemas

Use the [Transaction (Property Data)
Syntax](https://developers.google.com/hotels/hotel-prices/xml-reference/ari-property#property-data-syntax)
example as a reference when you create the Transaction message to ensure
you are following the correct format.

You can use a third-party XML tool such as xmllint to validate your feeds with
the published schemas before submitting them to Google. For the Transaction
message schema, see [Hotel Ads
schemas](https://developers.google.com/hotels/hotel-prices/dev-guide/schemas).

## Guidelines

Use the following guidelines for a Transaction message:

Actions:

:   `delta`: Use to add or update new room types and packages (rate plans).

:   `overlay`: Use to replace all room types and packages for a property with a
    new set. Must include information for all room types and rate plans that
    you still want to sell.

Language support:

:   Specify one to two languages (English, and a local language for the property
    if needed) for the Name, Description, and Caption fields. You can add more
    than two languages if needed.

Room types and packages:

:   When updating a room type or package, you must send all of the related
    information for that room type or package. For example, when you add a
    photo you must also include the name and description.

:   `<AllowablePackageIDs>` and `<AllowableRoomIDs>` are optional, and if unset,
    any combination of room type and rate plan can be made. You still have to
    send availability and rates with the room type and rate plan IDs. These
    elements let you control products as well as deactivate combinations your
    system no longer supports.

:   Send Google a Transaction message update whenever there is a change in room
    types or packages, or important details about room types or packages that
    need to be added.

    > [!NOTE]
    > **Note:** Because Google stores property data connected to a "matched" property, Google cannot accept this data until after the corresponding property has been "matched" in the system. Sending all of your properties in your list feed can help prevent later errors or delays.

Loyalty points:

:   To include or exclude the rewards program in your package, set up a Loyalty
    points configuration with Google. This will display the points earned that are
    associated with that package. Learn more about [Loyalty points](https://developers.google.com/hotels/hotel-prices/dev-guide/loyalty-points).

:   Use the `<MilesIncluded>` element to define or update your loyalty campaign.
    See [Transaction(Property Data)](https://developers.google.com/hotels/hotel-prices/xml-reference/ari-property#property-data-elements)
    for more information. Loyalty points can be included with `<PackageData>`.

## Example

This section provides a basic example of an ARI Transaction message using
required and optional elements. To add or update room types and packages, you
use an action for either `delta` to add or update room types and packages, or
`overlay` to replace all room type and package definitions (deletes old
entries).

You need to specify one to two languages (English, and a local language for the
property if needed) for the Name, Description, and Caption fields. Then, add
property data information, including links to photos.

For `<PropertyID>` and`<RoomID>`, use the same IDs you use within your system
for rate plans and room types (respectively). Consistency with your system is
critical for ensuring that Google is correctly displaying your prices and data.

> [!NOTE]
> **Note:** Google uses "ID" for the identifier for room type and package (rate plan); whereas, OTA XML uses "code". You must use your own IDs since Google does not generate them. For property data, room type and rate plan IDs need to be unique per property.

Once you prepare your file, you must send it to Google via a POST message
to the following endpoint: `https://www.google.com/travel/hotels/uploads/property_data`

To learn more about how to push/POST the message, see [Pushing
messages](https://developers.google.com/hotels/hotel-prices/dev-guide/ari-overview#pushing-messages).

The following example shows how to set the Transaction message using a `delta`
action:

    <?xml version="1.0" encoding="UTF-8"?>
    <Transaction timestamp="202X-XX-XXT00:00:00-0X:00" id="12345678" partner="partner_key">
      <PropertyDataSet action="delta">
        <Property>PROPERTYID</Property>
          <RoomData>
            <RoomID>ROOMID</RoomID>
            <Name><Text text="ROOM NAME" language="en"/></Name>
            <Description>
              <Text text="ROOM DESCRIPTION TEXT" language="en"/>
            </Description>
            <Capacity>4</Capacity>
            <PhotoURL>
              <Caption><Text text="ROOM PHOTO CAPTION TEXT" language="en"/></Caption>
              <URL>https://LINK TO PHOTO</URL>
            </PhotoURL>
          </RoomData>
          <PackageData>
            <PackageID>BASE</PackageID>
            <Name><Text text="Internet Special" language="en"/></Name>
            <Description><Text text="Direct Booking through Hotel Website" language="en"/></Description>
            <Refundable available="true" refundable_until_days="2" refundable_until_time="12:00"/>
          </PackageData>
      </PropertyDataSet>
    </Transaction>

For more examples, such as how to use the `overlay` action, add a room type
and package to existing property data, and remove existing room types and
packages, see [Transaction (Property Data)
Examples](https://developers.google.com/hotels/hotel-prices/xml-reference/ari-property#property-data-examples).

## How-tos

This section provides solutions to scenarios you might encounter while
sending Transaction messages.

### Scenario 1: How to remove room type data

#### How do I remove existing room type and/or package data?

#### Description

You have sent multiple room types, including King and Queen rooms, for the
property. All Queen room types are unavailable during a remodel and only King
room types are currently available.

#### Solution

- You don't need to update the nightly availability, rates, or inventory for the room type and package IDs that have been removed or deactivated.
- If the room type or package has been removed or deactivated, send a new Transaction message with `action="overlay"` which only includes the room types and packages that are still active and excludes the removed room type or package.

#### Sample

This XML snippet shows how to use the `overlay` action to remove a room type.

> [!NOTE]
> **Note:** Even though this sample covers room type, you can also use the same action to remove the package data.

Here is the original `delta` action which includes King and Queen room types:

      <PropertyDataSet action="delta">
        <Property>Property_1</Property>
        <RoomData>
          <RoomID>King</RoomID>
          <Name>
            <Text text="King" language="en"/>
          </Name>
          <Capacity>2</Capacity>
        </RoomData>
        <PackageData>
          <PackageID>Standard</PackageID>
          <Name>
            <Text text="Standard" language="en"/>
          </Name>
          <Description>
            <Text text="Standard rate" language="en"/>
          </Description>
          <Refundable available="true" refundable_until_days="7" refundable_until_time="18:00:00"/>
          <BreakfastIncluded>0</BreakfastIncluded>
          </PackageData>
        <RoomData>
          <RoomID>Queen</RoomID>
          <Name>
            <Text text="Queen" language="en"/>
          </Name>
          <Capacity>2</Capacity>
          <!-- Additional RoomData child elements omitted. -->
        </RoomData>
      </PropertyDataSet>

You can then set `overlay` to remove the Queen room type and keep the King
room type:

      <PropertyDataSet action="overlay">
        <Property>Property_1</Property>
        <RoomData>
          <RoomID>King</RoomID>
          <Name>
            <Text text="King" language="en"/>
          </Name>
          <Capacity>2</Capacity>
        </RoomData>
        <PackageData>
          <PackageID>Standard</PackageID>
          <Name>
            <Text text="Standard" language="en"/>
          </Name>
          <Description>
            <Text text="Standard rate" language="en"/>
          </Description>
          <Refundable available="true" refundable_until_days="7" refundable_until_time="18:00:00"/>
          <BreakfastIncluded>0</BreakfastIncluded>
        </PackageData>
      </PropertyDataSet>

### Scenario 2: How to control products using AllowablePackageIDs

#### How do I control products (combinations of room types and packages) when packages are grouped by room type?

> [!NOTE]
> **Note:** If your room types are grouped by packages, see [Scenario 3](https://developers.google.com/hotels/hotel-prices/dev-guide/ari-transaction-message#scenario3).

#### Description

You have certain packages that are only available to certain room types. For
example, if your property has four room types (including Presidential suite),
and six different packages, but only a few packages are eligible for the
presidential suite, you can specify eligibility.

#### Solution

Send an updated Transaction message that specifies which products are included
in the package using `<AllowablePackageIDs>`.

> [!NOTE]
> **Note:** Use either `<AllowablePackageIDs>` or `<AllowableRoomIDs>`, but not both, and the element you use depends on whether your system uses the hierarchy room\>package or package\>room. If neither of these elements are defined in the Transaction message, room types can be combined with any package.

#### Sample

This XML snippet shows how to use `<AllowablePackageIDs>` to specify packages
used with a certain room type. Here, the Penthouse suite room type allows only
the Penthouse all-inclusive package or the Free breakfast package while the
King suite room type allows only the King all-inclusive package or the
Pet friendly package.

    <RoomData>
      <RoomID>penthouse_suite</RoomID>
      <AllowablePackageIDs>
        <AllowablePackageID>penthouse_all_inclusive</AllowablePackageID>
        <AllowablePackageID>free_breakfast</AllowablePackageID>
      </AllowablePackageIDs>
      <!-- Additional child elements omitted. -->
    </RoomData>
    <RoomData>
      <RoomID>king_suite</RoomID>
      <AllowablePackageIDs>
        <AllowablePackageID>king_all_inclusive</AllowablePackageID>
        <AllowablePackageID>pet_friendly</AllowablePackageID>
      </AllowablePackageIDs>
      <!-- Additional child elements omitted. -->
    </RoomData>
    <PackageData>
      <PackageID>penthouse_all_inclusive</PackageID>
    </PackageData>
    <!-- Additional child elements omitted. -->
    <PackageData>
      <PackageID>free_breakfast</PackageID>
    </PackageData>
    <!-- Additional child elements omitted. -->
    <PackageData>
      <PackageID>king_all_inclusive</PackageID>
    </PackageData>
    <!-- Additional child elements omitted. -->
    <PackageData>
      <PackageID>pet_friendly</PackageID>
    </PackageData>

> [!NOTE]
> **Note:** If you use `<AllowablePackageIDs>` or `<AllowableRoomIDs>` to deactivate a combination which you may have previously used but is now disallowed in your system, you don't need to resend ARI for all dates just to remove the previous data.

### Scenario 3: How to control products using AllowableRoomIDs

#### How do I control products (combinations of room types and packages) when room types are grouped by package?

> [!NOTE]
> **Note:** If your packages are grouped by room type, see [Scenario 2](https://developers.google.com/hotels/hotel-prices/dev-guide/ari-transaction-message#scenario2).

#### Description

A room type and package combination is no longer sold as a product or you want
to control what is included in a new package. For example, you want to specify
only certain room types, such as King and Queen rooms with an ocean view, with
a package.

#### Solution

Send an updated Transaction message that specifies the exact products included
with the package using the `<AllowableRoomIDs>` element.

#### Sample

This XML snippet shows how to use `<AllowableRoomID>` to specify oceanview King
and Queen room types in the package.

    <PackageID>RO</PackageID>
    <AllowableRoomIDs>
      <AllowableRoomID>king_oceanview</AllowableRoomID>
      <AllowableRoomID>queen_oceanview</AllowableRoomID>
    </AllowableRoomIDs>