Rate Management

Rate management in OPERA Cloud involves setting and adjusting room rates to maximize revenue and occupancy. This includes creating rate plans, dynamic pricing adjustments, and retrieving best available rates and hurdle rates for optimized pricing.

Rate Structure in OPERA Cloud

OPERA Cloud rate structure is divided into Rate Class, Rate Category, and Rate Code. Rate categories are high-level classifications that group various rate codes into broader categories. They help in organizing and managing rates more effectively. Examples of Rate Categories could be Corporate, Leisure, and so on. Rate classes are more granular and specific classifications within the rate structure. They can be used to define specific characteristics or attributes of rates within a category. Examples of rate classes could be Negotiate, Wholesale, Discounted, and so on. You must define one or more rate classes and a rate class is then associated to each Rate Category. Rate classes can be used to query rates from OPERA Cloud. For more information on the complex Rate Structures in OPERA Cloud, refer to Configuring Rate Classes in the OPERA Cloud User Guide.

Figure 4-4 Rate Structure in OPERA Cloud


This image shows the OPERA Cloud rate structure, which consists of Rate Categories, Rate Classes, and Rate Code.

Hurdles in OPERA Cloud

Hurdle Rates represent the monetary hurdle value calculated by the revenue management solution after considering the information received from OPERA Cloud. This is the value that must be reached for OPERA Cloud to display a rate code/room type on the rate grid. For more information, refer to the Hurdle Rates topic in the OPERA Cloud User Guide.  

Use Cases

Use Case Description Operation
Retrieving Rate Plans for a property You can retrieve a list of rate plans for a specified property, including options to filter inactive rate plans and include detailed rate information. getRatePlans
Creating/Updating the Standard Rate Plan Schedules You can add and or/update standard rate plans for a specified property. You can add new standard rate plan schedules, including detailed rate information and options to define specific attributes for each schedule. By dynamically adjusting room rates based on factors like demand, occupancy, and market conditions, rate plan schedules help optimize revenue and ensure competitive pricing. postRatePlanSchedules
Creating/Updating the Daily Rate Plan Schedules You can add and/or update the rate price schedule to existing OPERA Daily Rate plans. Rate Plan Schedules can dynamically adjust room rates based on various factors, such as demand, occupancy, and market conditions. This helps in optimizing revenue and maintaining competitive pricing. startSetDailyRatePlanSchedulesProcess
Creating/Updating the Best Available Rate Plans You can create/update the Best Available Rate Plans by Length of Stay or by Day by posting them to OPERA Cloud. This helps in dynamically offering the most competitive and optimized pricing to guests based on their intended stay duration. startSetBestAvailableRatePlansProcess
Creating Hurdle Rates Hurdle Rates represent the monetary hurdle value calculated by the revenue management solution after considering the information received from OPERA Cloud. You can create Hurdle Rates by posting them to OPERA Cloud. This can help in managing revenue by setting pricing thresholds that prevent underselling during high demand periods. startHurdleRatesProcess

Figure 4-5 Rate Management Workflow


This image shows the workflow for rate management in OPERA Cloud.

1. Retrieving Rate Plans for a property

The synchronous operation getRatePlans in OPERA Cloud allows users to retrieve a list of rate plans for a specified property. This operation includes options to filter the rate plans based on active/inactive status and to include rate information if required. This is essential for revenue management systems (RMS) to analyze and manage different pricing strategies and packages offered by the hotel.

Business Logic Comments
Retrieving Rate Plans for a property

You can retrieve the rate plans information based on the following parameters:

  • hotelId: Specifies the hotel for which rate plans are being queried.
  • includeRateInformation: Boolean flag to specify whether to include detailed rate information in the response.
  • includeInactive: Boolean flag to specify whether to include inactive rate plans in the response.
  • offset: An integer parameter to specify the offset for pagination.
Key response data elements

