GoRules Version 2 is here - redesigned, now with managed cloud.GoRules Version 2 is here!
Watch the launch videoWatchBooking Fraud Detection
Advanced risk assessment that evaluates payment methods, booking patterns, and account behavior to prevent travel reservation fraud.
Solution
This fraud detection safeguards airlines and travel agencies by analyzing multiple risk factors in booking transactions. It evaluates payment methods with specialized risk scoring for prepaid cards, gift cards, and cryptocurrency transactions. The system flags suspicious booking patterns by monitoring transaction frequency and detecting geographic mismatches between account country and IP location.
For additional protection, it analyzes account history including account age and previous chargebacks. When suspicious activity is detected, the system automatically assigns risk levels (low, medium, high) based on cumulative risk scores from all factors. High-risk bookings trigger mandatory verification requirements and can be routed for manual review, while low-risk transactions proceed normally. This multi-layered approach prevents financial losses while maintaining a smooth booking experience for legitimate customers.
How it works
The decision graph processes booking data through multiple evaluation nodes:
- Payment Risk Analysis: Evaluates transaction risk based on payment method and amount, assigning higher scores to prepaid cards with large amounts.
- Pattern Detection: Identifies suspicious behavior patterns such as multiple rapid bookings or transactions from countries different than the account's registered location.
- Account History Verification: Assesses risk based on account age and previous chargeback history, with new accounts receiving higher risk scores.
- Risk Aggregation: Calculates a total risk score by combining individual risk factors and collects all risk reasons for review.
- Risk Level Classification: Categorizes transactions as low, medium, or high risk based on the total risk score.
- Action Flags: Sets verification requirements and manual review flags based on the assigned risk level.
Where teams use it
- Airline ticket reservation systems
- Hotel booking platforms
- Car rental services
- Travel package websites
- Airport lounge access systems
- Frequent flyer program protection
Inside the decision model
Booking Fraud Detection ships as a JDM decision graph with 7 nodes, 4 decision tables and 20 rules. Download it, load it into GoRules, and run it as-is on Zen Engine.
Request
inputOnly two request objects are needed: booking carries payment_method, amount, and ip_country, while account carries country and bookings_last_24h; the three risk tables read them in parallel.
Sample requestJSON
{
"booking": {
"payment_method": "prepaid_card",
"amount": 2500,
"ip_country": "US"
},
"account": {
"country": "US",
"bookings_last_24h": 6
}
}Payment Risk
tablePayment instruments are ranked by abuse potential under first hit: a 'prepaid_card' with booking.amount above 2000 scores 40 as a 'High-value prepaid card transaction', prepaid without the amount trigger scores 20, 'gift_card' rows score 30 above 1000 or 15 otherwise, 'cryptocurrency' takes a flat 25, a 'credit_card' only registers 15 above 3000, and the catch-all writes 0 for a 'Standard transaction'.
Weighting prepaid and gift instruments hardest follows card-not-present fraud experience: both are favored cash-out tools because they detach the payment from a verifiable cardholder identity, and cryptocurrency removes chargeback recourse entirely. Credit cards score only at high amounts since issuer-side authentication already covers them; the 2000, 1000, and 3000 cutoffs are risk-team calibration, not any card-scheme mandate.
| Payment Methodbooking.payment_method | Transaction Amountbooking.amount | Payment Risk Scorerisk.payment.score | Payment Risk Reasonrisk.payment.reason |
|---|---|---|---|
| 'prepaid_card' | > 2000 | 40 | 'High-value prepaid card transaction' |
| 'prepaid_card' | - | 20 | 'Prepaid card transaction' |
| 'gift_card' | > 1000 | 30 | 'High-value gift card transaction' |
| 'gift_card' | - | 15 | 'Gift card transaction' |
| 'cryptocurrency' | - | 25 | 'Cryptocurrency transaction' |
| 'credit_card' | > 3000 | 15 | 'High-value credit card transaction' |
+1 more row in the downloadable template
Pattern Risk
tableVelocity and geography combine under first hit: account.bookings_last_24h above 5 together with account.country != booking.ip_country scores the maximum 50 as 'Multiple bookings from different country', the same velocity alone scores 30, more than 3 bookings scores 35 with a mismatch or 20 without, a mismatch by itself scores 25, and the clean row returns 0 for a 'Normal booking pattern'.
Stacking a country mismatch on top of velocity reflects how stolen-credential fraud actually presents: bursts of purchases routed through a foreign IP. More than five bookings in 24 hours would be extreme for a genuine consumer, so these thresholds are sensible business tuning; no regulation prescribes them.
| Recent Bookings 24haccount.bookings_last_24h | Account Countryaccount.country | Pattern Risk Scorerisk.pattern.score | Pattern Risk Reasonrisk.pattern.reason |
|---|---|---|---|
| > 5 | != booking.ip_country | 50 | 'Multiple bookings from different country' |
| > 5 | - | 30 | 'Multiple rapid bookings' |
| > 3 | != booking.ip_country | 35 | 'Several bookings from different country' |
| > 3 | - | 20 | 'Several rapid bookings' |
| - | != booking.ip_country | 25 | 'Booking from different country' |
| - | - | 0 | 'Normal booking pattern' |
Account Risk
tableAccount maturity feeds the third score: account.age_days under 30 scores 40 as a 'New account with significant transaction', under 90 scores 20 as 'Relatively new account', a further row on the same field scores 15 carrying the 'Previous chargeback history' reason, and the fallback returns 0 for 'Normal account history'.
Young accounts scoring highest is standard fraud logic, since fraudsters register throwaway accounts shortly before attacking, which makes age one of the strongest cheap signals available. The 30 and 90 day breakpoints are conventional review windows in risk operations rather than mandated periods.
| Account Age (days)account.age_days | Account Risk Scorerisk.account.score | Account Risk Reasonrisk.account.reason |
|---|---|---|
| < 30 | 40 | 'New account with significant transaction' |
| < 90 | 20 | 'Relatively new account' |
| > 1 | 15 | 'Previous chargeback history' |
| - | 0 | 'Normal account history' |
Risk Calculation
expressionAggregation happens in two folds over the risk object: total_risk_score sums map(values(risk), #.score) across the payment, pattern, and account branches, and risk_factors collects the reason text from every branch whose score is above 0. Keeping the human-readable reasons next to the number is what makes a later manual review actionable.
sum(
map(values(risk), #.score)
)map(
filter(values(risk), #.score > 0),
#.reason
)Risk Level
tableClassification is a simple band on total_risk_score with first hit: 70 or more maps to "high", 30 or more to "medium", and anything below falls through to "low".
Three bands are the practical minimum for a fraud queue - approve, challenge, review - and the 70/30 cut points are tuned against the upstream scores so a single strong signal lands in "medium" while it takes stacked signals to reach "high". They are operational calibration, not an industry scale.
| Total risk scoretotal_risk_score | Risk levelrisk_level |
|---|---|
| >= 70 | "high" |
| >= 30 | "medium" |
| - | "low" |
Flags
expressionAction bits come last: flags.requires_verification is set when risk_level lands in ["medium", "high"], and flags.manual_review only when risk_level == "high". Splitting the two keeps friction proportionate, with step-up verification for the middle band and human review reserved for the worst cases.
risk_level in ["medium", "high"]risk_level == "high"Other Aviation templates
View all templatesFlight Dispatch Decision System
Rules-based aviation system that evaluates weather, aircraft, crew, and weight factors to ensure regulatory compliance and safe flight operations.
AviationDynamic Airline Ticket Pricing Engine
Automated fare optimization system that sets ticket prices based on time to departure, seat availability, market demand, and competitor pricing.
AviationBooking Personalization System
Dynamic flight booking platform that tailors UI, discounts, and features based on customer loyalty status, device type, booking history, and traffic source.
Make this template
your own.
Load Booking Fraud Detection into GoRules, adjust the rules to your policy, and ship it behind your own API.