v2.0

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

Watch the launch videoWatch

Airline Upgrade Eligibility

Advanced passenger upgrade decision engine that evaluates loyalty status, fare class, corporate agreements, and cabin availability to prioritize upgrades.

Solution

This airline upgrade system uses a point-based approach to fairly determine which passengers receive complimentary cabin upgrades. It first verifies basic eligibility by confirming ticket status, flight status, and completed check-in. For eligible passengers, the system assigns points based on three key factors: loyalty program status and accumulated miles, current fare class, and corporate agreement level.

The scoring mechanism prioritizes high-value customers, with platinum and gold loyalty members receiving the highest consideration. Passengers in premium fare classes and those from companies with premier-level corporate agreements receive additional points. The system dynamically adjusts scores based on cabin availability, increasing upgrade chances when more seats are available and restricting them during high-demand flights. This balanced approach ensures upgrades are distributed to the most valuable customers while maximizing cabin utilization.

How it works

The decision flow processes passenger information through several sequential evaluation stages:

  1. Basic Eligibility Check: Verifies ticket confirmation, active flight status, and completed check-in process.
  2. Loyalty Score Calculation: Assigns points based on loyalty tier (platinum, gold, silver, member) with additional points for higher mileage thresholds.
  3. Fare Class Evaluation: Allocates points based on the passenger's purchased fare class, with premium classes receiving more points.
  4. Corporate Agreement Assessment: Adds points for passengers traveling under corporate agreements, with premier-level agreements receiving priority.
  5. Cabin Availability Adjustment: Applies a multiplier to the total score based on available seats in the target cabin.
  6. Final Eligibility Determination: Compares the final adjusted score against thresholds to determine upgrade eligibility and type (premium or standard).

Where teams use it

  • Airlines with tiered loyalty programs
  • Business-focused carriers with corporate agreements
  • International long-haul flights with premium cabins
  • Airlines seeking to maximize premium cabin utilization
  • Carriers with sophisticated customer relationship management
  • Airlines looking to improve loyalty member satisfaction

Inside the decision model

Airline Upgrade Eligibility ships as a JDM decision graph with 7 nodes, 5 decision tables and 27 rules. Download it, load it into GoRules, and run it as-is on Zen Engine.

Decision graph7 nodes · read-only
input requesttable checkBasicEligibilitytable calculateLoyaltyScoretable calculateFareScoretable checkCorporateAgreementexpression evaluateCabinAvailabilitytable determineUpgradeEligibility
01

Request

input

Three request blocks matter: passenger carries ticketStatus, loyaltyStatus, loyaltyMiles, and fareClass; flight contributes cabinAvailability; and corporate supplies agreementLevel and upgradeEligible.

Sample requestJSON
{
  "passenger": {
    "id": "P123456",
    "name": "Jane Smith",
    "ticketStatus": "confirmed",
    "flightStatus": "scheduled",
    "checkInStatus": "completed",
    "loyaltyStatus": "gold",
    "loyaltyMiles": 82500,
    "fareClass": "premium economy"
  },
  "flight": {
    "flightNumber": "FL789",
    "departureDate": "2025-04-15",
    "route": "LHR-JFK",
    "cabinAvailability": 7
  },
  "corporate": {
    "agreementLevel": "premier",
    "upgradeEligible": true,
    "companyName": "Acme Corporation"
  }
}
02

Check Basic Eligibility

table

Gatekeeping happens before any points are scored: with first hit ordering the table returns isEligible false as soon as passenger.ticketStatus deviates from 'confirmed', with dedicated rows mapping 'cancelled' to 'Flight cancelled' and non-'completed' states to 'Check-in not completed', and only the blank catch-all confirms 'Basic eligibility confirmed'.

Running hard disqualifiers ahead of scoring mirrors how upgrade queues work in practice: a passenger without a confirmed ticket, on a cancelled flight, or not checked in cannot take a premium seat no matter their status, so filtering first keeps the scored pool clean. These are operational preconditions, not point tradeoffs, which is why they short-circuit instead of subtracting.

Decision tablefirst hit policy
Ticket statuspassenger.ticketStatusIsEligiblebasicEligibility.isEligibleReasonbasicEligibility.reason
!= 'confirmed'false'Ticket not confirmed'
'cancelled'false'Flight cancelled'
!= 'completed'false'Check-in not completed'
-true'Basic eligibility confirmed'
03