The key response data elements include:

  • ratePlanCode: Code identifying the specific rate plan.
  • description: Description of the rate plan.
  • startDate: The date from which the rate plan is applicable.
  • endDate: The date until which the rate plan is applicable.
  • status: Status of the rate plan (that is, Active, Inactive).
  • rateDetails: Detailed rate information is returned if the includeRateInformation is set to true which includes the following:
    • onePersonRate: Rate for one person.
    • twoPersonRate: Rate for two persons.
    • threePersonRate: Rate for three persons.
    • fourPersonRate: Rate for four persons.
    • extraPersonRate: Rate for each additional person.
    • extraChildRate: Rate for each additional child.
    • rateByAgeBuckets: Rates applicable based on the age of guests, provided as an array.
    • minimumChildrenForFreeStay: Minimum number of children allowed to stay for free.
    • pointsRequired: Points required for the rate plan if applicable.
    • overrideFloorAmount: Boolean indicating if the floor amount should be overridden.
Sample API request/response

getRatePlans

Endpoint:

GET {{HostName}}/rtp/v1/ratePlans?includeRateInformation=false&includeInactive=true&offset=0&sellDate=2023-06-03&hotelId={{HotelId}}Sample Successful (200 OK) Response:
{
    "ratePlanShortInfoList": {
        "ratePlanShortInfo": [
            {           
                "primaryDetails": {
                    "description": {
                        "defaultText": "Corporate Saver BAR"
                    },
                    "startSellDate": "2018-10-10",
                    "endSellDate": "2049-12-31",
                    "sellSequence": 361,
                    "privilegedRate": false,
                    "privilegedRateRestriction": false,
                    "lockStatus": "Unlocked"
                },
                "classifications": {
                    "rateCategory": "BAR",
                    "marketCode": "CV"
                },
                "hotelId": "SH765",
                "ratePlanCode": "NCS6B",
                "discountAllowed": true
            }
        ],
        "hasMore": true,
        "totalResults": 1,
        "offset": 20,
        "limit": 20,
        "totalPages":
    },
    "masterInfoList": [
        {
            "codeInfo": [
                {
                    "description": "Special Rates",
                    "code": "SPECIAL"
                }
            ],
            "codeType": "DisplaySet"
        }
    ]
}

2. Creating/Updating the Standard Rate Plan Schedules using postRatePlanSchedules

Standard Pricing Schedules in OPERA Cloud enable you to manage daily rates for each room type on a daily basis. You can also select one or more package items for a pricing schedule if it is required for offering a special entitlement for specific room types / date ranges only. For example, you might wish to include Champagne in the rate only for the Executive Suite; the package item is then added at the pricing schedule level and not for the entire rate code (all room types).

The synchronous operation postRatePlanSchedules is used to set or update standard daily rate plan schedules for a specified date range. This information includes rate amounts for different occupancy levels, room types, and special conditions.

Business Logic Comments
Posting the standard rate plan schedules

You can set or update the standard rate plan schedules using specific parameters for a given date range:

  • hotelId: Specifies the hotel for which rate plans are being set.
  • ratePlanCode: Code identifying the specific rate plan.
  • rateDate: The date for which the rate is applicable.
  • roomType: The type of room to which the rate applies.

The rate plan schedule can be posted with the following details:

  • onePersonRate: Rate for one person.
  • twoPersonRate: Rate for two persons.
  • threePersonRate: Rate for three persons.
  • fourPersonRate: Rate for four persons.
  • fivePersonRate: Rate for five persons.
  • extraPersonRate: Rate for each additional person.
  • extraChildRate: Rate for each additional child.
  • oneChildRate: Rate for one child.
  • twoChildrenRate: Rate for two children.
  • threeChildrenRate: Rate for three children.
  • fourChildrenRate: Rate for four children.
  • rateByAgeBuckets: Rates applicable based on the age of guests.
  • minimumChildrenForFreeStay: Minimum number of children allowed to stay for free.
  • pointsRequired: Points required for the rate plan.
  • overrideFloorAmount: Boolean indicating if the floor amount should be overridden.
