Revenue analysis · 2015–2017

What 37% cancellation costs two Portuguese hotels

119,210 bookings across a city hotel and a resort hotel, 2015-07-01 to 2017-08-31, drawn from 177 source markets. Cancellation is not a side effect here — it is the central fact of the business.

City Hotel 41.8% cancelled Resort Hotel 27.8% cancelled Generated 2026-10-08 16:49

Bookings
119,2102015-07-01 to 2017-08-31
Cancellation rate
37.1%of all bookings made
Realised revenue
€25.99Mbooked value collected
Lost to cancellation
€16.72M39% of booked demand
Average daily rate
€101.93across both properties
Average lead time
104 daysbetween booking and arrival

Of every euro of booked value, 39 cents never converts — €16.72M against €25.99M collected.

  1. Lead time is the dominant signal.

    Bookings made 0-7 days ahead cancel at 9.6%; those made 365+ days ahead cancel at 67.7%. Distant bookings are options, not commitments.

  2. Channel quality varies enormously.

    Groups bookings (17% of volume) cancel at 61.1%, while Direct cancels at 15.4%. Blended channel reporting hides this completely.

  3. Non-refundable deposits mark risk, they do not prevent it.

    Bookings with a non-refundable deposit cancel at 99.4% against 28.4% with no deposit. Treat this as a data question before a policy one.

  4. Engagement predicts arrival.

    Bookings with no special request cancel at 47.8%; those with three or more at 16.8%. A guest who asks for a cot has already decided to come.

Domestic versus international demand

The headline rate is two populations averaged into a number that describes neither. Domestic Portuguese bookings cancel at 57% and lose €8.58M against €5.54M earned - 1.55 euros lost for every euro collected. International bookings cancel at 24% and are 0.40. Almost every other pattern in this report is partly this one in disguise.

Booked value by guest origin, realised versus lost
Show the data
originbookingscancellation rate pctavg daily rateavg lead time daysrealized revenuelost revenuelost per eur earned
International70,24923.68108.9696.6020,359,248.728,125,843.110.40
Portugal (domestic)48,48356.7392.14115.705,540,431.728,581,602.051.55
Unknown origin47811.9261.7532.4087,295.5915,391.960.18

Cancellations and lead time

The single strongest predictor in the dataset, and it rises monotonically with the booking window - from 9.6% in the last week before arrival to 67.7% more than a year out. The money, though, sits in the middle: the one-to-twelve-month window carries the bulk of the loss, while the extreme bucket is a high rate on very little volume. Any overbooking model that ignores lead time is leaving the best available feature on the table.

Cancellation rate by lead time bucket
Show the data
lead time bucketbookingscancellationscancellation rate pctavg daily ratelost revenue
0-7 days19,6351,8859.6090.47449,424.93
8-30 days18,9455,28327.89108.202,045,797.07
31-90 days29,52911,14137.73106.474,322,162.78
91-180 days26,42011,81944.74109.195,130,169.34
181-365 days21,53411,94255.4695.114,419,447.23
365+ days3,1472,12967.6578.84355,835.77

Deposit policy

The counter-intuitive result, and the one to treat with most caution. Non-refundable bookings cancel at 99.4% against 28.4% for no deposit at all. A rate that close to total is not plausible as ordinary guest behaviour - investigate it as a data question before drawing any policy conclusion from it.

Cancellation rate by deposit policy
Show the data
deposit typebookingscancellation rate pctavg lead time daysavg daily rate
No Deposit104,46128.4088.80103.69
Non Refund14,58799.36212.9089.66
Refundable16222.22152.1076.21

Acquisition channels

Volume and risk are not correlated. Groups contributes 17% of bookings at a 61.1% cancellation rate; Direct converts far more reliably at 15.4%. Channel-level targets beat a blended one. In money rather than counts: a Direct booking realises €326 on average against €94 for Groups - and commission costs, which would widen that gap further, are not in this dataset.

Cancellation rate by market segment
Show the data
market segmentbookingsshare of bookings pctcancellation rate pctavg daily rateavg lead time daysrealized revenuelost revenue
Online TA56,40847.3236.76117.3283.1013,707,139.0910,227,646.11
Offline TA/TO24,18220.2934.3387.30135.105,659,291.942,487,958.15
Groups19,79116.6061.1179.56187.101,869,129.522,800,543.98
Direct12,58210.5515.37115.6349.904,097,842.40993,409.82
Corporate5,2824.4318.7669.5322.10577,892.19196,383.07
Complementary7280.6112.232.9513.604,812.53269.99
Aviation2350.2022.13100.994.5070,868.3616,578.00
Unknown20.00100.0015.001.500.0048.00

