v2.0

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

Watch the launch videoWatch

Booking 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:

  1. Payment Risk Analysis: Evaluates transaction risk based on payment method and amount, assigning higher scores to prepaid cards with large amounts.
  2. Pattern Detection: Identifies suspicious behavior patterns such as multiple rapid bookings or transactions from countries different than the account's registered location.
  3. Account History Verification: Assesses risk based on account age and previous chargeback history, with new accounts receiving higher risk scores.
  4. Risk Aggregation: Calculates a total risk score by combining individual risk factors and collects all risk reasons for review.
  5. Risk Level Classification: Categorizes transactions as low, medium, or high risk based on the total risk score.
  6. 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.

Decision graph7 nodes · read-only
input requesttable payment_risktable pattern_risktable account_riskexpression risk_calculationtable risk_levelexpression flags
01

Request

input

Only 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
  }
}
02

Payment Risk

table

Payment 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.

Decision tablefirst hit policy
Payment Methodbooking.payment_methodTransaction Amountbooking.amountPayment Risk Scorerisk.payment.scorePayment Risk Reasonrisk.payment.reason
'prepaid_card'> 200040'High-value prepaid card transaction'
'prepaid_card'-20'Prepaid card transaction'
'gift_card'> 100030'High-value gift card transaction'
'gift_card'-15'Gift card transaction'
'cryptocurrency'-25'Cryptocurrency transaction'
'credit_card'> 300015'High-value credit card transaction'

+1 more row in the downloadable template

03

Pattern Risk

table

Velocity 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.

Decision tablefirst hit policy
Recent Bookings 24haccount.bookings_last_24hAccount Countryaccount.countryPattern Risk Scorerisk.pattern.scorePattern Risk Reasonrisk.pattern.reason
> 5!= booking.ip_country50'Multiple bookings from different country'
> 5-30'Multiple rapid bookings'
> 3!= booking.ip_country35'Several bookings from different country'
> 3-20'Several rapid bookings'
-!= booking.ip_country25'Booking from different country'
--0'Normal booking pattern'
04

Account Risk

table

Account 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.

Decision tablefirst hit policy
Account Age (days)account.age_daysAccount Risk Scorerisk.account.scoreAccount Risk Reasonrisk.account.reason
< 3040'New account with significant transaction'
< 9020'Relatively new account'
> 115'Previous chargeback history'
-0'Normal account history'
05

Risk Calculation

expression

Aggregation 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.

Expressions2 fields
total_risk_scoresum( map(values(risk), #.score) )
risk_factorsmap( filter(values(risk), #.score > 0), #.reason )
06

Risk Level

table

Classification 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.

Decision tablefirst hit policy
Total risk scoretotal_risk_scoreRisk levelrisk_level
>= 70"high"
>= 30"medium"
-"low"
07

Flags

expression

Action 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.

Expressions2 fields
flags.requires_verificationrisk_level in ["medium", "high"]
flags.manual_reviewrisk_level == "high"

Make this template
your own.

Load Booking Fraud Detection into GoRules, adjust the rules to your policy, and ship it behind your own API.