Dynamic Pricing Engine for Hotel Revenue Management
Built a demand-forecasting and dynamic pricing engine for a 200-property hotel chain, increasing RevPAR by 19% in six months.
The Challenge
A 200-property hotel chain was setting room rates manually using spreadsheets updated weekly by revenue managers. Rates were based on historical occupancy and competitor rack rates, with no consideration of local events, day-of-week demand patterns, or booking pace. Properties in high-demand markets were consistently underpriced during events, while properties in leisure markets were overpriced during shoulder seasons.
The revenue management team of 8 people could not effectively manage pricing across 200 properties and 15+ room types each. Rate changes took 24–48 hours to propagate through the channel manager to OTAs.
Our Approach
We built an automated dynamic pricing engine that forecasts demand and sets optimal rates for every property, room type, and date combination, with prices updating every 15 minutes.
Demand Forecasting: An XGBoost model predicts occupancy for each property and date, 90 days into the future. Features include historical booking curves (how many rooms were booked 90, 60, 30, 14, 7, 3, 1 days before arrival), local event calendars (scraped from Eventbrite, Ticketmaster, and convention centre websites), day-of-week and seasonality features, competitor pricing (scraped daily from OTA listings), and macroeconomic indicators (flight search volume to the destination, Google Trends for the city).
Price Optimisation: Given the demand forecast, a constrained optimisation model sets the rate that maximises expected revenue per available room (RevPAR). Constraints include minimum rate floors (to protect brand positioning), maximum rate ceilings, rate parity across channels, and length-of-stay pricing rules.
Integration: Optimised rates are pushed to the property management system (Oracle OPERA) and channel manager (SiteMinder) via API every 15 minutes. The system also generates rate recommendations for group and corporate bookings that revenue managers can accept or modify.
Results
| Metric | Before | After |
|---|---|---|
| RevPAR | Baseline | +19% |
| Rate update frequency | Weekly (manual) | Every 15 minutes |
| Revenue manager workload | 25 properties/person | 50+ properties/person |
| Event-driven rate capture | Missed ~40% of events | 95%+ event coverage |
| Rate parity violations | 12/month avg | < 1/month |