posts/shipping-a-fintech-app-with-expo.md · 2026-09-12
Shipping a Fintech App With Expo: What Broke
Not financial advice. Verify claims independently.
Engineering notes from the RN/APPS desk. Verify claims independently — not a verified account of any production system.
Stock Picks is our flagship React Native case study — Expo Router, FlashList, Reanimated 3, and EAS Update on a weekly release train. Here is what actually broke when we put real money quotes behind a paper-trading UI.
The fingerprint trap
EAS Update fingerprints are supposed to keep JS bundles aligned with native binaries. In practice, a single native module bump (Vision Camera, Notifee, or a custom Expo Module) invalidates every channel overnight.
We landed on an explicit fingerprint.config.js that ignores lockfile noise and pins the native tree:
/** @type {import('@expo/fingerprint').Config} */
module.exports = {
sourceSkips: ['PackageJsonScriptsAll', 'GitIgnore'],
};
Without it, OTA "worked" in CI and failed on TestFlight because embedded vs update fingerprints diverged.
Native build traps
- Hermes bytecode vs Metro sourcemaps — crash reports pointed at wrong lines until we forced consistent Hermes version across EAS profiles.
- RevenueCat + StoreKit 2 — sandbox renewals looked fine; production receipt validation needed a retry queue.
- Deep links —
stockspicks.org/appuniversal links needed bothassociatedDomainsand Android App Links assetlinks.json. Miss either and the CTA dies on cold start.
What we kept
- FlashList for watchlists (FlatList janked past ~200 rows with live ticks)
- Reanimated shared values for quote flash animations (no bridge thrash)
- EAS Update channels:
production,staging,canary - Sentry + PostHog gated by env so local builds stay quiet
Try the shipped app
The production build is live. Paper-trade with the same stack we document here:
Put it into practice
Rehearse on Stock Picks — the Expo fintech app from the team behind RN/APPS.
$ open stockspicks →