Minor Hotels Performance Intelligence Power BI Report

Minor Hotels: Performance Intelligence Report


About the Project

This Power BI report was built as part of a technical assessment for the Business Intelligence Analyst role at Minor Hotels, one of the world's largest hospitality groups operating across 56 countries.

The brief required building a multi-page interactive dashboard from raw hotel booking data, a Python script to fetch exchange rates, and full supporting documentation. The dataset covered 35 hotels across three Gulf markets: UAE (17 hotels), Oman (10 hotels), and Qatar (8 hotels), with 65,146 booking records spanning January 2025 to December 2026.


What I Built

Landing Page

A full-screen HTML landing page with a video background, sound toggle, animated entrance, and an Enter Report button. Built entirely as a DAX string measure using the HTML Content visual with no custom visual or external file involved.

Page 1: Performance Overview

Portfolio-wide KPI cards showing Total Revenue, Room Revenue, Bookings, Cancellation Rate, and Room Nights, each with year-on-year and month-on-month comparison labels and conditional colour formatting. A field parameter slicer lets the viewer switch all visuals on the page between Total Revenue, Total Room Nights, and Total Bookings with a single click.

Page 2: Market Intelligence

Booking channel breakdown covering OTA, Online Direct, and Property channels, alongside cancellation rate by channel, Top 15 source markets, revenue by source region (GCC, Europe, and USA), and a global guest map. The key finding here is that OTA bookings cancel at 39.2% compared to just 12.1% for Property bookings.

Page 3: Revenue Management

ADR, RevPAR, Occupancy Rate, Average Length of Stay, and No Show Rate with year-on-year comparisons and a cancellation rate trend line. A sharp spike to 67.83% in March 2026 is one of the most critical findings in the entire report.

Page 4: Hotel Portfolio

A full 35-hotel scorecard matrix with revenue rank, revenue share, cancellation rate, and booking volume. Conditional formatting applies gold, silver, and bronze colours to the top 3 hotels by revenue, and a green, yellow, red traffic light system for cancellation rate bands.


Key Features

Currency Toggle

All revenue figures can be switched between local hotel currencies (AED for UAE, OMR for Oman, QAR for Qatar) and US Dollars in real time. The conversion uses the historical exchange rate on each booking's departure date, fetched from the Frankfurter API. When a country is selected and Local mode is active, the active filters strip also shows the specific currency code, for example Local · AED.

Dynamic Visual Titles

Every visual title updates automatically based on the selected metric and the active currency. There is no static text anywhere in the report. Titles such as Total Room Nights by Market (USD) are generated entirely by DAX measures.

Active Filters Strip

An HTML Content visual at the top of every page displays the currently applied slicers as colour-coded pill badges covering Year, Month, Country, Cluster, Channel, and Currency. It uses DISTINCTCOUNT comparison rather than ISFILTERED to correctly detect dropdown slicers that are set to All.

Custom Tooltip Pages

Seven custom tooltip pages appear on hover across key visuals, showing hotel profile cards, source market details, channel performance breakdowns, and a cancellation rate indicator that compares the hovered month against the portfolio average.


Data Model

The report is built on a star schema with the following tables:

TableRowsDescription
fact_hotel_booking65,146Core booking fact table
dim_hotel_master35Hotel dimension with brand, cluster, country, and status
dim_country_code249ISO country codes mapped to full country names
fact_room_inventory1,095Room availability data for 3 hotels
Dim_Date730Calendar table covering Jan 2025 to Dec 2026
currency_exchange1,940Historical USD rates per date per currency
Currency_Selector2Disconnected slicer for Local and USD toggle
Overview-Top103Field parameter table for the metric slicer

Data Cleaning in Power Query

The raw data required several fixes before it could be used in the model:

  • Mixed date formats: Booking dates arrived in both MM/DD/YYYY (en-US) and DD/MM/YYYY (en-GB) formats from two different source systems. Fixed using a try/otherwise dual-culture parsing approach on all four date columns.
  • Inconsistent stay status values: The source data had NOSHOW with no space, CHECKED OUT with a double space, and mixed casing throughout. Fixed using Text.Clean, Text.Trim, Table.ReplaceValue, and Text.Upper.
  • Country abbreviation mismatch: The hotel master table used UAE as the country name instead of United Arab Emirates, causing mismatches in country-level visuals.
  • Future booking dates: The dataset extends to December 2026 but the exchange rate API only covers historical dates. Bookings with future departure dates automatically fall back to the most recent available rate.

Key Insights

⚠ March 2026 Cancellation Spike: 67.83% The cancellation rate reached 67.83% in March 2026, which is 2.4 times the portfolio average of 28.6%. The spike appeared across all three markets, making it a portfolio-wide event rather than an issue with a single hotel.
📊 OTA Cancellation Rate: 39.2% vs 12.1% for Property For every 100 OTA bookings, only 61 result in an actual stay. Shifting even 10% of bookings from OTA to Property channel would meaningfully improve net revenue.
🏢 Revenue Concentration Risk: 67.5% from One Hotel Andaz Dubai The Palm generates 67.5% of total portfolio revenue on its own. Any operational disruption at that single property would impact two thirds of the entire revenue line.
📈 ADR Fell 0.30% While Occupancy Rose 9.71 Percentage Points RevPAR improved by 30.45% entirely through occupancy gains rather than rate increases. Applying dynamic pricing during peak demand months could add 5 to 8% to total revenue without requiring additional bookings.

Live Report

Use the slicers to filter by Year, Month, Country, and Cluster. Switch between Local and USD using the currency toggle in the top right. Hover over any visual to see the custom tooltips in action.