Fraud rings rarely act alone. A stolen card, a mule account, and a synthetic identity often share a device fingerprint, an IP range, or a beneficiary account several hops away โ connections that traditional rule-based and tabular ML models struggle to see because they evaluate each transaction in isolation.
Most fraud detection stacks score a transaction using features derived from that transaction and its immediate account history: amount, merchant category, velocity, geolocation. This works well for obvious anomalies but misses coordinated fraud, where each individual transaction looks unremarkable and only the relationships between accounts reveal the pattern.
We modeled the bank's transaction data as a heterogeneous graph โ accounts, devices, merchants, and beneficiaries as nodes, transactions and shared attributes as edges โ and trained a Graph Neural Network to learn representations that capture multi-hop relationships between entities.
Key architectural decisions:
A GNN that only works offline is a research artifact, not a fraud control. Getting inference latency low enough for real-time authorization required:
Working alongside the bank's existing fraud team, the system reduced confirmed fraud losses by 67% over the prior rules-based baseline, while keeping false-positive rates โ and the customer friction that comes with them โ within the bank's target thresholds.
Graph construction and feature engineering took longer than model training. If we were starting over, we'd invest earlier in a shared entity-resolution layer, since a meaningful share of the graph's early noise came from near-duplicate account and device identities rather than the model itself.