Calculate Loyalty Score

table

Points for status pair each tier with a mileage kicker under first hit: 'platinum' scores 50 with passenger.loyaltyMiles above 100000 or 40 otherwise, 'gold' scores 35 above 75000 or 30, 'silver' 25 above 50000 or 20, base 'member' 15 above 25000 or 10, and an unknown status scores 0.

Letting tier dominate with miles as a tiebreaker matches how airlines sequence complimentary upgrade lists, where published elite level orders the queue and activity breaks ties within it. The 25000 through 100000 mileage rungs echo familiar qualification bands in frequent-flyer programs, though the point values themselves are internal weighting choices.

Decision tablefirst hit policy
Statuspassenger.loyaltyStatusMilespassenger.loyaltyMilesScorescores.loyalty
'platinum'> 10000050
'platinum'-40
'gold'> 7500035
'gold'-30
'silver'> 5000025
'silver'-20

+3 more rows in the downloadable template

04

Calculate Fare Score

table

Fare paid earns its own points on passenger.fareClass: 'business' takes 30, 'premium economy' 20, 'economy flex' 15, 'economy standard' 10, 'economy basic' 5, and anything unrecognized 0, evaluated first hit down the list.

Ranking upgrade priority by fare value follows standard revenue-based upgrade logic: the passenger who paid more, or bought a flexible fare, represents more yield and is rewarded first. Giving 'economy basic' a token 5 keeps the cheapest fares technically in the queue without letting them outrank flexible tickets.

Decision tablefirst hit policy
FareClasspassenger.fareClassScorescores.fare
'business'30
'premium economy'20
'economy flex'15
'economy standard'10
'economy basic'5
-0
05

Check Corporate Agreement

table

Contracted business travel adds the final block: a corporate.agreementLevel of 'premier' with corporate.upgradeEligible true scores 25, 'standard' with the flag scores 15, any non-null agreement without the flag still collects 5, and no agreement scores 0.

Corporate deals shaping upgrade priority is common on business-heavy routes, where perks like upgrade priority are negotiated into the account relationship. Requiring the upgradeEligible flag rather than just an agreement respects that only some contracts include upgrade clauses; the residual 5 acknowledges the account without granting the perk.

Decision tablefirst hit policy
Agreement Levelcorporate.agreementLevelEligiblecorporate.upgradeEligibleScorescores.corporate
'premier'true25
'standard'true15
!= null-5
--0
06

Evaluate Cabin Availability

expression

Supply then reshapes demand: totalScore sums scores.loyalty, scores.fare, and scores.corporate, cabinMultiplier steps from 1.2 when flight.cabinAvailability exceeds 10 down through 1.0 and 0.8 to 0.5 at 2 seats or fewer, and finalScore multiplies the two. Scaling the whole queue by open seats loosens upgrades on empty premium cabins and throttles them while the inventory is still sellable.

Expressions3 fields
totalScorescores.loyalty + scores.fare + scores.corporate
cabinMultiplierflight.cabinAvailability > 10 ? 1.2 : flight.cabinAvailability > 5 ? 1.0 : flight.cabinAvailability > 2 ? 0.8 : 0.5
finalScore$.totalScore * $.cabinMultiplier
07

Determine Upgrade Eligibility

table

Four ordered conditions settle the outcome: basicEligibility.isEligible == false fails immediately and echoes the earlier reason with a score of 0, finalScore >= 75 returns 'Premium upgrade approved', finalScore >= 50 returns 'Standard upgrade approved', and the default row declines with 'Insufficient score for upgrade' while still reporting the finalScore.

Two approval thresholds turn one scale into two grades of outcome, which lets a carrier distinguish a premium from a standard upgrade without running a second model. Returning the score even on refusal is a sensible transparency choice for agents auditing the queue; the 75 and 50 cut points are calibration against the upstream point values.

Decision tablefirst hit policy
ConditionEligibleresult.isEligibleReasonresult.reasonScoreresult.score
basicEligibility.isEligible == falsefalsebasicEligibility.reason0
finalScore >= 75true'Premium upgrade approved'finalScore
finalScore >= 50true'Standard upgrade approved'finalScore
-false'Insufficient score for upgrade'finalScore

Make this template
your own.

Load Airline Upgrade Eligibility into GoRules, adjust the rules to your policy, and ship it behind your own API.