Where revenue is won and lost

The same channel split in money rather than counts. This is the view that decides where commission and marketing spend should go: a channel with high volume and high cancellation can contribute less net revenue than a smaller, more reliable one.

Realised versus lost revenue by market segment

Demand over time

Monthly arrivals split into stays and cancellations. The cancelled band is present in every single month of the series - it ranges from 21% to 45% of arrivals and never approaches zero. A loss that reliable is a loss you can forecast, and therefore partly recover through disciplined overbooking.

Monthly bookings split by outcome
Show the data
arrival year monthbookingscancellationsstayscancellation rate pctavg daily raterealized revenuelost revenue
2015-072,7741,2591,51545.3997.90758,339.79388,521.74
2015-083,8831,5982,28541.15106.091,137,652.71560,902.63
2015-095,1092,0933,01640.9794.911,054,620.67611,534.72
2015-104,9511,7323,21934.9878.99784,714.88385,491.20
2015-112,3374861,85120.8060.66346,691.49116,279.89
2015-122,9139731,94033.4074.26429,521.57243,827.27
2016-012,2485571,69124.7864.77264,521.38139,173.47
2016-023,8841,3352,54934.3770.21483,833.10304,054.57
2016-034,8191,4773,34230.6578.24767,310.38455,190.23
2016-045,4252,0603,36537.9788.94895,772.62626,392.75
2016-055,4751,9153,56034.9896.431,072,667.19582,462.03
2016-065,2902,0963,19439.62107.021,144,800.38753,684.41
2016-074,5601,4943,06632.76125.801,524,476.34782,873.99
2016-085,0551,8253,23036.10143.071,807,654.151,088,210.81
2016-095,3912,0223,36937.51114.811,288,947.35776,119.10
2016-106,1962,5143,68240.5795.221,072,101.84767,241.58
2016-114,4341,6342,80036.8580.98687,101.50448,323.69
2016-123,8461,3952,45136.2786.67657,519.05468,973.14
2017-013,6731,2492,42434.0073.93511,767.80357,227.12
2017-024,1681,3582,81032.5876.98662,833.61367,376.65

Showing 20 of 26 rows; the full table is in reports/tables/.

Rate seasonality

The two properties are different businesses. The resort swings sharply - peaking in August and bottoming in November - while the city hotel holds a far flatter curve driven by business demand. Averaging them together describes neither, and the city hotel's flat rate against variable demand may mean it is underpricing its peak.

Average daily rate by month and property
Show the data
hotel namebookingscancellation rate pctavg lead time daysavg daily rateavg nightsrealized revenuelost revenuerepeat guest pct
City Hotel79,16341.79109.90105.452.9714,385,342.0010,880,659.782.50
Resort Hotel40,04727.7792.7094.984.3211,601,634.035,842,177.344.44

Arrival patterns

Arrival weekday by month. The operational value is in the corners: staffing and check-in capacity should follow this grid, not a flat weekly average.

Bookings by arrival weekday and month

Source markets

PRT alone supplies 41% of bookings and cancels at 56.7%, well above the 37.1% average. The largest market is also the least reliable one - a concentration risk worth naming explicitly.

Top source markets by booking volume
Show the data
country codebookingsshare of bookings pctcancellation rate pctavg daily rateavg nightsrealized revenue
PRT48,48340.6756.7392.142.915,540,431.72
GBR12,12010.1720.2396.084.784,110,896.61
FRA10,4018.7218.58109.763.513,098,418.27
ESP8,5607.1825.43117.093.072,246,305.29
DEU7,2856.1116.72104.433.542,068,219.65
ITA3,7613.1535.44114.103.26866,439.42
IRL3,3742.8324.6698.225.151,240,002.35
BEL2,3421.9620.24113.853.69759,145.06
BRA2,2221.8637.35111.063.49474,782.78
NLD2,1031.7618.40108.143.68631,636.11
USA2,0931.7623.94123.222.74490,513.16
CHE1,7261.4524.80121.993.63547,591.16
CN1,2791.0719.86108.693.98385,436.50
AUT1,2631.0618.21106.243.67372,529.74
SWE1,0200.8622.25113.133.94334,983.15

Length of stay

