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.
Show the data
| origin | bookings | cancellation rate pct | avg daily rate | avg lead time days | realized revenue | lost revenue | lost per eur earned |
|---|---|---|---|---|---|---|---|
| International | 70,249 | 23.68 | 108.96 | 96.60 | 20,359,248.72 | 8,125,843.11 | 0.40 |
| Portugal (domestic) | 48,483 | 56.73 | 92.14 | 115.70 | 5,540,431.72 | 8,581,602.05 | 1.55 |
| Unknown origin | 478 | 11.92 | 61.75 | 32.40 | 87,295.59 | 15,391.96 | 0.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.
Show the data
| lead time bucket | bookings | cancellations | cancellation rate pct | avg daily rate | lost revenue |
|---|---|---|---|---|---|
| 0-7 days | 19,635 | 1,885 | 9.60 | 90.47 | 449,424.93 |
| 8-30 days | 18,945 | 5,283 | 27.89 | 108.20 | 2,045,797.07 |
| 31-90 days | 29,529 | 11,141 | 37.73 | 106.47 | 4,322,162.78 |
| 91-180 days | 26,420 | 11,819 | 44.74 | 109.19 | 5,130,169.34 |
| 181-365 days | 21,534 | 11,942 | 55.46 | 95.11 | 4,419,447.23 |
| 365+ days | 3,147 | 2,129 | 67.65 | 78.84 | 355,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.
Show the data
| deposit type | bookings | cancellation rate pct | avg lead time days | avg daily rate |
|---|---|---|---|---|
| No Deposit | 104,461 | 28.40 | 88.80 | 103.69 |
| Non Refund | 14,587 | 99.36 | 212.90 | 89.66 |
| Refundable | 162 | 22.22 | 152.10 | 76.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.
Show the data
| market segment | bookings | share of bookings pct | cancellation rate pct | avg daily rate | avg lead time days | realized revenue | lost revenue |
|---|---|---|---|---|---|---|---|
| Online TA | 56,408 | 47.32 | 36.76 | 117.32 | 83.10 | 13,707,139.09 | 10,227,646.11 |
| Offline TA/TO | 24,182 | 20.29 | 34.33 | 87.30 | 135.10 | 5,659,291.94 | 2,487,958.15 |
| Groups | 19,791 | 16.60 | 61.11 | 79.56 | 187.10 | 1,869,129.52 | 2,800,543.98 |
| Direct | 12,582 | 10.55 | 15.37 | 115.63 | 49.90 | 4,097,842.40 | 993,409.82 |
| Corporate | 5,282 | 4.43 | 18.76 | 69.53 | 22.10 | 577,892.19 | 196,383.07 |
| Complementary | 728 | 0.61 | 12.23 | 2.95 | 13.60 | 4,812.53 | 269.99 |
| Aviation | 235 | 0.20 | 22.13 | 100.99 | 4.50 | 70,868.36 | 16,578.00 |
| Unknown | 2 | 0.00 | 100.00 | 15.00 | 1.50 | 0.00 | 48.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.
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.
Show the data
| arrival year month | bookings | cancellations | stays | cancellation rate pct | avg daily rate | realized revenue | lost revenue |
|---|---|---|---|---|---|---|---|
| 2015-07 | 2,774 | 1,259 | 1,515 | 45.39 | 97.90 | 758,339.79 | 388,521.74 |
| 2015-08 | 3,883 | 1,598 | 2,285 | 41.15 | 106.09 | 1,137,652.71 | 560,902.63 |
| 2015-09 | 5,109 | 2,093 | 3,016 | 40.97 | 94.91 | 1,054,620.67 | 611,534.72 |
| 2015-10 | 4,951 | 1,732 | 3,219 | 34.98 | 78.99 | 784,714.88 | 385,491.20 |
| 2015-11 | 2,337 | 486 | 1,851 | 20.80 | 60.66 | 346,691.49 | 116,279.89 |
| 2015-12 | 2,913 | 973 | 1,940 | 33.40 | 74.26 | 429,521.57 | 243,827.27 |
| 2016-01 | 2,248 | 557 | 1,691 | 24.78 | 64.77 | 264,521.38 | 139,173.47 |
| 2016-02 | 3,884 | 1,335 | 2,549 | 34.37 | 70.21 | 483,833.10 | 304,054.57 |
| 2016-03 | 4,819 | 1,477 | 3,342 | 30.65 | 78.24 | 767,310.38 | 455,190.23 |
| 2016-04 | 5,425 | 2,060 | 3,365 | 37.97 | 88.94 | 895,772.62 | 626,392.75 |
| 2016-05 | 5,475 | 1,915 | 3,560 | 34.98 | 96.43 | 1,072,667.19 | 582,462.03 |
| 2016-06 | 5,290 | 2,096 | 3,194 | 39.62 | 107.02 | 1,144,800.38 | 753,684.41 |
| 2016-07 | 4,560 | 1,494 | 3,066 | 32.76 | 125.80 | 1,524,476.34 | 782,873.99 |
| 2016-08 | 5,055 | 1,825 | 3,230 | 36.10 | 143.07 | 1,807,654.15 | 1,088,210.81 |
| 2016-09 | 5,391 | 2,022 | 3,369 | 37.51 | 114.81 | 1,288,947.35 | 776,119.10 |
| 2016-10 | 6,196 | 2,514 | 3,682 | 40.57 | 95.22 | 1,072,101.84 | 767,241.58 |
| 2016-11 | 4,434 | 1,634 | 2,800 | 36.85 | 80.98 | 687,101.50 | 448,323.69 |
| 2016-12 | 3,846 | 1,395 | 2,451 | 36.27 | 86.67 | 657,519.05 | 468,973.14 |
| 2017-01 | 3,673 | 1,249 | 2,424 | 34.00 | 73.93 | 511,767.80 | 357,227.12 |
| 2017-02 | 4,168 | 1,358 | 2,810 | 32.58 | 76.98 | 662,833.61 | 367,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.
Show the data
| hotel name | bookings | cancellation rate pct | avg lead time days | avg daily rate | avg nights | realized revenue | lost revenue | repeat guest pct |
|---|---|---|---|---|---|---|---|---|
| City Hotel | 79,163 | 41.79 | 109.90 | 105.45 | 2.97 | 14,385,342.00 | 10,880,659.78 | 2.50 |
| Resort Hotel | 40,047 | 27.77 | 92.70 | 94.98 | 4.32 | 11,601,634.03 | 5,842,177.34 | 4.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.
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.
Show the data
| country code | bookings | share of bookings pct | cancellation rate pct | avg daily rate | avg nights | realized revenue |
|---|---|---|---|---|---|---|
| PRT | 48,483 | 40.67 | 56.73 | 92.14 | 2.91 | 5,540,431.72 |
| GBR | 12,120 | 10.17 | 20.23 | 96.08 | 4.78 | 4,110,896.61 |
| FRA | 10,401 | 8.72 | 18.58 | 109.76 | 3.51 | 3,098,418.27 |
| ESP | 8,560 | 7.18 | 25.43 | 117.09 | 3.07 | 2,246,305.29 |
| DEU | 7,285 | 6.11 | 16.72 | 104.43 | 3.54 | 2,068,219.65 |
| ITA | 3,761 | 3.15 | 35.44 | 114.10 | 3.26 | 866,439.42 |
| IRL | 3,374 | 2.83 | 24.66 | 98.22 | 5.15 | 1,240,002.35 |
| BEL | 2,342 | 1.96 | 20.24 | 113.85 | 3.69 | 759,145.06 |
| BRA | 2,222 | 1.86 | 37.35 | 111.06 | 3.49 | 474,782.78 |
| NLD | 2,103 | 1.76 | 18.40 | 108.14 | 3.68 | 631,636.11 |
| USA | 2,093 | 1.76 | 23.94 | 123.22 | 2.74 | 490,513.16 |
| CHE | 1,726 | 1.45 | 24.80 | 121.99 | 3.63 | 547,591.16 |
| CN | 1,279 | 1.07 | 19.86 | 108.69 | 3.98 | 385,436.50 |
| AUT | 1,263 | 1.06 | 18.21 | 106.24 | 3.67 | 372,529.74 |
| SWE | 1,020 | 0.86 | 22.25 | 113.13 | 3.94 | 334,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.
Show the data
| stay length | sort key | bookings | cancellation rate pct | avg daily rate |
|---|---|---|---|---|
| 0 nights | 0 | 645 | 3.57 | 0.00 |
| 1 nights | 1 | 21,005 | 25.09 | 94.55 |
| 2 nights | 2 | 27,632 | 44.01 | 97.75 |
| 3 nights | 3 | 27,064 | 41.93 | 105.19 |
| 4 nights | 4 | 17,373 | 36.60 | 105.01 |
| 5 nights | 5 | 7,771 | 34.26 | 113.40 |
| 6 nights | 6 | 3,846 | 39.78 | 120.14 |
| 7 nights | 7 | 8,648 | 34.33 | 103.49 |
| 8 nights | 8 | 1,155 | 38.18 | 114.49 |
| 9 nights | 9 | 840 | 37.26 | 114.64 |
| 10 nights | 10 | 1,135 | 31.37 | 108.43 |
| 11 nights | 11 | 393 | 30.53 | 108.74 |
| 12 nights | 12 | 220 | 44.55 | 106.71 |
| 13 nights | 13 | 141 | 36.17 | 112.61 |
| 14 nights | 14 | 913 | 28.15 | 95.05 |
| 15+ nights | 15 | 429 | 56.41 | 80.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.
Show the data
| special requests | sort key | bookings | cancellation rate pct | avg daily rate |
|---|---|---|---|---|
| 0 | 0 | 70,201 | 47.77 | 95.05 |
| 1 | 1 | 33,183 | 22.05 | 108.58 |
| 2 | 2 | 12,952 | 22.13 | 117.15 |
| 3+ | 3 | 2,874 | 16.81 | 124.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.
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.
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.
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.