Promotions

Requests

Syntax

The Promotions message uses the following syntax:
<?xml version="1.0" encoding="UTF-8"?>
<Promotions partner="partner_account_name"
            id="message_ID"
            timestamp="timestamp">
  <HotelPromotions hotel_id="HotelID" action="[overlay]">
    <Promotion id="PromotionID" action="[delete]">
      <RoomTypes>
        <RoomType id="RoomID_1"/>
        <RoomType id="RoomID_2"/>
      </RoomTypes>
      <RatePlans>
        <RatePlan id="PackageID_1"/>
        <RatePlan id="PackageID_2"/>
      </RatePlans>
      <BookingDates>
        <DateRange start="YYYY-MM-DD" end="YYYY-MM-DD" days_of_week="MTWHFSU_or_subset"/>
        <DateRange start="YYYY-MM-DD" end="YYYY-MM-DD" days_of_week="MTWHFSU_or_subset"/>
      </BookingDates>
      <CheckinDates>
        <DateRange start="YYYY-MM-DD" end="YYYY-MM-DD" days_of_week="MTWHFSU_or_subset"/>
      </CheckinDates>
      <CheckoutDates>
        <DateRange start="YYYY-MM-DD" end="YYYY-MM-DD" days_of_week="MTWHFSU_or_subset"/>
      </CheckoutDates>
      <BookingWindow min="integer" max="integer"/>
      <LengthOfStay min="integer" max="integer"/>
      <!-- Specify only one of percentage, fixed_amount, or fixed_amount_per_night;
           applied_nights is only used with percentage or fixed_amount_per_night -->
      <Discount percentage="float" fixed_amount="float" fixed_amount_per_night="float"
        applied_nights="integer_1_to_99"/>
      <MinimumAmount before_discount="integer"/>
      <Devices>
        <Device type="[desktop|tablet|mobile]"/>
      </Devices>
      <UserCountries>
        <Country code="country_code"/>
      </UserCountries>
    </Promotion>
  </HotelPromotions>
</Promotions>

Elements & Attributes

The Promotions message has the following elements and attributes:
Element / @Attribute Occurrences Type Description
Promotions 1 Complex element The root element of a promotions message.
Promotions / @partner 1 String The partner account for this message. This string value is the "Partner key" value listed on the Account settings page in Hotel Center.

Note: If you have a backend that provides feeds for multiple accounts, this value needs to match the ID attribute value specified in the <RequestorID> element of your <OTA_HotelRateAmountNotifRQ> and <OTA_HotelAvailNotifRQ> messages for the same account.

Promotions / @id 1 String A unique identifier for this request message. This value is returned in the response message. Allowed characters are a-z, A-Z, 0-9, _ (underscore), and - (dash).
Promotions / @timestamp 1 DateTime The creation date and time of this message.
Promotions / HotelPromotions 0..n HotelPromotions Promotions for a property. Each promotion applies to a single property.
Promotions / HotelPromotions / @hotel_id 1 String The unique identifier for the property. This value must match the Hotel ID specified using <id> in the <listing> element in the Hotel List Feed. The Hotel ID is also listed in Hotel Center.
Promotions / HotelPromotions / @action 0..1 Enum

If specified, the value must be "overlay". When the value is overlay, all stored promotions are deleted prior to storing the promotions specified in the current message.

If not specified, then each promotion specified in the current message is either:

  • Added (if none of the stored promotions has the same id)
  • Updated (if a stored promotion has the same id)
  • Deleted (if a stored promotion has the same id and the value of the action attribute for the promotion specified in the current message is "delete")
Promotions / HotelPromotions / Promotion 0..10 Promotion

A single promotion for a property. Note that if action="overlay" and a <Promotion> is not specified, all promotions for the property are deleted.

Note: If you need to use more than ten promotions, contact your Technical Account Manager (TAM).

Promotions / HotelPromotions / Promotion / @id 1 String A unique identifier for the promotion. The maximum number of characters allowed is 40. Allowed characters are a-z, A-Z, 0-9, _ (underscore), - (dash), and . (period).
Promotions /HotelPromotions / Promotion / @action 0..1 Enum

If specified, the value must be "delete". If not specified and a promotion with the same id isn't stored, then this promotion is stored. Otherwise, if not specified and a promotion with the same id is stored, then the existing promotion is updated.

If "delete" is specified, the stored promotion with the same id is deleted. When using "delete", don't include any child elements in <Promotion>. Also, "delete" is not allowed in conjunction with <HotelPromotions action="overlay"/>.

