Grégoire Maillard

How airlines keep seats for passengers who book late and pay more, and how many seats they sell twice.

Booking limits

Cheap fares sell first and expensive ones sell last, so a flight left to itself fills up with the cheapest passengers. Revenue management sets a cap on each fare class and keeps the rest for later, higher-paying bookings. Change the fares and the forecast and see how the caps move, then test them on thousands of simulated flights. The second tab does the same for overbooking. This is the hands-on companion to Revenue Management 101.

All fares, demand figures and costs on this page are illustrative assumptions, not any airline's data.

Protection levels and booking limits

A protection level is the number of seats kept for a class and every class above it. The booking limit of a class is what's left: the most seats that class and the cheaper ones below it can sell together. Limits are nested, so a higher class can always take a seat a lower class could have had.

Nested booking limits

Seats open to each class

Expected marginal seat revenue

The formulas, with these numbers

Pick a class boundary

Monte Carlo: 2,000 departures

Each simulated departure draws a demand for every class, then bookings arrive cheapest class first. The same draws are replayed under each policy: EMSR applies the booking limits above, first come, first served sells to anyone until the cabin is full, and perfect hindsight knows the demand in advance and fills the cabin from the most expensive fare down, which is the ceiling no real policy can reach.

Revenue per departure

Load factor

How it works

Seat allocation

Classes are ranked from the highest fare f1 to the lowest fn. Demand for class i is independent and normal, Di ~ N(μi, σi2). Everything rests on Littlewood's rule: keep one more seat for a higher fare fH as long as fH · P(DH ≥ y) ≥ fL, the lower fare you would turn away. The left-hand side is the expected marginal seat revenue (EMSR) of the y-th seat, and the charts plot it seat by seat.

EMSR-b (Belobaba, 1992) protects classes 1 to j together against class j+1 by merging them into one composite class, with fare f̄ = Σ fiμi / Σ μi and demand N(Σ μi, Σ σi2). The protection level is yj = μ̄ + σ̄ · Φ−1(1 − fj+1 / f̄). EMSR-a (Belobaba, 1987) applies Littlewood's rule to each higher class on its own against class j+1 and adds up the results. Protection levels are rounded to the nearest seat, kept between 0 and the capacity, and never allowed to fall as you go down the classes. The booking limit of class j+1 is the capacity minus yj; the top class can sell the whole cabin.

Monte Carlo: 2,000 departures, each with a fresh demand draw per class (rounded, and floored at zero). Bookings arrive strictly from the cheapest class to the most expensive, which is the textbook assumption behind EMSR and the case where control matters most. All policies see the same draws. The random generator is seeded, so the page opens on the same results every time; "Run 2,000 new departures" changes the seed.

Overbooking

With A bookings accepted and a show-up rate p, the number of passengers at the gate is binomial, S ~ Bin(A, p). The expected cost is cDB · E[(S − C)+] + csp · E[(C − S)+], where C is the capacity. One more booking is worth accepting while the chance that everyone else leaves a seat free, P(SA ≤ C − 1), is above the critical fractile cDB / (cDB + csp). The page also computes the expected cost for every level and checks that the minimum is where the rule says. With separate business and leisure rates, bookings are split by the business share and show-ups are the sum of two binomials; the page then takes the level with the lowest expected cost directly.

Sources

Limitations

This is a personal project and isn't affiliated with any airline.