Revenue Management 101: Introduction to Forecasting and Optimization

Revenue Management
Fundamentals
In this post, we introduce basic principles of airline RM systems.
Author

Bazyli Szymański & Alek Racicot

Published

April 6, 2026

What is the optimal load factor for an airline across the entire year? A friend recently got asked that exact question during a job interview for an airline revenue management department. Personally, I would have probably given a vague answer on how “it depends” on many factors (and probably would have flunked the interview by being so vague)1. But the interview question made me think about the common preconception around how airlines should always target to sell 100% of their seats. In this post, I’d like to introduce you to foundations of revenue management (RM), and show how from a revenue maximization perspective, making sure we sell all seats every time is not a good idea.

To see how RM works, let’s walk through a simple example. Consider an airline operating a single daily flight between Montreal (YUL) and Warsaw (WAW)2 that sells two types of fares: a bare-bones non-refundable promo fare at $400, and a fully refundable flex fare at $1050. To prevent business/corporate customers from buying the cheaper promo fare, the airline makes it available only until 30 days before departure (an advance purchase restriction). The assumption (made by the pricing department) is that business customers have a higher willingness to pay and tend to book closer to departure. Both fares sell the same economy class seats, making this a form of third-degree price discrimination.

The airline has already set its products (two types of fares) and prices. But it has one more lever to pull: managing inventory. When should it stop selling the promo fare? How many seats should it protect for late-arriving business passengers willing to pay $1050?

Why managing inventory matters

An airline’s inventory is finite and perishable. The aircraft operating the Montreal to Warsaw flight has just 170 economy class seats — the airline can’t add more (finite inventory, inelastic supply). And once the flight departs, every unsold seat is worthless (perishable capacity). This creates a tension: sell too many $400 promo fares early and you leave no room for $1050 flex passengers (high load factor, low yield). Protect too many seats for flex and you risk departing with empty seats that could have been sold at $400 (low load factor, high yield). The job of revenue management is to strike the right balance with the objective of maximizing total revenue.

This setup isn’t unique to airlines: any business with limited, perishable capacity — hotels, concert venues, or car rentals — faces the same trade-off. By contrast, many online retailers can replenish stock and don’t have the same perishable-capacity constraint; even though firms like Amazon use advanced pricing techniques, the perishable-capacity logic at the heart of airline RM plays a smaller role in their business.

Airline RM systems: forecasting and optimization

Most revenue management systems used by airlines today break the problem into two steps: forecasting and optimization.

  • The forecaster uses historical data (such as past bookings) to estimate how much demand there will be for each product — e.g., promo and flex fares between Montreal and Warsaw — on each upcoming flight.

  • The optimizer takes that demand forecast and calculates booking limits which are then used to quote a fare to a customer in response to a booking request3. The optimizer intends to maximize revenue, under the assumption that the forecast is correct.

This simple framework is depicted in the figure below.

flowchart LR
    F[Demand<br/>Forecaster] -->|demand forecast| O[Optimizer]
    O -->|booking limits<br/>/ prices| Q[Pricing Engine]
    Q -->|fare quotes| B[Passenger<br/>Bookings]
    B -->|historical<br/>bookings| F
Figure 1: The revenue management feedback loop.
NoteBeyond the basics

Over the past 50+ years of RM research and practice, both forecasting and optimization techniques have seen major advances — each with a significant impact on airline revenues. More recently, researchers have started moving beyond the forecast-then-optimize framework entirely, exploring RM systems that learn pricing policies directly from data using reinforcement learning or specialized neural network architectures. We’ll cover those approaches in future posts — for now, let’s focus on the foundations, which are still very much relevant today.

Real-world airlines also don’t manage a single flight in isolation. A network carrier like Delta, Air Canada, or LOT Polish needs to forecast and optimize across connecting itineraries — a much harder problem that we’ll tackle separately.

Forecasting

Let’s get our hands dirty by building a simple demand forecast for our promo and flex fares. We’ll assume that demand for upcoming flights on a given day of the week follows the same pattern as the past year of flights on that same day. The graph below shows historical bookings from the previous 52 Saturdays.

We’re keeping things simple here: no seasonal patterns, no special events like Christmas or the Montreal F1 Grand Prix4. The airline assumes that demand for each fare class is normally distributed, so all it needs to estimate are the mean and standard deviation (these are the two parameters defining a normal distribution). An analyst looks at the data and quickly concludes: an average of 115 promo bookings (std. dev. = 20) and 30 flex bookings (std. dev. = 9). In other words, promo demand \(\sim N(115, 20)\) and flex demand \(\sim N(30, 9)\). Makes sense, right?

Well, almost. What the airline is trying to forecast is demand, not bookings. The difference is subtle but important: whenever a product isn’t available for sale (say, the flight is sold out), the airline doesn’t see the customers who would have bought it. Look carefully at the graph — we never recorded more than 170 total bookings, the physical capacity of the economy cabin (we’re not overbooking just yet). In some cases, we recorded zero flex bookings — not because nobody wanted the flex fare, but because all 170 seats had already sold out in the promo fare.

So how do we deal with this incomplete (censored) data? Airlines call the fix unconstraining (sometimes detruncating): estimating how many additional customers would have purchased during the period when a product was sold out. One straightforward approach is to extrapolate from flights that weren’t sold out. For example, say 32 flex tickets were sold before the fare sold out 3 days before departure. If historically 15% of flex customers book in the final 3 days, we’d estimate about 37.6 total flex customers (32 / 0.85), adding back roughly 5.6 bookings we would have expected had seats been available.

