Illustrative example with made-up numbers: suppose a 200-room city hotel with 75% occupancy and a $180 average daily rate, which gives $9.85M in annual room revenue. If, as an illustration, 28% of bookings cancel (a made-up rate, not from this page's example), about $2.76M of that booked revenue is at risk (0.28 × $9.85M). Most of those rooms go unsold because you find out about the cancellation too late to resell; if roughly three in four do (an illustrative assumption), you're leaving about $2.1M on the table every year. Here's the question revenue managers should be asking: which bookings will cancel a short window before arrival, when there's still time to recover the revenue?
That's what hotel booking cancellation prediction does. It fits a logistic regression on booking features such as lead time, deposit type and channel to score high-risk bookings before they cancel, giving you a short window before arrival to either retain the guest or accept strategic overbooking. On the same assumptions, a scenario in which proactive management cuts the cancellation rate from 28% to 22% would be worth about $450K a year for that 200-room property (6 points × $9.85M × three in four unsold). This page is a general guide. Check any rate or model result against your own data before using it.
Before we dive into the analysis, let's establish the experimental frame: this isn't observational hand-waving. Cancellation prediction is a supervised learning problem with a binary outcome (canceled vs. kept), time-varying features (lead time, days until arrival), and categorical predictors (deposit type, market segment, customer type). The model's job is to estimate P(cancellation | booking characteristics) at decision points where you can still act, for example a few days before arrival (pick the window from your own data).
Worked Example (Simulated): Can Booking Details Flag Cancellations?
Question: Can booking details help flag cancellations?
Inputs: Simulated data, seed 2026. The script makes 2,000 made-up bookings, each with a lead time, a deposit type, a booking channel, and a cancel or keep result. The script sets the cancellation rule: lead time adds 0.009 to the log-odds for each day, no deposit adds 0.85, a refundable deposit adds 0.25, an OTA booking adds 0.45 and a group booking subtracts 0.55. These effects are built in, not found in real hotel records.
Method: The script fits a logistic regression model on lead time, deposit type, and channel. It holds out 25% of the bookings (500) and scores the model on them. ROC AUC shows how well the score ranks cancelled bookings above kept ones. The Brier score measures the gap between the risk scores and the results; lower is better.
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score, brier_score_loss
SEED = 2026
rng = np.random.default_rng(SEED)
n = 2000
lead_days = rng.integers(1, 181, size=n)
deposit = rng.choice(
['none', 'refundable', 'nonrefundable'],
size=n,
p=[0.5, 0.3, 0.2],
)
channel = rng.choice(
['direct', 'ota', 'group'],
size=n,
p=[0.4, 0.5, 0.1],
)
# Built-in cancellation rule (these effects are set by the script)
logit = (
-2.0
+ 0.009 * lead_days
+ np.where(deposit == 'none', 0.85, 0)
+ np.where(deposit == 'refundable', 0.25, 0)
+ np.where(channel == 'ota', 0.45, 0)
+ np.where(channel == 'group', -0.55, 0)
)
probability = 1 / (1 + np.exp(-logit))
cancelled = rng.binomial(1, probability)
data = pd.DataFrame({
'lead_days': lead_days,
'deposit': deposit,
'channel': channel,
'cancelled': cancelled,
})
X = pd.get_dummies(
data[['lead_days', 'deposit', 'channel']],
drop_first=True,
dtype=float,
)
y = data['cancelled']
X_train, X_test, y_train, y_test = train_test_split(
X,
y,
test_size=0.25,
random_state=SEED,
stratify=y,
)
model = LogisticRegression(max_iter=1000).fit(X_train, y_train)
pred = model.predict_proba(X_test)[:, 1]
print(f'Simulated data, seed {SEED}')
print(f'Bookings: {n}; cancellation share: {y.mean():.3f}')
for key in ['none', 'refundable', 'nonrefundable']:
mask = data.deposit == key
rate = data.loc[mask, 'cancelled'].mean()
print(f'Deposit {key}: {int(mask.sum())} bookings; '
f'cancellation rate {rate:.3f}')
print(f'Test bookings: {len(y_test)}')
print(f'Test ROC AUC: {roc_auc_score(y_test, pred):.3f}')
print(f'Test Brier score: {brier_score_loss(y_test, pred):.3f}')
print(f'Test observed cancellation share: {y_test.mean():.3f}')
Printed output:
Simulated data, seed 2026
Bookings: 2000; cancellation share: 0.385
Deposit none: 1033 bookings; cancellation rate 0.450
Deposit refundable: 578 bookings; cancellation rate 0.325
Deposit nonrefundable: 389 bookings; cancellation rate 0.301
Test bookings: 500
Test ROC AUC: 0.675
Test Brier score: 0.216
Test observed cancellation share: 0.386
Result: In the full set, 38.5% of bookings cancelled. Bookings with no deposit cancelled at 45.0% (1,033 bookings), refundable at 32.5% (578) and non-refundable at 30.1% (389). On the 500 held-out bookings, ROC AUC was 0.675 and the Brier score was 0.216. This shows a modest ability to sort risk in this made-up set.
Limit: The data and the cancellation rule are made up, and the deposit rates above follow from effects the script sets. These scores do not show how a model would work at a real hotel.
Sources
- Cox D (1958). The regression analysis of binary sequences. Journal of the Royal Statistical Society: Series B. doi:10.1111/j.2517-6161.1958.tb00292.x. Covers: the logistic regression model.
- James G, Witten D, Hastie T, Tibshirani R. An Introduction to Statistical Learning, 2nd ed. statlearning.com. Covers: a textbook treatment of logistic regression.
The Revenue Management Problem: When Late Cancellations Kill Occupancy
An overall cancellation rate can hide the timing of cancellations. A cancellation 30 days out is manageable. You have time to resell. A cancellation 12 hours before arrival leaves little time to resell, so the room may go empty. The distribution of cancellation timing determines how much revenue you can recover.
To see which factors predict an outcome class in your own data, and where the predictions fail, try the free classification tool.
Cancellations can come early or late, and the reasons may differ, so look at timing in your own data. Late cancellations leave the least time to act, which is where a prediction can help. If you can identify a high-risk booking a short window before arrival, you have three strategic options:
- Retention outreach: Proactive email or call offering flexibility, upgrades, or rebooking incentives to keep the reservation
- Controlled overbooking: Accept additional bookings to offset predicted cancellations without walking guests
- Dynamic rate adjustment: Lower rates for remaining inventory to drive last-minute bookings if cancellation probability is high
All three need some advance notice, a short window before arrival that your own operations set. That's the operational constraint that shapes the prediction problem. Your model doesn't need to predict cancellations 6 months in advance. It needs to be accurate at the decision horizon where you can still act.
Experimental Design Check: Prediction, Not Causation
Cancellation prediction is fundamentally a prediction problem, not a causal inference problem. You're estimating P(cancel | features), not trying to prove that deposit type causes cancellations. The odds ratios below describe associations in observational booking data, so they tell you which bookings are risky, not what would happen if you changed a policy.
If you want a causal answer, such as whether switching to non-refundable deposits would lower your own cancellation rate, you need an experiment or a carefully designed policy comparison at your property. The model finds the risky bookings; the experiment (Step 4 below) tells you which action works.
Monthly Cancellation Rate Trend
A seasonal chart can show how cancellation rates change over time. Name the data and state how each rate was worked out before you rely on it.
If your data shows a gap between hotel types, report the size of the gap with the data and calculation used. The size and cause of any gap between hotel types need support from the data and analysis.
A sharp change in a monthly rate may have more than one cause. Name the data and show the calculation before linking a change to an event. Such changes are events where up-to-date predictions can help. When external shocks hit, your baseline cancellation assumptions break, and you need updated probabilities to adjust inventory management.
Cancellation Rate by Deposit Type
Deposit type may help predict cancellation in a given data set. Compare it with other features on held-out data before calling it the strongest predictor. In the example above, bookings with no deposit cancelled at 45.0% (1,033 bookings), refundable at 32.5% (578) and non-refundable at 30.1% (389). The script sets these effects.
This simulated result points to a lever worth testing. If you're running 40%+ cancellation rates, the first question is: what percentage of your bookings require deposits? A hotel that offers no-deposit booking may be trading some retention for acquisition. Rate fencing is one strategy to test. Use your own booking and revenue data to see whether a flexible rate or a non-refundable rate works for your guests and property. Customers who value flexibility will pay; price-sensitive customers will lock in.
From a modeling perspective, deposit type may carry a large share of the signal. If it does, its coefficient can be large while other predictors look smaller. That's not a bug, but it means you may want to run two models: one with deposit type (for operational prediction) and one without (to understand secondary risk factors for bookings within the same deposit category).
Cancellation Rate by Market Segment
Cancellation rates usually differ by booking channel and segment, so compare online travel agency, direct, corporate and group bookings in your own data. The gaps show where retention effort may pay off and where you may accept more risk for volume.
Reasons for a gap are hypotheses to test, not facts. Third-party bookings may carry less commitment, and group or corporate bookings may carry contract terms that discourage cancelling. Market segment is a categorical variable you can enter in a model, and you can check whether its effect holds across months.
One option is to set overbooking by channel. How much to overbook is a business choice that depends on your own history, the cost of walking a guest and your tolerance for risk.
Lead Time Distribution by Cancellation Status
A box plot of lead time for canceled and kept bookings shows whether the two groups differ in median and spread. In the script above, lead time is set to raise the chance of cancelling, so longer lead times go with more cancellations there.
Long lead times may mean the guest has no firm plans yet, but that is a hypothesis to check in your own data, not a fact about all hotels.
For modeling, lead time is a continuous predictor, and its effect may not be a straight line. You can add a log or polynomial term, or bin it into groups such as short, medium and long, and compare the fits on held-out bookings.
Cancellation Rate by Customer Type
Transient customers (one-off leisure and business travelers) and Contract customers (corporate rates, negotiated terms) can show different cancellation rates, and group bookings are often more stable. These are patterns to check, not rates from this page's example, which does not include customer type. Institutional relationships may reduce cancellation risk, so compare them in your own data.
The Transient-Party category (leisure groups not under formal contract) may fall between solo transient and contracted groups. These are families or friend groups booking multiple rooms. They have social commitment but no legal obligation. When one party cancels, the whole group often collapses.
Customer type and market segment are correlated but not redundant. A Direct booking (market segment) can be either Transient or Contract (customer type). An OTA booking is almost always Transient. When you build the logistic regression model, both variables should be included because they capture different dimensions of commitment: how the customer found you (market segment) versus what relationship they have with you (customer type).
Logistic Regression: Odds Ratios for Cancellation
Here is where the single-variable views collapse into one predictive model. An odds ratio shows the multiplicative effect of a predictor on the odds of cancellation, holding the other features constant. An odds ratio above 1.0 raises the odds; below 1.0 lowers them. Odds are not probabilities: odds = p / (1 - p).
Each predictor, such as deposit type, booking channel, customer type and lead time, gets its own odds ratio, and the effects are net of each other. The script above sets such effects on the log-odds scale, so a model fitted to it should recover them in direction.
When you run this on your own data, check each odds ratio's confidence interval. If the interval crosses 1.0, the data can't reliably distinguish that predictor from baseline. A small p-value means data this extreme would be unlikely if the predictor had no association with cancellation; it is evidence against "no effect", not proof that the effect is real or that it is causal.
How to Use Odds Ratios Operationally
On the odds scale, odds ratios multiply across predictors, so a booking with several risk factors can carry much higher odds than baseline. Use the fitted scores to rank bookings for a retention call or a review of overbooking, and check how well the ranking holds on bookings the model has not seen.
How to Interpret Your Results: The Decision Window
If you fit a logistic regression model, check its probability scores on held-out bookings before using them to guide action. The question is: what do you do with those probabilities? Here's the decision framework we recommend based on revenue management best practices.
Step 1: Set risk thresholds based on your hotel's capacity and past results. If your own records show strong last-minute demand and quick room resale, you may be able to accept more cancellation risk. Check this with your data before setting a threshold. The threshold determines which bookings trigger action.
Step 2: Segment actions by risk tier. For bookings with 70%+ predicted cancellation probability in your chosen window before arrival, trigger retention outreach: email or call offering flexibility, upgrades, or rebooking incentives. For 50-70% risk, accept controlled overbooking (take additional reservations to offset expected cancellations). For 30-50% risk, monitor but don't act. Below 30%, treat as firm bookings.
Step 3: Measure model performance in production. Track actual cancellation rate by predicted risk decile. Your top decile (highest predicted risk) should cancel at 60-80%. Your bottom decile should cancel at <10%. If the spread compresses, your model is losing discrimination, retrain with recent data. Also track false positives: how often do you overbook based on predicted cancellations that don't materialize? That's your walked-guest risk.
Step 4: A/B test retention strategies. This is where experimental rigor matters. Don't just blast high-risk bookings with generic retention emails. Randomly assign them to control (no contact), Treatment A (flexible rebooking offer), Treatment B (room upgrade offer), and Treatment C (personalized outreach from front desk manager). Measure cancellation rate and net revenue by arm. You may find that personalized outreach works better per booking but only scales to your highest-risk bookings, while automated emails scale but deliver a smaller lift. The test tells you the actual sizes.
The model gives you targeting precision. The experiment gives you causal estimates of what works. Combine them and you have a closed-loop revenue management system: predict risk, intervene strategically, measure impact, refine.
What the Model Won't Tell You: External Shocks and Black Swans
Logistic regression is trained on historical patterns, which means it breaks when the world changes in ways not seen in training data. A global pandemic, major weather event, or sudden economic shock will undermine your model's predictions because the base rates shift overnight. If your training data shows 28% average cancellation and a crisis pushes it to 55%, every predicted probability will be underestimated.
The solution is monitoring and rapid retraining. Track rolling 7-day cancellation rate by segment. If it moves more than 2 standard deviations from historical mean, your model is out of distribution: pause automated actions and retrain with last 30 days of data. You'll sacrifice long-term stability for short-term accuracy, but during shocks that's the right trade.
Also recognize that prediction models optimize for the average case, not tail risk. A booking with 15% predicted cancellation probability still cancels 15% of the time. If you manage 500 bookings per week, 75 of your "low risk" bookings will cancel. That's not model failure. That's irreducible uncertainty. The model helps you triage, not achieve perfection.
When This Model Beats Gut Instinct: The $450K Question
Revenue managers develop intuition about which bookings are risky, OTA bookings made far in advance with no deposit "feel" like cancellations waiting to happen. And they're right. But intuition doesn't scale to 500+ bookings per week, doesn't quantify risk precisely, and doesn't tell you which retention strategy works.
The model's value is in three areas: scale (score every booking automatically), precision (65% risk vs. 85% risk drives different actions), and testability (you can A/B test interventions and measure ROI). In the illustrative scenario above, a drop in cancellation rate from 28% to 22% would put the incremental revenue at about $450K a year; that is an assumption-based scenario, not a result. That's the difference between flying blind and flying with instruments.
Here's the final experimental design point: the only way to know if this model works for your property is to run it as a controlled test. Take 50% of high-risk bookings (predicted cancellation 60%+) and apply retention outreach. Leave the other 50% as control (no contact). Measure cancellation rate difference. If treatment reduces cancellations by 15-25 percentage points, and the test has enough bookings in each arm to tell that gap apart from zero (the confidence interval excludes 0), you have an operationally meaningful effect. Scale it. If the effect is under 5 points, or the test cannot tell it apart from zero, you have no evidence the intervention is worth scaling: refine it, or run it on more bookings before deciding.
That's the Kit Fisher approach: build a model, design an experiment, measure causally, act on evidence. Correlation got you the predictors. Experimentation tells you what to do with them.
Your turn
Bring your own data and the question you actually need answered.
MCP AnalyticsData science by email Send us your data and your question, and we will reply. ds@mcpanalytics.ai
Frequently Asked Questions
What cancellation rate is normal for hotels?
There is no single normal rate. Cancellation rates vary widely by property type and market segment: city hotels with heavy OTA and transient business usually run higher than resorts with more group and contract business, and bookings with non-refundable deposits cancel far less often than no-deposit bookings. Benchmark against your own history by segment. If you're running above 35% without strong OTA channel mix, you have a deposit policy problem or a customer quality problem.
How far in advance can you predict a cancellation?
Logistic regression models can flag high-risk bookings a short window before arrival, a window chosen by your own operations; how accurate the flags are depends on your own data, so measure it on held-out bookings. Longer lead times tend to reduce precision because guest circumstances change. A practical window is one where you still have time to resell the room, and you can find it by testing on your own data. Predictions made 7+ days before arrival have too much uncertainty to act on confidently.
Which booking channels have the highest cancellation rates?
Online travel agencies (OTAs) typically show the highest cancellation rates, followed by direct bookings, then corporate contracts, with group bookings the most stable. Rates differ by segment in most booking data, but by how much depends on the hotel, so check your own. Deposit policies and customer commitment are possible reasons to test. OTAs allow no-deposit bookings by default; groups sign contracts with attrition clauses.
What's the most important predictor of cancellation?
Deposit type is the strongest single predictor. Bookings with no deposit required typically cancel at a much higher rate than non-refundable bookings. Lead time is often second: bookings made far in advance tend to cancel more than bookings made within days of arrival. Market segment, customer type, and historical behavior round out the top five. If you can only change one thing, make non-refundable deposits the default rate and charge a premium for flexibility.
How do you use cancellation predictions operationally?
Revenue managers use predicted cancellation probability to optimize overbooking levels, adjust rate fences, and trigger retention outreach. If a booking has 80%+ cancellation probability a short window before arrival, consider pre-emptive offers (room upgrade, flexible rebooking) or accept controlled overbooking to fill the expected gap. The key is acting at the decision horizon where you can still resell the room, a short window before arrival that your own operations set.