Airline Economics · Revenue management

Demand unconstraining

How airlines recover the demand they never saw, and what it is worth.

Once a flight or fare class closes, later requests vanish from the data, so the busiest departures record the booking limit, not the demand. This page builds a history where true demand is known, recovers it five ways, then turns it into spill, recapture and the case for a bigger aircraft. The theory is in Revenue Management 101, Chapter 02.

Part 1

Recovering demand from censored bookings

120 departures of one daily flight. Each has a true demand, drawn from the distribution you set, and a booking limit between 60% and 100% of capacity. Requests arrive along a booking curve; once a departure's bookings reach its limit it closes, and the data collection point (DCP) where it was first seen closed is recorded.

Demand model
History

The history: what was recorded, and what was lost

Tap a departure to open it below

Five estimates against the truth

MethodMeanErrorErr.Std devSDErrorErr.Miss per closed dep.Miss

How each method holds up as more departures close

For each share of closed departures, the booking limits are tightened until exactly that share of departures hits its limit, on 40 fresh histories with your mean and variability. The chart shows the average error of each method against the true value.

Part 2

Spill, recapture and aircraft size

With the demand unconstrained, the question turns around: for a flight with this demand, how many passengers will a given aircraft carry, how many will it turn away, and how much of that comes back on the airline's other flights? The normal spill formula answers it, and running it across real seat counts shows where a bigger aircraft stops paying for itself.

Unconstrained demand per departure

Aircraft

Revenue (illustrative)

Recapture is the share of turned-away passengers who book another flight of the same airline instead of going to a competitor.

Passengers and spill by aircraft size

Per departure, for the demand you set

Revenue per departure by aircraft size

Including recaptured passengers, at the fare you set

Real aircraft, side by side

Seat counts from published cabin layouts
AircraftSeatsPassengersPaxLoad factorLFSpillSpill rateRateRevenue keptRevenueGain vs smallerGainLayout source

How it works

Background

An airline only records the bookings it accepted. Once a flight or a fare class closes, every later request disappears from the data, so on the busiest departures the history shows the booking limit, not the demand. Forecasts built on that history come out too low, and fleet decisions built on those forecasts put too few seats where they are needed.

Why bookings are censored

A booking record is what the airline sold, not what customers asked for. While a flight or fare class is open, every request that fits becomes a booking. Once its bookings reach the booking limit, later requests are turned away and leave no trace in the data (or at best a search log that is hard to tie to one flight). Statisticians call the resulting observation censored: for a closed departure you know demand was at least the limit, not what it was. Averaging those numbers as if they were demand biases the forecast down. A lower forecast protects fewer seats for later passengers or plans fewer seats in the first place, the flight closes earlier, and next season's data is censored even more. Revenue Management 101, Chapter 02 calls this the unconstraining problem.

The synthetic history

Each of the 120 departures gets a true demand D, drawn either from a normal distribution with the mean and variability you choose (variability is the standard deviation as a share of the mean, rounded to whole passengers and floored at zero) or from a Poisson distribution, whose standard deviation is fixed at √mean. Its booking limit L is drawn uniformly between 60% and 100% of capacity: on some days revenue management holds back more seats for later, higher fares, and the seats open to this demand change. Each request arrives a random number of days before departure: 60% follow a leisure pattern (gamma distribution, mean 50 days) and 40% a business pattern (exponential, mean 8 days), with no request earlier than 180 days out. Bookings are observed at DCPs 120, 90, 60, 45, 30, 21, 14, 7, 3, 1 and 0 days before departure. If D ≥ L, the departure closes: its recorded bookings are L and the closure DCP is the first snapshot at which bookings had reached L. The history is generated from seed 20260928; the same seed with the same mean and variability always gives the same true demand, whatever the capacity, so the capacity slider only changes what gets recorded.

The five methods

Notation: xj is the recorded final bookings of departure j; Lj its limit; μ and σ the mean and standard deviation being estimated; φ and Φ the standard normal density and distribution function.

The table's "miss per closed departure" is the average absolute gap between a method's estimate for a closed departure and its true demand (for EM, the estimate is the conditional mean above). The sweep repeats everything on 40 new histories per level, with common random numbers across levels, so the lines differ only because more departures close.

Spill and recapture

For a flight with unconstrained demand D ~ Normal(μ, σ) and C seats, with z = (C − μ) / σ, the expected number of passengers turned away is

Spill(C) = E[max(D − C, 0)] = σ [φ(z) − z(1 − Φ(z))]

Expected passengers are μ − Spill(C), the load factor is that divided by C, and the spill rate is Spill(C) / μ. A share r of spilled passengers is recaptured on the airline's other flights, so the revenue the airline keeps is fare × (passengers + r × spill) and the revenue lost is fare × (1 − r) × spill. One more seat is worth fare × (1 − r) × P(D > C) per departure: the chance the flight is full is the only time the extra seat sells. That value falls quickly past mean demand, which is why the gain from each step up in aircraft size shrinks. Upgauging pays off when the bigger aircraft's extra trip cost is below the "gain vs smaller" in the table; trip costs are not modelled here.

From unconstrained demand to forecasts and fleet assignment

Unconstraining sits at the start of both chains. In revenue management, the unconstrained history (by fare class, by DCP) is what the forecaster learns from; the forecasts then set the protection levels and booking limits of EMSR-b or the bid prices of network control, and the pickup forecasts assume their history is demand. Skip the step and the system under-protects, closes low fares on the wrong days and keeps censoring its own data. In network planning, fleet assignment compares, for every flight, the cost of each aircraft type with the revenue it would lose to spill: exactly the calculation in Part 2, with recapture reducing the loss (Network Planning 101, Chapter 05). Feed it recorded bookings instead of unconstrained demand and the busiest flights look like they fit on the aircraft they already have, so the model never upgauges them.

Sources

Methods: L. Weatherford and S. Pölt, "Better unconstraining of airline demand data in revenue management systems for improved forecast accuracy and greater revenues", Journal of Revenue and Pricing Management 1(3), 2002, which compares the naive, mean imputation, booking profile, projection detruncation and EM methods; P. Guo, B. Xiao and J. Li, "Unconstraining methods in revenue management systems: research overview and prospects", Advances in Operations Research, 2012 (open access), which finds EM the most accurate and robust; K. Talluri and G. van Ryzin, The Theory and Practice of Revenue Management (Springer, 2004), chapter 9. Spill: M. Z. F. Li and T. H. Oum, "Airline spill analysis – beyond the normal demand", European Journal of Operational Research 125(1), 2000. Seat counts (checked 28 September 2026, stored in unconstraining.json): Alaska Air Group current fleet for the E175 (76 seats, Horizon and SkyWest), 737-8 (159, Alaska), A321neo (189, Hawaiian) and 787-9 (300, Hawaiian), page dated 27 August 2025; Delta's A220-300 page (130 seats).

Limitations

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