There are more sophisticated unconstraining methods out there — projection detruncation and EM (expectation maximization) are common (see weatherford2002? for a comparison) — but the key idea is the same. After applying unconstraining, the analyst estimates true demand at roughly 122 promo customers on average (with typical day-to-day variation around 25) and about 30 flex customers on average (variation around 7). Now — how do we use this to calculate booking limits?

Optimization

The airline knows there are, on average, 30 flex customers per flight. How many seats should it protect for them? When should it stop accepting promo bookings in anticipation of those late-arriving, higher-paying passengers?

Let’s build intuition with two scenarios.

Scenario 1: The airline has already sold 169 out of 170 seats in the promo fare, 35 days before departure. With an average of 30 flex bookings still expected, you’re essentially certain to sell that last seat at $1050. Its expected value is very close to $1050 — clearly, you should not give it away for $400.

Scenario 2: 140 seats are sold, 30 remain. Will all 30 sell at the flex fare? Our forecast says we sell 30 flex tickets on average, so we’ll fill at least 30 about half the time. The expected value of that last protected seat is roughly 1/2 \(\times\) $1050 = $525 — still above $400. We should protect at least 30 seats.

More generally, we can compute the expected value of the \(n\)-th seat protected for the flex fare. The optimal protection level is the largest \(n\) where the expected revenue from selling that seat at the flex fare still exceeds the promo fare price:

\[ \mathbb{P}(D_{flex} \geq n) \times p_{flex} \geq p_{promo} \]

Based on our forecast, we should protect 32 seats. The probability of selling at least 32 flex tickets is 38.8%, giving an expected value of $407 — just above the $400 promo fare. Protecting a 33rd seat drops to 33.4% probability of selling it and an expected value of $351 — below $400, so it’s not worth it. Those 32 protected seats translate to a booking limit of 138 for the promo fare.

NoteLittlewood’s rule

This approach to two-fare-class optimization is known as Littlewood’s Rule (Littlewood 1972), developed by Ken Littlewood at BOAC (the precursor to British Airways) in 1972.

Airline booking limits are typically nested: any seat allocated to the cheaper class can also be sold in the more expensive class. So the flex fare has a booking limit of 170 (the full plane), in case some flex bookings arrive early.

What’s the optimal load factor?

Play around with the simulation below to see how booking limits and underlying demand affect revenue and load factor — and how much of a revenue difference an RM system can make.

If you played with the simulation, you may have noticed something counterintuitive: the booking limits that maximizes revenue almost never leads to filling the plane completely. On average, the revenue-maximizing policy leaves a handful of seats empty at departure — the expected optimal load factor sits below 100%.

The reason is demand variability. To capture late-arriving flex passengers, the airline has to protect seats for them — but flex demand is uncertain (it averages 30, with a standard deviation of 9). Protect enough seats to cover a high-demand day and, on a typical day, some of those seats fly empty. That empty-seat cost (spoilage) is the price the airline pays to avoid turning away $1050 passengers (spill) on the days flex demand runs high. Because each protected seat trades a certain $400 promo fare for an uncertain shot at $1050, the optimizer stops protecting seats well before the cabin is full. Push the booking limit toward a 100% expected load factor and you’d be selling cheap seats the airline would rather hold back.

So the answer to the interview question that opened this post is: it depends — but the optimal load factor is generally below 100%, and chasing a full plane usually means leaving revenue on the table. The vague “it depends” was the right instinct after all.

Takeaways

In this post, we wanted to introduce you to the core RM concepts: the forecasting-optimization framework, demand unconstraining, and the idea that remaining capacity has a calculable value that underpins most RM systems used in practice. We also tried to introduce some RM terminology. That said, if you work in RM, or even if you just buy airline tickets from time to time, you’ll notice our example was quite simplified:

  • Demand segments aren’t truly independent. We assumed promo and flex customers are completely separate groups. In practice, some leisure travelers will buy the flex fare when promo sells out, and some business travelers will buy down to the promo fare if their travel policy allows it.

  • Prices aren’t fixed. We only managed inventory — deciding how many seats to allocate to each fare — and took the fares themselves as given. This separation between pricing and inventory management is how many legacy airlines still operate. But the more interesting question is: what should the optimal price be at any given moment? Maybe the flex fare should cost $900, not $1050. Or perhaps both fares should adjust continuously as demand materializes?

  • Forecasting is hard. We made it look easy. In practice, extreme variability (events, seasonality, pure randomness), complex customer choice behavior, data sparsity (especially for network carriers), and demand endogeneity make forecasting one of the most challenging parts of the RM problem.

  • We completely ignored competition. Our model assumed demand for our flight depends only on our own fares and seat availability. In reality, passengers choose between airlines, so when a competitor cuts prices or adds capacity, some of our demand spills to them.

We’ll look into these assumptions in future posts. In the meantime, let us know what you think and what RM topics you’d like to see covered next!

If you are looking for a comprehensive treatment of different aspects of running the airline business including revenue management, see (belobaba2015?).

References

Littlewood, Kenneth. 1972. “Forecasting and Control of Passenger Bookings.” In AGIFORS Symposium Proceedings, 12:95–117.

Footnotes

  1. She got the job.↩︎

  2. Conveniently, those are the two cities where the authors of this blog are from, and at the time of writing no airline operates this route.↩︎

  3. More generally, the optimizer calculates outputs that can be used to determine fare quotes when a customer makes a booking request. Modern RM optimizers generate bid prices↩︎

  4. Montreal hosts the Canada Grand Prix Formula 1 race each year, which causes a significant demand spike. If you happen to visit Montreal at some other time, make sure to ride on the F1 track with a cityshare bike: it’s free!↩︎