Field Notes

Fintech

Building a Points Valuation Engine - Normalizing 15+ Airline Currencies into Unified Search

Avios, SkyMiles, and MileagePlus do not carry the same value. Flynt's valuation engine converts more than 15 airline loyalty currencies into cash-equivalent values so users can compare what their points are worth. It is configuration-driven, runs on the client, and completes in under 50ms.

Topic
Fintech
Year
Read
6 min

The core problem

Flynt home pagesystem cut
A consolidated points balance and flight-search entry point across bank programmes.
Proof from Flynt - Credit Card Points to FlightsOpen system

The solution

The solution is a TypeScript valuation engine that runs inside the React Native app. It makes no server round trip, works offline, and runs in under 50ms on lower-end devices.

ARCHITECTURE

  1. Airline configuration in JSON rather than code:

Each airline programme lives in one configuration object:

Decision cut / typescript
   { airline: 'British Airways', currency: 'Avios', baseCpp: 1.2, sweetSpots: [{ route: 'short-haul-europe', multiplier: 1.5 }], transferPartners: ['Chase UR (1:1)', 'Amex MR (1:1)'] }

Adding an airline means adding its JSON configuration, with no logic change. The update ships through Expo OTA.

  1. The valuation formula:

cashValue is calculated from points, baseCpp, sweetSpotMultiplier, and transferBonus.

  • baseCpp is the cents-per-point baseline, such as 1.2 cents for Avios
  • sweetSpotMultiplier is a route-specific factor, such as 1.5 for short-haul Europe on British Airways
  • transferBonus reflects the active transfer offer, such as a 30% Chase-to-British-Airways promotion
  1. Search integration:
  • Award search returns the raw points cost for each airline
  • The valuation engine assigns a cash-equivalent value to each result
  • Results are sorted by cash value rather than raw points
  • A user can compare 25,000 Avios at $300 with 22,000 SkyMiles at $242
  1. User overrides:
  • Advanced users can adjust baseCpp for each programme
  • Their preferences are stored with Zustand and AsyncStorage
  • The result can reflect a user's own approach to point valuations

PERFORMANCE

  • The engine uses pure functions, has no dependencies, and can be tree-shaken
  • The p99 benchmark is under 50ms on an iPhone SE from 2020 and a Pixel 6a
  • useMemo keys the calculation to the configuration hash, so it only runs again when that configuration changes

DEPLOYMENT

  • Expo EAS Update delivers new airline sweet spots or transfer bonuses without an App Store review
  • The configuration schema is versioned. The app validates it on load and falls back to the bundled version if it is invalid.

KEY INSIGHT

Continue conversation

Frontend problem worth thinking through?

Bring the context, including the hard parts. I am happy to talk them through.