Promotions / HotelPromotions / Promotion / RoomTypes 0..1 RoomTypes Container for a list of room types to which the promotion applies. The promotion is applied to each <RoomType> specified. If <RoomTypes> isn't specified, the promotion applies to all rooms.
Promotions / HotelPromotions / Promotion / RoomTypes / RoomType 1..n RoomType Specifies a room type. A room type is defined in a <RoomData> element in a Transaction (Property Data) message and is referenced using its <RoomID> value. (Its <RoomID> value is also referenced by the InvTypeCode attribute in OTA_HotelRateAmountNotifRQ messages.)
Promotions / HotelPromotions / Promotion / RoomTypes / RoomType / @id 1 String The unique identifier for the inventory (room type). This value maps to <RoomID> in a Transaction (Property Data) message. The maximum number of characters allowed is 50.
Promotions / HotelPromotions / Promotion / RatePlans 0..1 RatePlans Container for a list of rate plans to which the promotion applies. If <RatePlans> isn't specified, the promotion applies to all rate plans.
Promotions / HotelPromotions / Promotion / RatePlans / RatePlan 1..n RatePlan Specifies a rate plan. A rate plan is defined by a combination of package, rates, and availability, as defined in Transaction (Property Data), OTA_HotelRateAmountNotifRQ, and OTA_HotelAvailNotifRQ messages, and as identified by the PackageID.
Promotions / HotelPromotions / Promotion / RatePlans / RatePlan / @id 1 String The unique identifier for the rate plan. This value maps to the PackageID value in <PackageData> in a Transaction (Property Data) message, and in the RatePlanCode attribute in <StatusApplicationControl> in both <OTA_HotelRateAmountNotifRQ> and <OTA_HotelAvailNotifRQ> messages. The maximum number of characters allowed is 50.
Promotions / HotelPromotions / Promotion / BookingDates 0..1 BookingDates A container for one or more date ranges that define when booking must occur in order for the promotion to be applied.
Promotions / HotelPromotions / Promotion / BookingDates / DateRange 1..99 DateRange A date range specifying when booking must occur for the promotion to be applied.
Promotions / HotelPromotions / Promotion / BookingDates / DateRange / @start 0..1 Date The starting date (based on the property's time zone), inclusive, of the date range. This date must be before, or the same as, the end date. If start isn't specified, the date range is effectively unlimited in terms of a start date.
Promotions / HotelPromotions / Promotion / BookingDates / DateRange / @end 0..1 Date The ending date (based on the property's time zone), inclusive, of the date range. This date must be the same as, or after, the start date. If end isn't specified, the date range is effectively unlimited in terms of an end date.
Promotions / HotelPromotions / Promotion / BookingDates / DateRange / @days_of_week 0..1 String

The days of the week that are allowed in the date range. If not specified, all days are allowed in the date range. Each character in the string specifies a day. For example, "MTWHF" specifies that weekdays are allowed in the date range.

Valid characters are:

  • M for Monday
  • T for Tuesday
  • W for Wednesday
  • H for Thursday
  • F for Friday
  • S for Saturday
  • U for Sunday

Any character combination is valid.

Promotions / HotelPromotions / Promotion / CheckinDates 0..1 CheckinDates A container for one or more date ranges that define when check-in must occur for the promotion to be applied.
Promotions / HotelPromotions / Promotion / CheckinDates / DateRange 1..20 DateRange A date range specifying when check-in must occur for the promotion to be applied. This element is not required if you're deleting one or more promotions.
Promotions / HotelPromotions / Promotion / CheckinDates / DateRange / @start 0..1 Date The starting date (based on the property's time zone), inclusive, of the date range. This date must be before, or the same as, the end date. If start isn't specified, the date range is effectively unlimited in terms of a start date.
Promotions / HotelPromotions / Promotion / CheckinDates / DateRange / @end 0..1 Date The ending date (based on the property's time zone), inclusive, of the date range. This date must be the same as, or after, the start date. If end isn't specified, the date range is effectively unlimited in terms of an end date.
Promotions / HotelPromotions / Promotion / CheckinDates / DateRange / @days_of_week 0..1 String

The days of the week that are allowed in the date range. If not specified, all days are allowed in the date range. Each character in the string specifies a day. For example, "MTWHF" specifies that weekdays are allowed in the date range.

Valid characters are:

  • M for Monday
  • T for Tuesday
  • W for Wednesday
  • H for Thursday
  • F for Friday
  • S for Saturday
  • U for Sunday

Any character combination is valid.

Promotions / HotelPromotions / Promotion / CheckoutDates 0..1 CheckoutDates A container for one or more date ranges that define when check-out must occur for the promotion to be applied.
Promotions / HotelPromotions / Promotion / CheckoutDates / DateRange 1..20 DateRange A date range specifying when check-out must occur for the promotion to be applied. This element is not required if you're deleting one or more promotions.
Promotions / HotelPromotions / Promotion / CheckoutDates / DateRange / @start 0..1 Date The starting date (based on the property's time zone), inclusive, of the date range. This date must be before, or the same as, the end date. If start isn't specified, the date range is effectively unlimited in terms of a start date.
Promotions / HotelPromotions / Promotion / CheckoutDates / DateRange / @end 0..1 Date The ending date (based on the property's time zone), inclusive, of the date range. This date must be the same as, or after, the start date. If end isn't specified, the date range is effectively unlimited in terms of an end date.
Promotions / HotelPromotions / Promotion / CheckoutDates / DateRange / @days_of_week 0..1 String

The days of the week that are allowed in the date range. If not specified, all days are allowed in the date range. Each character in the string specifies a day. For example, "MTWHF" specifies that weekdays are allowed in the date range.

Valid characters are:

  • M for Monday
  • T for Tuesday
  • W for Wednesday
  • H for Thursday
  • F for Friday
  • S for Saturday
  • U for Sunday

Any character combination is valid.

Promotions / HotelPromotions / Promotion / BookingWindow 0..1 BookingWindow Specifies the time period when booking must occur relative to the check-in date (based on the property's time zone). For example, the booking window can be set to least 7 days, but not more than 180 days, prior to check-in.
Promotions / HotelPromotions / Promotion / BookingWindow / @min 0..1 Integer The minimum number of days prior to check-in when booking must occur for the promotion to be applied. If this isn't specified, there is no minimum.
Promotions / HotelPromotions / Promotion / BookingWindow / @max 0..1 Integer The maximum number of days prior to check-in when booking must occur for the promotion to be applied. If this isn't specified, there is no maximum.
Promotions / HotelPromotions / Promotion / LengthOfStay 0..1 LengthOfStay Defines length of stay limits within which this promotion can be applied. The promotion is not applied when length of stay is outside of the min and max limits.
Promotions / HotelPromotions / Promotion / LengthOfStay / @min 0..1 Integer The minimum nights allowed in the stay for the promotion to be applied. If this isn't specified, there is no minimum.
Promotions / HotelPromotions / Promotion / LengthOfStay / @max 0..1 Integer The maximum nights allowed in the stay for the promotion to be applied. If this isn't specified, there is no maximum.
Promotions / HotelPromotions / Promotion / Discount 1 Discount Specifies the discount to be applied for this promotion.
Promotions / HotelPromotions / Promotion / Discount / @percentage 0..1 Float Note: exactly one of percentage, fixed_amount, or fixed_amount_per_night is required.

A decimal value from 0-100 which specifies the percentage discount. It is applied to AmountAfterTax (or AmountBeforeTax if AmountAfterTax isn't specified).

Examples:

  • If AmountAfterTax is 100 and percentage is 20, then

    promotion rate = AmountAfterTax * (1 - percentage discount)

    80.00 = 100 * (1 - 0.2)

  • If AmountBeforeTax is 100, percentage is 20 and TaxFeeInfo specifies a tax of 10, then

    promotion rate = AmountBeforeTax * (1 - percentage discount) + tax

    90.00 = 100 * (1 - 0.2) + 10

Promotions / HotelPromotions / Promotion / Discount / @fixed_amount 0..1 Float Note: exactly one of percentage, fixed_amount, or fixed_amount_per_night is required.

A fixed amount to be subtracted from the sum of the AmountAfterTax nightly rates (or sum of AmountBeforeTax nightly rates if AmountAfterTax isn't specified). It is assumed to be in the same currency as nightly rates. If this is larger than the sum of nightly rates, the resulting value will be zero.

Examples:

  • If we're pricing a 1-night stay where AmountBeforeTax is 90, AmountAfterTax is 100, and fixed_amount is 20, then

    promotion rate = AmountAfterTax - fixed discount

    80.00 = 100 - 20

  • If we're pricing a 1-night stay where AmountBeforeTax is 100, fixed_amount is 20, and TaxFeeInfo specifies a tax of 8%, then

    promotion rate = (AmountBeforeTax - fixed discount) * (1 + percentage tax)

    86.40 = (100 - 20) * 1.08

  • If we're pricing a 1-night stay where AmountBeforeTax is 50, fixed_amount is 60, and TaxFeeInfo specifies a tax of 10, then

    promotion rate = (AmountBeforeTax - fixed discount) * tax

    10.00 = 0 + 10

  • If we're pricing a 3-night stay where the AmountAfterTax values are 100, 110, and 120; and fixed_amount is 150, then

    promotion rate = sum(AmountAfterTax) - (fixed discount)

    180.00 = (100 + 110 + 120) - 150

Promotions / HotelPromotions / Promotion / Discount / @fixed_amount_per_night 0..1 Float Note: exactly one of percentage, fixed_amount, or fixed_amount_per_night is required.

A fixed discount applied to each of the AmountAfterTax nightly rates (or the cheapest N if applied_nights is specified). If AmountAfterTax isn't specified, it is applied to AmountBeforeTax. It is assumed to be in the same currency as nightly rates. If fixed_amount_per_night is larger than a nightly rate, that nightly rate will be reduced to as zero—the discount cannot cause a nightly rate to become negative.

Examples:

  • If we're pricing a 3-night stay where the AmountAfterTax values are 100, 110, and 120; and the fixed_amount_per_night is 10, then

    promotion rate = sum(AmountBeforeTax - fixed amount discount)

    300.00 = ((100 - 10) + (110 - 10) + (120 - 10))

  • If we're pricing a 3-night stay where the AmountAfterTax values are 10, 50, and 100; and the fixed_amount_per_night is 20, then

    promotion rate = sum(AmountAfterTax - fixed amount discount)

    110.00 = (0 + (50 - 20) + (100 - 20))

Promotions / HotelPromotions / Promotion / Discount / @applied_nights 0..1 Integer Note: this should only be used with percentage or fixed_amount_per_night.

The number of nights to which the discount is applied, starting with the least expensive. Must be an integer from 1 to 99. If not specified, discount is applied to all nights.

Promotions / HotelPromotions / Promotion / MinimumAmount 0..1 MinimumAmount Specifies the minimum sum of the daily room rates (using the larger of AmountBeforeTax or AmountAfterTax) that must be exceeded for the promotion to be applied.
Promotions / HotelPromotions / Promotion / MinimumAmount / @before_discount 1 Integer The value that must be exceeded for the promotion to be applied.
Promotions / HotelPromotions / Promotion / Devices 0..1 Devices Container for listing the user devices that are eligible for the promotion. If specified, only eligible users on the listed devices are offered the discounted rate. If not specified, eligible users on any device are offered the discounted rate.
Promotions / HotelPromotions / Promotion / Devices / Device 1..3 Device Defines one type of user device that is eligible for the promotion.
Promotions / HotelPromotions / Promotion / Devices / Device / @type 1 Enum A type of device. The value must be desktop, tablet, or mobile.
Promotions / HotelPromotions / Promotion / UserCountries 0..1 UserCountries Container for listing the user locations (countries) that are eligible for the promotion. If specified, only eligible users in the listed countries are offered the discounted rate. If not specified, eligible users in any country are offered the discounted rate.
Promotions / HotelPromotions / Promotion / UserCountries / Country 1..50 Country Defines one country where users are eligible for the promotion.
Promotions / HotelPromotions / Promotion / UserCountries / Country / @code 1 String A CLDR country code, such as DE or FR. Note that, for some countries, the CLDR country code isn't the same as the 2-letter ISO country code. Also, CLDR region codes are not supported.

Examples

Basic message

The following example shows a basic Promotions message:

<?xml version="1.0" encoding="UTF-8"?>
<Promotions partner="account_xyz"
            id="123_abc"
            timestamp="2020-05-18T16:20:00-04:00">
  <HotelPromotions hotel_id="Property_1">
    <Promotion id="1">
      <RoomTypes>
         <RoomType id="123"/>
         <RoomType id="456"/>
      </RoomTypes>
      <RatePlans>
         <RatePlan id="234"/>
         <RatePlan id="567"/>
      </RatePlans>
      <BookingDates>
         <DateRange start="2020-07-01" end="2020-07-31" days_of_week="MTWHF"/>
         <DateRange start="2020-09-01" end="2020-09-30"/>
      </BookingDates>
      <CheckinDates>
         <DateRange start="2020-10-01" end="2020-10-31" days_of_week="FSU"/>
      </CheckinDates>
      <CheckoutDates>
         <DateRange start="2020-10-08" end="2020-11-07" days_of_week="FSU"/>
      </CheckoutDates>
      <BookingWindow min="7" max="330"/>
      <LengthOfStay min="2" max="14"/>
      <Discount percentage=".2" applied_nights="2"/>
      <Devices>
        <Device type="mobile"/>
        <Device type="tablet"/>
      </Devices>
      <UserCountries>
        <Country code="US"/>
        <Country code="UK"/>
      </UserCountries>
    </Promotion>
  </HotelPromotions>
</Promotions>

Delete one promotion

The following example shows how to delete one promotion for a property:

<?xml version="1.0" encoding="UTF-8"?>
<Promotions partner="account_xyz"
            id="123_abc"
            timestamp="2020-05-18T16:20:00-04:00">
  <HotelPromotions hotel_id="Property_1">
    <Promotion id="1" action="delete"/>
  </HotelPromotions>
</Promotions>

Delete all promotions

The following example shows how to delete all promotions for a property:

<?xml version="1.0" encoding="UTF-8"?>
<Promotions partner="account_xyz"
            id="123_abc"
            timestamp="2020-05-18T16:20:00-04:00">
  <HotelPromotions hotel_id="Property_1" action="overlay"/>
</Promotions>

Overlay all promotions

The following example shows how to overlay <HotelPromotions> for a property with one or more new promotions. When action="overlay", all stored promotions are deleted prior to storing the promotions specified in the current message:

<?xml version="1.0" encoding="UTF-8"?>
<Promotions partner="account_xyz"
            id="123_abc"
            timestamp="2020-05-18T16:20:00-04:00">
  <HotelPromotions hotel_id="Property_1" action="overlay"/>
    <Promotion id="1">
      <RoomTypes>
         <RoomType id="123"/>
         <RoomType id="456"/>
      </RoomTypes>
      <RatePlans>
         <RatePlan id="234"/>
         <RatePlan id="567"/>
      </RatePlans>
      <BookingDates>
         <DateRange start="2020-09-01" end="2020-09-30"/>
      </BookingDates>
      <Discount percentage=".1"/>
    </Promotion>
  </HotelPromotions>
</Promotions>

Responses

Syntax

The PromotionsResponse message uses the following syntax:
<?xml version="1.0" encoding="UTF-8"?>
<PromotionsResponse timestamp="timestamp"
                    id="message_ID"
                    partner="partner_account_name">
  <!-- Either Success or Issues will be populated. -->
  <Success/>
  <Issues>
    <Issue code="issue_code" status="issue_type">issue_description</Issue>
  </Issues>
</PromotionsResponse>

Elements & Attributes

The PromotionsResponse message has the following elements and attributes:
Element / @Attribute Occurrences Type Description
PromotionsResponse 1 Complex element The root element indicating the success or issues for a received Promotions request message.
PromotionsResponse / @timestamp 1 DateTime The creation date and time of this message.
PromotionsResponse / @id 1 String The unique identifier from the associated Promotions message.
PromotionsResponse / @partner 1 String The partner account for this message.
PromotionsResponse / Success 0..1 Success Indicates that the Promotions message was processed successfully without warnings, errors, or failures.

Either <Success> or <Issues> is present in each message.

PromotionsResponse / Issues 0..1 Issues A container for one or more issues encountered while processing the Promotions message.

Either <Success> or <Issues> is present in each message.

PromotionsResponse / Issues / Issue 1..n Issue The description of a warning, error, or failure encountered while processing the Promotions message. Details on these issues can be found in Feed Status Error Messages.
PromotionsResponse / Issues / Issue / @code 1 Integer The identifier for the issue.
PromotionsResponse / Issues / Issue / @status 1 Enum

The type of issue encountered.

Valid values are warning, error, and failure.

Examples

Success

The following is a response to a successfully processed Promotions message.

<?xml version="1.0" encoding="UTF-8"?>
<PromotionsResponse timestamp="2020-05-18T16:20:00-04:00"
                    id="12345678"
                    partner="partner_account_name">
  <Success/>
</PromotionsResponse>

Issues

The following is a response to a Promotions message not processed due to errors.

<?xml version="1.0" encoding="UTF-8"?>
<PromotionsResponse timestamp="2020-05-18T16:20:00-04:00"
                    id="12345678"
                    partner="partner_account_name">
  <Issues>
    <Issue code="1001" status="error">Example</Issue>
  </Issues>
</PromotionsResponse>