Key Considerations
  • The hotelId parameter is crucial to specify which hotel's rate plans are being set or updated.
  • Clearly define the rateDate for which the rates are applicable to avoid overlaps and gaps in the rate plans.
  • Use accurate ratePlanCode and roomType to ensure the rates are applied correctly.
  • Clearly specify rate amounts for different occupancy levels (for example, onePersonRate, twoPersonRate) and additional charges (for example, extraPersonRate, extraChildRate).
  • Use the overrideFloorAmount flag carefully to prevent unintended rate overrides.
  • Set appropriate rateByAgeBuckets to cater to different age groups, ensuring correct rate applications for children and additional guests.
  • Define the minimumChildrenForFreeStay accurately to align with promotional offers and policies.
  • Include pointsRequired for loyalty programs to maintain consistency with guest rewards.
Validation Validate the applied standard rate plan schedules through the RMS to ensure they match the intended configurations.
Sample API request/response

postRatePlansSchedules

Endpoint:

GET {{HostName}}/rtp/v1/ratePlans?includeRateInformation=false&includeInactive=true&offset=0&sellDate=2023-06-03&hotelId={{HotelId}}Endpoint:
POST {{HostName}}/rtp/v1/hotels/{{HotelId}}/ratePlans


Request Body:
{
    "ratePlan": {
        "primaryDetails": {
            "description": {
                "defaultText": "Rate Code Description Goes Here test"
            },
            "startSellDate": "2023-05-03",
            "endSellDate": "2023-12-31",
            "privilegedRate": false,
            "privilegedRateRestriction": false,
            "lockStatus": "Unlocked"
        },
        "classifications": {
            "rateCategory": "HOTEL",
            "marketCode": "LEISURE"
        },
        "transactionDetails": {
            "folioText": {
                "defaultText": "Accommodation"
            },
            "transactionCode": "1000",
            "currencyCode": "USD",
            "rateIncludesTax": true
        },
        "rateCommission": {},
        "roomTypeList": [
            {
                "code": "ECO"
            },
            {
                "code": "SGL"
            },
            {
                "code": "DBL"
            },
            {
                "code": "SUP"
            },
            {
                "code": "JSUI"
            },
            {
                "code": "SUI"
            }
        ],
        "ratePackages": {
            "packages": [],
            "packageGroups": []
        },
        "controls": {
            "sell": {
                "minimumStayThrough": "1",
                "minimumLengthOfStay": "1"
            },
            "yield": {
                "yieldable": "NonYieldable"
            }
        },
        "distribution": {
            "restrictionUpdate": false,
            "rateUpdate": false,
            "myFidelioUploadAllowed": false,
            "channelRateMappingExists": false,
            "channelAllowed": false
        },
        "ratePlanBasedOnRates": [
            {
                "basedOnRatePlanType": "None"
            }
        ],
        "approvalNotes": [
            {}
        ],
        "mobileCheckinAllowed": false,
        "mobileCheckoutAllowed": false,
        "hotelId": "{{HotelId}}",
        "ratePlanCode": "TEST99",
        "supressRate": false,
        "printRate": true,
        "discountAllowed": false,
        "redemption": false,
        "bARRate": false,
        "daily": false,
        "tiered": false,
        "dayUse": false,
        "dayType": false,
        "complimentary": false,
        "houseUse": false,
        "negotiated": false,
        "ownerRate": false,
        "membershipEligible": true,
        "advancedDailyBase": false,
        "advancedDailyRate": false
    }
}

Sample Successful Response:

201 Created<The Standard Rate Plan Schedules are posted in OPERA Cloud>

3. Creating/Updating the Daily Rate Plan Schedules using startSetDailyRatePlanSchedulesProcess

Daily rates are identified by the Rate Category of Daily. The asynchronous operation startSetDailyRatePlanSchedulesProcess is used to set or update daily rate plan schedules for a specified date range. This information includes rate amounts for different occupancy levels, room types, and special conditions. The data is essential for implementing dynamic pricing strategies, ensuring competitive rates, and optimizing revenue. It can be utilized for operational planning, revenue forecasting, and detailed rate management reporting.

Business Logic Comments
Posting the daily rate plan schedules

