🏨 Vrbo Property Yield & Cancellation Intelligence Suite
An end-to-end Power BI business intelligence and analytics project transforming raw, unstructured hospitality booking records into an executive diagnostic and yield optimization dashboard.
📌 Executive Summary
In short-term rental property management, top-line booking demand can be deceptive. Operational profitability depends directly on realized cash flow, active yield pricing, and mitigating cancellation risk.
This project analyzes 19,243 validated bookings across New York, Los Angeles, and San Francisco. By establishing a rigorous data hygiene pipeline and dynamic DAX modeling, this dashboard bridges the gap between gross booking demand ($1.026B) and net realized revenue ($509.7M), uncovering a critical 50.4% cancellation rate and isolating high-risk booking profiles.
🏗️ Architecture & Data Pipeline
Raw CSV (22,000 Rows with Intentional Flaws)
│
▼
Power Query ETL Pipeline (Deduplication, Format Standardization, Custom Duration Logic)
│
▼
Star Schema Data Model + Automated DAX Calendar Dimension
│
▼
Measures & Analytics Engine (Organized DAX Measure Table)
│
▼
3-Page Executive Reporting Suite (with Custom Micro-Tooltip Engine)
🛠️ Data Cleaning & ETL (Power Query)
The raw dataset contained severe data hygiene issues simulating real-world pipeline failures. The following sequential ETL pipeline was implemented:
- Deduplication: Identified and eliminated 2,000 duplicate transactions based on
booking_id. - Text Standardization & Trimming:
- Stripped hidden leading/trailing whitespaces and applied proper case formatting on
guest_name. - Standardized fragmented city strings (
"nyc","Nyc","LA","San Fran","Sf") into normalized market names (New York,Los Angeles,San Francisco).
- Stripped hidden leading/trailing whitespaces and applied proper case formatting on
- Date Harmonization: Parsed mixed-locale and unstructured date strings (
YYYY-MM-DD,DD/MM/YYYY,18 February 2025) into standardized ISODatetypes using explicit locale handling. - Duration & Stay Validation:
- Recomputed stay length dynamically:
Duration.Days([checkout_date] - [checkin_date]). - Filtered out corrupted records with negative or zero-duration stays where check-out occurred before check-in.
- Recomputed stay length dynamically:
- Financial Cleansing:
- Converted textual values (
"free") to0.00and enforced Fixed Decimal Currency data types. - Reconstructed 1,300+ corrupted
total_priceentries containing text errors by computing[nights] * [price_per_night].
- Converted textual values (
- Boolean & Review Normalization:
- Harmonized 10 distinct cancellation representations (
'Yes','y','1','True','TRUE','No','n','0','False','FALSE') into a uniform booleanTrue/Falselogical column. - Filtered out-of-bounds review scores (
-1.0and6.0) to constrain ratings strictly to a 1.0–5.0 scale.
- Harmonized 10 distinct cancellation representations (
📐 Data Modeling & DAX Engineering
Data Model Architecture
- Fact Table:
verbo_data(Cleaned transactional records, stay duration, financial metrics, cancellation status). - Dimension Table:
Dim_Date(Generated dynamically via DAXCALENDARwith Year, Quarter, Month, and Day-of-Week attributes). - Relationship: $1 \rightarrow *$ active single-direction relationship between
Dim_Date[Date]andverbo_data[checkin_date].
┌───────────────────────────┐ ┌───────────────────────────┐
│ Dim_Date │ │ verbo_data │
├───────────────────────────┤ ├───────────────────────────┤
│ Date (PK) │ 1 * │ booking_id (PK) │
│ Year ├───────────────►│ checkin_date (FK) │
│ Year-Month │ │ checkout_date │
│ Month │ │ listing_city │
│ Quarter │ │ price_per_night │
│ Day of Week │ │ total_price │
└───────────────────────────┘ │ is_cancelled │
│ payment_status │
└───────────────────────────┘
Core DAX Measures (_Key Measures)
// 1. Gross Potential Bookings Value
Gross Booked Value = SUM(verbo_data[total_price])
// 2. Net Realized Earnings (Excluding Cancellations)
Realized Revenue =
CALCULATE(
[Gross Booked Value],
verbo_data[is_cancelled] = FALSE
)
// 3. Lost Revenue to Cancellations
Lost Revenue =
CALCULATE(
[Gross Booked Value],
verbo_data[is_cancelled] = TRUE
)
// 4. Average Daily Rate (ADR)
Average Daily Rate = AVERAGE(verbo_data[price_per_night])
// 5. Total Completed Stays
Completed Bookings =
CALCULATE(
COUNTROWS(verbo_data),
verbo_data[is_cancelled] = FALSE
)
// 6. Cancellation Rate %
Cancellation Rate % =
DIVIDE(
CALCULATE(COUNTROWS(verbo_data), verbo_data[is_cancelled] = TRUE),
COUNTROWS(verbo_data),
0
)
// 7. Average Length of Stay (ALOS)
Avg Length of Stay = AVERAGE(verbo_data[nights])
// 8. Guest Satisfaction Rating
Avg Review Score = AVERAGE(verbo_data[review_score])
📊 Dashboard Visual Suite
Page 1: Executive Overview & Market Velocity
- Macro KPI Deck: Realized Revenue ($509.66M), ADR ($271.76), Completed Bookings (9.54K), and Overall Cancellation Rate (50.4%).
- Revenue Trend: Dual-axis visualization contrasting Realized Revenue against Lost Revenue across monthly booking horizons.
- City Market Share: Revenue breakdown comparing New York ($414.5M gross), Los Angeles ($305.5M gross), and San Francisco ($306.3M gross).
- Capital Realization: Donut chart evaluating
PaidvsPendingvsUnpaidcash status.
Page 2: Yield Management & Property Deep Dive
- Top 10 Listings: Ranked by total realized revenue generation using Top-N visual filters.
- Price Elasticity Analysis: Scatter plot correlating nightly pricing against length of stay across city tiers.
- Property Performance Matrix: Multi-level hierarchy (
listing_city$\rightarrow$listing_id) equipped with conditional background color gradients on[Realized Revenue]and dynamic star-rating icons for[Avg Review Score]. - Custom Tooltip Canvas: Dedicated hover tooltip (
Tooltip_Listing) displaying micro-KPIs and monthly performance trends for individual listings.
Page 3: Cancellation & Risk Diagnostics
- Gross-to-Net Waterfall Chart: Bridges total booked value down to realized revenue by isolating cancellation deductions.
- AI Decomposition Tree: Root-cause analysis tracing cancellation revenue leakage through city tiers, payment statuses, and stay duration buckets.
- High-Exposure Risk Watchlist: Filterable operational table highlighting high-value pending/unpaid bookings requiring immediate deposit follow-up.
💡 Key Business Insights
- Severe Revenue Leakage: Across all three core markets, 50.4% of total booked revenue ($516.85M) failed to convert to realized revenue due to cancellations.
- Payment Collection Gap: Over 57% of total booking value sat in
PendingorUnpaidstatus at check-in horizon, which directly correlates with higher drop-off and cancellation rates. - Market Pricing Inelasticity: Average Daily Rates remained nearly identical across NYC ($271.53), LA ($272.53), and SF ($271.31), indicating an opportunity to implement dynamic seasonal and weekend surge pricing models.
📂 Repository Contents
VRBO_dashboard.pbix— Complete interactive Power BI Desktop report and data model.
🔗 Credits & Data Source
- Raw dataset provided by Krithi S on Kaggle: Dirty Data for Cleaning.
Built With
- powerbi
Log in or sign up for Devpost to join the conversation.