v2.0

GoRules Version 2 is here - redesigned, now with managed cloud.GoRules Version 2 is here!

Watch the launch videoWatch

Dynamic Airline Ticket Pricing Engine

Automated fare optimization system that sets ticket prices based on time to departure, seat availability, market demand, and competitor pricing.

Solution

This intelligent pricing engine maximizes airline revenue by automatically setting optimal ticket prices based on multiple market factors. The system evaluates proximity to departure date, applying higher multipliers for last-minute bookings when travelers have fewer alternatives. It continuously monitors remaining seat inventory against total capacity to identify high-demand flights requiring premium pricing.

The engine incorporates real-time demand forecasts to anticipate booking patterns and adjusts prices accordingly. It also performs competitive analysis by comparing base fares against market averages to ensure prices remain attractive while maximizing revenue. By combining these factors through weighted multipliers, the system determines the final ticket price and selects an appropriate pricing strategy, from premium rates for high-demand routes to discount pricing for flights needing to boost sales.

How it works

The decision graph processes pricing data through sequential evaluation steps:

  1. Time Urgency Assessment: Analyzes days remaining until departure to apply appropriate urgency multipliers, with higher multipliers for imminent departures.
  2. Factor Calculation: Computes key metrics including seat availability ratio, demand index, and competitive positioning.
  3. Inventory-Demand Analysis: Evaluates remaining seat inventory against projected demand to determine scarcity value.
  4. Final Price Determination: Combines urgency level, demand indicators, and competitive factors to calculate the optimal ticket price.
  5. Strategy Classification: Assigns a pricing strategy label (premium, competitive_high, match_market, competitive_low, or discount) to guide marketing and sales.

Where teams use it

  • Commercial airlines optimizing revenue across routes
  • Charter flight services maximizing profitability
  • Low-cost carriers maintaining competitive pricing
  • Business class and premium cabin pricing
  • Holiday and peak season fare management
  • Route launch and new destination pricing

Inside the decision model

Dynamic Airline Ticket Pricing Engine ships as a JDM decision graph with 5 nodes, 3 decision tables and 15 rules. Download it, load it into GoRules, and run it as-is on Zen Engine.

Decision graph5 nodes · read-only
input requesttable time_urgencyexpression calculate_factorstable inventory_demandtable final_pricing
01

Request

input

Pricing runs off a flat request: daysToDepature, basePrice, availableSeats, totalSeats, demandForecast, and avgCompetitorPrice are the fields every downstream multiplier is built from.

Sample requestJSON
{
  "flightId": "FL-123",
  "routeId": "JFK-LAX",
  "daysToDepature": 1,
  "basePrice": 250,
  "availableSeats": 5,
  "totalSeats": 180,
  "demandForecast": 95,
  "avgCompetitorPrice": 25
}
02

Time Urgency

table

Booking lead time maps to a multiplier under a first hit policy on daysToDepature: under 3 days yields 1.5 and 'high' urgency, 3 to 7 days yields 1.2 and 'medium', 8 to 14 days yields 1.1 and 'low', and beyond 14 days the multiplier stays at 1.0 with 'baseline'.

Front-loading the steepest increase into the final 72 hours matches how airline revenue management prices close-in demand, where late bookers skew toward business travel with low price sensitivity. The 3, 7, and 14 day breakpoints follow conventional advance-purchase windows used in fare fencing, a common commercial choice rather than any mandated schedule.

Decision tablefirst hit policy
Days To DeparturedaysToDepatureUrgency MultiplierurgencyMultiplierUrgency LevelurgencyLevel
< 31.5'high'
>= 3 and <= 71.2'medium'
> 7 and <= 141.1'low'
> 141.0'baseline'
03

Calculate Factors

expression

Three normalized ratios come out of this step: availabilityRatio divides availableSeats by totalSeats, demandIndex scales demandForecast down by 100, and competitiveIndex divides avgCompetitorPrice by basePrice. Expressing everything as ratios lets the tables that follow use thresholds like 0.2 or 1.1 that hold for any aircraft size or fare level.

Expressions3 fields
availabilityRatioavailableSeats / totalSeats
demandIndexdemandForecast / 100
competitiveIndexavgCompetitorPrice / basePrice
04

Inventory Demand

table

Scarcity pricing kicks in when a low availabilityRatio meets a strong demandIndex, evaluated top down with first hit: under 0.2 of seats remaining with demand above 0.8 sets inventoryMultiplier to 1.3 and demandLevel to 'very_high', progressively wider bands step down through 1.2 and 1.1, flights sitting at 0.6 to 0.8 availability drop to 0.95, and the fallback row discounts to 0.9 at 'very_low'.

Pricing below base when the cabin is still mostly empty is standard load-factor management: a seat flown empty earns nothing, so stimulating bookings beats holding fare. The mirrored premium on nearly full flights captures the scarcity value of the last remaining inventory, and the specific band edges are tuning choices rather than industry-fixed constants.

Decision tablefirst hit policy
Availability RatioavailabilityRatioDemand IndexdemandIndexInventory MultiplierinventoryMultiplierDemand LeveldemandLevel
< 0.2> 0.81.3'very_high'
>= 0.2 and < 0.4> 0.71.2'high'
>= 0.4 and < 0.6>= 0.51.1'medium'
>= 0.6 and < 0.8-0.95'low'
--0.9'very_low'
05

Final Pricing

table

Everything converges here: combinations of urgencyLevel, demandLevel, and competitiveIndex select both a price formula and a priceStrategy label under first hit. 'high' urgency with 'very_high' demand and an index under 0.9 multiplies basePrice * urgencyMultiplier * inventoryMultiplier by a further 1.1 for 'premium', the middle rows settle at 'match_market' with no extra factor, weak demand with competitors above 1.2 or 1.3 times the base fare triggers 'competitive_low' at 0.95 or 'discount' at 0.9, and a final catch-all row matches the market.

Pricing on scarcity rather than the competitive set when urgency and demand peak reflects how revenue management treats the last seats on a near-sold-out departure; comparison shopping matters little to someone who must fly tomorrow. Undercutting even a higher-priced market when demand is 'low' or 'very_low' is a volume play, a plain commercial choice since fares on most routes face no regulatory pricing constraint.

Decision tablefirst hit policy
Urgency LevelurgencyLevelDemand LeveldemandLevelCompetitive IndexcompetitiveIndexFinal PricefinalPricePrice StrategypriceStrategy
'high''very_high'< 0.9basePrice * urgencyMultiplier * inventoryMultiplier * 1.1'premium'
'high','medium''high'< 1.1basePrice * urgencyMultiplier * inventoryMultiplier * 1.05'competitive_high'
'medium','low''medium'<= 1.2 and >= 0.8basePrice * urgencyMultiplier * inventoryMultiplier'match_market'
'low','baseline''low'> 1.2basePrice * urgencyMultiplier * inventoryMultiplier * 0.95'competitive_low'
'baseline''very_low'> 1.3basePrice * urgencyMultiplier * inventoryMultiplier * 0.9'discount'
---basePrice * urgencyMultiplier * inventoryMultiplier'match_market'

Make this template
your own.

Load Dynamic Airline Ticket Pricing Engine into GoRules, adjust the rules to your policy, and ship it behind your own API.