The daily rate plan schedules can be requested using specific parameters to set or update the rate plan schedules for a specified date range:

  • hotelId: Specifies the hotel for which rate plans are being set.
  • ratePlanCode: Code identifying the specific rate plan.
  • rateDate: The date for which the rate is applicable.
  • roomType: The type of room to which the rate applies.

You can send the specific rate plan schedule to be posted with the following information:

  • onePersonRate: Rate for one person.
  • twoPersonRate: Rate for two persons.
  • threePersonRate: Rate for three persons.
  • fourPersonRate: Rate for four persons.
  • fivePersonRate: Rate for five persons.
  • extraPersonRate: Rate for each additional person.
  • extraChildRate: Rate for each additional child.
  • oneChildRate: Rate for one child.
  • twoChildrenRate: Rate for two children.
  • threeChildrenRate: Rate for three children.
  • fourChildrenRate: Rate for four children.
  • rateByAgeBuckets: Rates applicable based on the age of guests.
  • minimumChildrenForFreeStay: Minimum number of children allowed to stay for free.
  • pointsRequired: Points required for the rate plan.
  • overrideFloorAmount: Boolean to indicate if the floor amount should be overridden.
Key Considerations
  • The hotelId parameter is essential to identify which hotel's rate plans are being set or updated.
  • Specify the exact rateDate for which the rates are applicable to avoid overlaps and gaps in the rate plans.
  • Use precise ratePlanCode and roomType to ensure the rates are applied correctly.
  • Clearly define rate amounts for different occupancy levels (for example, onePersonRate, twoPersonRate) and additional charges (for example, extraPersonRate, extraChildRate).
  • Use the overrideFloorAmount flag judiciously to prevent unintended rate overrides.
  • Set appropriate rateByAgeBuckets to cater to different age groups, ensuring correct rate applications for children and additional guests.
  • Define the minimumChildrenForFreeStay accurately to align with promotional offers and policies.
  • Include pointsRequired for loyalty programs to maintain consistency with guest rewards.
Validation Validate the applied daily rate plan schedules through the RMS to ensure they match the intended configurations.
Sample API request/response

1. startSetDailyRatePlanSchedulesProcess

Endpoint:

POST {{HostName}}/rtp/async/v1/externalSystems/{{ExtSystemCode}}/hotels/{{HotelId}}/ratePlans/dailySchedules

Request Body:

{
"dailyRatePlanSchedule": [
{
"rateAmounts": {
"onePersonRate": 1005,
"twoPersonRate": 1500,
"threePersonRate": 0,
"fourPersonRate": 0,
"fivePersonRate": 0,
"extraPersonRate": 0,
"extraChildRate": 0,
"oneChildRate": 0,
"twoChildrenRate": 0,
"threeChildrenRate": 0,
"fourChildrenRate": 0,
"rateByAgeBuckets": [
{
"rateAmount": 0,
"minimumAge": 0,
"maximumAge": 0
}
],
"minimumChildrenForFreeStay": 0,
"pointsRequired": 0,
"overrideFloorAmount": true
},
"rateDate": "2023-11-07",
"ratePlanCode": "ADELR",
"roomType": "QE"
}
]
}


Sample Successful Response:

202 Accepted

2. getDailyRatePlanSchedulesProcessStatus

HEAD {{HostName}}/rtp/async/v1/externalSystems/{{ExtSystemCode}}/hotels/{{HotelId}}/ratePlans/dailySchedules/{{RequestId1}}


Sample Successful Response:

201 Created
(You are ready to proceed to Step 3)

3. getDailyRatePlanSchedules

Endpoint:

GET  {{HostName}}/rtp/async/v1/externalSystems/{{ExtSystemCode}}/hotels/{{HotelId}}/ratePlans/dailySchedules/{{RequestId2}}


Sample Successful Response:

200 OK
<The Daily Rate Plan Schedules are posted to OPERA Cloud.>

4. Creating/Updating the Best Available Rate Plans using startSetBestAvailableRatePlansProcess

