4 min read

How many rooms should a hotel overbook?

A binomial rule and a per-guest arrival model for deciding when a hotel should stop taking reservations, with a correction to the original formula and simulation.

Updated

A hotel that books exactly to capacity will have empty rooms every night, because some guests never show up. Airlines solved this decades ago by selling more seats than they have and paying off the passengers who get bumped. A collaborator and I worked out the same kind of policy for a hotel in 2021.

When I went back to the original report and code in 2026, I found mistakes in the profit formula and in the simulation that tested it. This version keeps the idea, corrects the formula, and takes down the results I can no longer stand behind. The original report and code are on GitHub.

The rule

Suppose every guest arrives independently with probability p, so the number of arrivals X from b bookings is binomial. Let k be the number of rooms, π the profit from each guest who gets a room, and L the cost of each guest who arrives to find no room. A guest who doesn’t show up earns nothing and costs nothing. Expected profit from b bookings is then:

E[profit | b] = π · E[min(X, k)] − L · E[max(X − k, 0)]

The first term counts the guests you house and the second the guests you have to send elsewhere. One more booking is worth taking while the chance that the bookings you already have leave a room free, P(X ≤ k − 1), is above L / (π + L). We set the penalty at four times the profit per guest, roughly the cost of putting someone up elsewhere and apologizing, so the cutoff is 0.8. If every guest always arrives, the rule books exactly to capacity, and as p falls toward zero the number of bookings grows without limit.

The 2021 report wrote the formula as π · b · F(k | b, p) − L · (b − k) · (1 − F(k | b, p)), where F is the binomial CDF. That isn’t an expected profit. Below capacity it pays π for every booking, including guests who never arrive, so a hotel would earn the same whether a tenth of its guests showed up or all of them. The code also had two versions of the booking rule, and they didn’t agree with each other or with the report.

The data was a public set of 119,390 reservations from two hotels, a city hotel and a resort, covering July 2015 to August 2017. The 2021 report and code use an arrival rate of 0.64. The public data now shows about 63% of bookings not canceled overall, so I can’t reconstruct exactly how 0.64 was chosen. With 0.64 for everybody and a 100-room hotel, the report said to book 129 guests. That number came from one version of the code. The corrected formula says 148.

One rate doesn’t fit everyone

Guests aren’t interchangeable. We fit a logistic regression for arrival on what a booking agent knows at the time: customer type (individual, group, or contract), party size, lead time, length of stay, and whether a deposit was taken. In the 2021 report every coefficient was statistically significant. Groups showed up more often than individual guests, and bookings with more adults were less likely to arrive.

Then each booking gets its own p̂ and its own booking count b*, the number it would imply if every booking looked like it. We took 1/b* as that booking’s share of a room and accepted bookings until the shares summed to 0.99. When p̂ was 0.065 or lower, we set b* to ten times capacity. I still like that plan, but the b* values came from the flawed 2021 rule, so the policy we tested isn’t the one the corrected formula would give.

The test, and what went wrong with it

We fit the model on the first 80% of the city hotel’s check-in dates. We then simulated the remaining 160 days 2,500 times, resampling that period’s real bookings under three policies: book to capacity, book 129 guests using one arrival rate, and the per-guest rule.

The 2021 results said the single-rate policy walked more than five times as many guests as the per-guest rule. That comparison was wrong. The analysis computed the single-rate policy’s arrivals from the per-guest policy’s booking counts. Recounted from the saved runs with the single-rate policy’s own 129 bookings, it walked fewer guests than the per-guest rule, not more. It also filled fewer rooms, because the per-guest rule booked about 146 guests a night on average.

The saved runs have other problems. The two overbooking policies used different versions of the booking rule. The single rate of 0.64 was applied to the city hotel, where only about 58% of bookings weren’t canceled. And the per-guest sampling code appears to add one blank booking a night that counts as an arrival. I’ve taken down the results table and the simulation chart rather than patch numbers from runs I don’t trust.

What I’d do next

The first step is a new simulation that applies the corrected rule the same way to both overbooking policies. It should report profit, not just arrivals. The penalty is already in profit units, so that comparison would make the argument in one number. I’d also report the worst nights next to the averages, because a revenue manager cares about the tail.

I’d also loosen the independence assumption. Group bookings cancel together, and bad weather or a canceled conference hits everyone at once, so the binomial model understates how often a whole block shows up or disappears. A beta-binomial model, or simulating at the group level, would be more realistic.