Short stays dominate: the distribution is heavily weighted toward one to four nights, with a thin tail. Minimum-stay rules and length-of-stay pricing should be calibrated against this shape rather than against the mean.

Bookings by length of stay
Show the data
stay lengthsort keybookingscancellation rate pctavg daily rate
0 nights06453.570.00
1 nights121,00525.0994.55
2 nights227,63244.0197.75
3 nights327,06441.93105.19
4 nights417,37336.60105.01
5 nights57,77134.26113.40
6 nights63,84639.78120.14
7 nights78,64834.33103.49
8 nights81,15538.18114.49
9 nights984037.26114.64
10 nights101,13531.37108.43
11 nights1139330.53108.74
12 nights1222044.55106.71
13 nights1314136.17112.61
14 nights1491328.1595.05
15+ nights1542956.4180.04

Guest engagement

Special requests act as a commitment signal: 47.8% cancellation with none, falling to 16.8% with three or more. Note the shape - almost the entire effect lands between zero requests and one, so read it as a binary engagement flag rather than a dose response. It is free, available at booking time, and trivially usable as a model feature.

Cancellation rate by number of special requests
Show the data
special requestssort keybookingscancellation rate pctavg daily rate
0070,20147.7795.05
1133,18322.05108.58
2212,95222.13117.15
3+32,87416.81124.82

Predicting cancellation: risk ranking

A model trained on arrivals before 2017-01-01 and tested on everything after, so it is only ever scored on bookings it could not have seen. It reaches 0.841 ROC-AUC and 0.802 PR-AUC against a 0.387 no-skill baseline. In the held-out period the highest-risk tenth of bookings cancelled 100% of the time and the lowest-risk tenth 3.8% - the ranking separates the book cleanly enough to act on.

Actual cancellation rate by predicted risk decile

How much to trust the probability

Ranking is the easy half. To use these numbers for overbooking you have to sum them into expected arrivals, which requires the probability to be literally true. It is not, quite: the model averages 32.9% against an actual 38.7%, under-predicting by about 5.9 points across the range. That gap is distribution shift - cancellation rose between the training period and the test period - and it is the reason the model reports a Brier score of 0.1577 rather than only an AUC. Correct for it before trusting an absolute forecast; the ranking is unaffected.

Calibration curve: predicted probability versus observed rate

What the model leans on

Permutation importance on held-out data: how much the Brier score degrades when a single column is shuffled. deposit type, country, market segment dominate - and note that lead time, the strongest signal in the univariate analysis above, ranks only fifth here. That is not a contradiction: much of what lead time tells you on its own is already carried by channel and origin once those are in the model. Deposit type leading the ranking does deserve suspicion, given the 99% cancellation rate flagged earlier may be a recording artifact - but retraining without it costs only 0.008 ROC-AUC and 0.004 Brier, so no conclusion here rests on it. Note too what is absent: room reassignment correlates far more strongly with cancellation than anything shown, and is excluded by design, because rooms are assigned at check-in and the feature really means the guest arrived.

Permutation feature importance

How to read these numbers

  • Cancellation rate counts bookings, not room nights.

    A cancelled two-week stay counts the same as a cancelled one-night stay. The revenue figures are the ones that weight by length.

  • Lost revenue is not a cash loss.

    It is booked value that was cancelled (rate x nights) - demand that existed and did not convert. Some of those rooms were resold, and this dataset cannot say which. Treat it as the size of the opportunity.

  • Parking requests are leakage too, and that one is easy to miss.

    Not one of the 7,409 bookings that requested a car parking space was ever cancelled - zero, not nearly zero. Perfect separation like that is structure, not behaviour: the field is evidently filled in when a space is allocated on arrival. It is excluded from the model for the same reason as room reassignment, and it is worth assuming other columns in any booking export hide the same problem.

  • Room reassignment is leakage, not a predictor.

    Bookings where the room changed cancel at around 5% versus 45%, which looks like the strongest signal here and is worthless: rooms are assigned at check-in, so it really means the guest arrived. In a model it produces excellent accuracy that predicts nothing.

  • Everything here is correlational.

    Nothing in this data establishes that adding a deposit causes cancellation, or that soliciting a request prevents one. Those need an experiment.

  • About 27% of source rows are exact duplicates.

    They are retained by default, since identical bookings on the same day are plausible in a real system. Re-run with --drop-duplicates to see every figure here under the opposite assumption.

  • No cost, commission or capacity data.

    Channel profitability is therefore directional only, and occupancy and RevPAR - the industry's primary metric - cannot be computed at all.