The asynchronous operation startSetBestAvailableRatePlansProcess can be used to set or update the best available rate plans for specified lengths of stay (LOS). This information includes rate plan codes and applicable dates, which are crucial for offering competitive and optimized pricing to guests. The data can be utilized for dynamic pricing adjustments, enhancing revenue management strategies, and ensuring that the most attractive rates are available for different stay durations.

Business Logic Comments
Posting the best available rate plans

The best available rate plans can be set using specific parameters to determine the most competitive rates for specified lengths of stay (LOS):

  • hotelId: Specifies the hotel for which rate plans are being set.

You can send the specific rate plan schedule to be posted with the following information:

  • ratePlanCodes: An array of rate plan codes to be considered for the best available rate.
  • rateDate: The date for which the best available rate is to be determined.
  • lOS1 to lOS8: Flags indicating the length of stay restrictions for 1 to 8 nights.
Key Considerations
  • The hotelId parameter is essential to identify which hotel's best available rate plans are being set or updated.
  • Specify the exact rateDate for which the best available rates are to be determined to avoid overlaps and gaps in the rate plans.
  • Include relevant ratePlanCodes to ensure the rates are derived from the correct rate plans, providing accurate and competitive pricing.
  • Set the LOS flags (los1 to los8) judiciously to ensure the best available rates are fetched for the intended lengths of stay, avoiding unnecessary data retrieval.
  • Ensure rate plan codes in the ratePlanCodes array are valid and currently active to prevent errors in rate retrieval.
Validation Validate the applied best available rate plans through the RMS to ensure they match the intended configurations.
Sample API request/response

1. startSetBestAvailableRatePlansProcess

startSetBestAvailableRatePlansProcess

Endpoint:

POST {{HostName}}/rtp/async/v1/externalSystems/{{ExtSystemCode}}/hotels/{{HotelId}}/ratePlans/bestAvailableLOS


Sample Request cURL:
{
"bestAvailableRatePlans": [
{
"ratePlanCodes": [
"string"
],
"rateDate": "2023-11-10",
"los1": true,
"los2": false,
"los3": false,
"los4": false,
"los5": false,
"los6": false,
"los7": false,
"los8": false
}
]
}


Sample Successful Response:

202 Accepted

2. getBestAvailableRatePlansProcessStatus



Endpoint:

HEAD {{HostName}}/rtp/async/v1/externalSystems/{{ExtSystemCode}}/hotels/{{HotelId}}/ratePlans/bestAvailableLOS/{{RequestId1}}


Sample Request cURL:

 curl --location '{{HostName}}/rtp/async/v1/externalSystems/{{ExtSystemCode}}/hotels/{{HotelId}}/ratePlans/bestAvailableLOS/{{RequestId1}}' \
--header 'Content-Type: application/json' \
--header 'x-hotelId: {{HotelId}}' \
--header 'x-app-key: {{AppKey}}' \
--header 'Authorization: Bearer {{Token}}' \
--data ''


Sample Successful Response:

201 Created
(You are ready to proceed to Step 3)

3. getBestAvailableRatePlans

Endpoint:

GET {{HostName}}/rtp/async/v1/externalSystems/{{ExtSystemCode}}/hotels/{{HotelId}}/ratePlans/bestAvailableLOS/{{RequestId2}}

Sample Request cURL:

 curl --location '{{HostName}}/rtp/async/v1/externalSystems/{{ExtSystemCode}}/hotels/{{HotelId}}/ratePlans/bestAvailableLOS/{{RequestId2}}' \
--header 'Content-Type: application/json' \
--header 'x-hotelId: {{HotelId}}' \
--header 'x-app-key: {{AppKey}}' \
--header 'Authorization: Bearer {{Token}}' \
--data ''


Sample Successful Response:

200 OK
<The Best Available Rate Plans are posted to OPERA Cloud.>

5. Creating Hurdle Rates using startHurdleRatesProcess

The asynchronous operation startHurdleRatesProcess is used to set or update hurdle rates for a property. This information is crucial for maintaining pricing integrity, maximizing revenue, and strategically managing room availability. The data can be utilized for revenue management, demand forecasting, and operational planning.

  Comments
Posting the hurdle rates

The hurdle rates can be set using specific parameters to establish the minimum acceptable rates for room bookings:

  • hotelId: Specifies the hotel for which hurdle rates are being set.

You can send the specific hurdle rate details to be posted with the following information:

  • hurdleDate: The date for which the hurdle rate is to be applied.
  • roomType: The type of room to which the hurdle rate applies.
  • roomCategory: The category of the room.
  • yieldCategory: The yield category for revenue management.
  • lengthOfStay: The length of stay for which the hurdle rate applies.
  • yieldMarketCode: The market code used for yield management.
  • hurdle: The minimum rate that can be accepted.
  • delta: The difference amount to adjust the hurdle rate.
  • ceiling: The maximum rate that can be charged.
  • maximumSolds: The maximum number of rooms to be sold at this rate.
  • roomsSold: The number of rooms already sold at this rate.
  • override: A flag indicating if the hurdle rate should override existing rates.
Key Considerations
  • Specify the exact hurdleDate for which the hurdle rates are to be applied to avoid overlaps and gaps in the rate plans.
  • Include relevant roomType and roomCategory to ensure the rates are applied to the correct room configurations, providing accurate pricing.
  • Set the lengthOfStay parameter accurately to ensure hurdle rates are applied correctly for the intended durations of stay.
  • Use yieldCategory and yieldMarketCode appropriately to align with the hotel's revenue management strategy and market segmentation.
  • Clearly define the hurdle and ceiling amounts to establish minimum and maximum acceptable rates, optimizing revenue.
  • Accurately set the maximumSolds and roomsSold parameters to manage inventory and ensure proper tracking of sold rooms.
  • Use the override flag judiciously to determine whether the hurdle rate should override existing rates, preventing unintended rate changes.
Validation Validate the applied hurdle rates through the RMS to ensure they align with the intended configurations and revenue strategies.
Sample API request/response

1. startHurdleRatesProcess

startHurdleRatesProcess
Endpoint:

POST {{HostName}}/rtp/async/v1/externalSystems/{{ExtSystemCode}}/hotels/{{HotelId}}/rates/hurdles

Sample Request cURL:

curl --location '{{HostName}}/rtp/async/v1/externalSystems/{{ExtSystemCode}}/hotels/{{HotelId}}/rates/hurdles' \
--header 'Content-Type: application/json' \
--header 'x-hotelId: {{HotelId}}' \
--header 'x-app-key: {{AppKey}}' \
--header 'Authorization: Bearer {{Token}}' \
--data '[
    {
        "hurdleDate": "2023-11-11",
        "roomType": "QE",
        "roomCategory": "S",
        "yieldCategory": "AEL",
        "lengthOfStay": 0,
        "yieldMarketCode": "COMP",
        "hurdle": 0,
        "delta": 0,
        "ceiling": 0,
        "maximumSolds": 0,
        "roomsSold": 0,
        "override": true
    }
]' 

Sample Successful Response:

202 Accepted

2. getHurdleRatesProcessStatus

getHurdleRatesProcessStatus

Endpoint:

HEAD {{HostName}}/rtp/async/v1/externalSystems/{{ExtSystemCode}}/hotels/{{HotelId}}/rates/hurdles/{{RequestId1}}


Sample Request cURL:
 Expand source


Sample Successful Response:

201 Created
(You are ready to proceed to Step 3)

3. getHurdleRates

getHurdleRates

Endpoint:

GET {{HostName}}/rtp/async/v1/externalSystems/{{ExtSystemCode}}/hotels/{{HotelId}}/rates/hurdles/{{RequestId2}}

Sample Request cURL:

 curl --location '{{HostName}}/rtp/async/v1/externalSystems/{{ExtSystemCode}}/hotels/{{HotelId}}/rates/hurdles/{{RequestId2}}' \
--header 'Content-Type: application/json' \
--header 'x-hotelId: {{HotelId}}' \
--header 'x-app-key: {{AppKey}}' \
--header 'Authorization: Bearer {{Token}}' \
--data ''


Sample Successful Response:

200 OK
<The Best Available Rate Plans are posted to OPERA Cloud.>