Case study · Fintech

Finding coordinated fraud rings with entity resolution and a knowledge graph

Fraud rules scored one transaction or one account at a time, while organised fraud spread across many accounts sharing devices, addresses and payees. The goal was to resolve those shared entities, connect them in a graph, and give risk models and investigators the network view the rules were missing.

Case studyFintech · Digital payments and lendingSumanta Mukhopadhyay8 min read
#knowledge-graph#ontology#streaming#data#security
CASE STUDY · CASE STUDY · FINTECH28 Oct 2026 · 01:16 GST
At a glance
SectorFintech · Digital payments and lending
My rolePrincipal architect
EngagementArchitecture, build and hand-off
ScopeStreaming, entity resolution, graph model, features, investigator tooling
What changed
  • Coordinated activity visible as connected networks rather than isolated alerts
  • Graph features available to existing risk models in real time
  • Investigators reviewing whole rings with evidence for every link
  • Entity matches explainable and correctable by analysts
KafkaSplink-style probabilistic matchingGraph databaseConnected componentsFeature storeRisk scoring serviceInvestigator UIKubernetes

Anonymised composite. Client names, identifying details and confidential figures are withheld; public facts are cited in the references.

The situation

A fintech offering accounts, cards and small loans had a mature rules engine and a transaction-level risk model. Both looked at one event or one account at a time. The losses that hurt most came from coordinated activity: clusters of new accounts opened from the same few devices, with addresses written slightly differently, paying out to a shared set of payees. Each account looked unremarkable alone. The pattern only appeared when someone noticed the connections by hand, usually after the money had moved.

The question was how to make those connections visible automatically, fast enough to matter, without replacing the decisioning stack that already worked.

What had to be true

  • Resolve before you connect: one entity per real person, device, address and payee.
  • Explainable links: every edge in a ring traceable to the evidence behind it.
  • Features, not a new decision engine: graph signals feed existing models and rules.
  • Fresh enough for onboarding and payouts, the two moments where stopping fraud pays.
  • Investigators in the loop, able to confirm, split or merge entities.

Architecture

Events
Onboardingidentity, deviceLoginsdevice, networkPaymentspayer, payeeCase outcomesconfirmed fraud
Stream
Kafka topicskeyed by entityNormalisationaddresses, names, devices
Resolve
Blockingcandidate pairsProbabilistic matchingscored, explainableAnalyst overridesmerge, split
Graph
Entity graphpeople, devices, addresses, payeesConnected componentsring candidatesGraph featuressize, proximity to fraud
Use
Feature storeonline lookupsRisk scoringexisting modelsInvestigator UIring view with evidence
Layered architecture: events are resolved into entities, connected in a graph, and returned to existing scoring as features.

Confirmed fraud outcomes from closed cases were fed back as events too, so proximity to known fraud stayed current and the risk models had better labels over time.

The graph model was kept deliberately small, a handful of entity and relationship types with clear definitions, following the approach in ontology vs knowledge graph vs semantic layer.

The data flow, end to end

  1. StreamOnboarding, login and payment events published to Kafka, keyed by source identifiers
  2. NormaliseStandardise addresses, names, phone numbers and device fingerprints
  3. ResolveBlock into candidate pairs, score matches, assign stable entity IDs with match evidence
  4. ConnectUpsert entities and relationships into the graph incrementally
  5. FeaturiseCompute component size, shared-attribute counts and distance to confirmed fraud
  6. ActFeatures served to risk scoring; high-risk rings opened as investigator cases
Entity resolution sits before the graph, so the graph only ever connects resolved entities.

Current entity state was held in compacted topics, where Kafka retains the latest value for each key, so downstream services could rebuild their view without replaying full history4. Streaming patterns are in change data capture and event streams.

The hard part: entity resolution you can defend

Matching everything to everything is quadratic, so resolution started with blocking: cheap keys that limit comparisons to plausible candidates, a well-studied family of techniques1. Matching then used a probabilistic, Fellegi-Sunter style model of the kind implemented in Splink, which scores each comparison field and can be trained without labelled pairs2. What made it defensible:

  • Every merge stored the field-level evidence and score, so an investigator could see why two records became one entity.
  • Thresholds were set separately for automatic merges and for "possible match" links that investigators saw but models treated with caution.
  • Shared infrastructure entities (a popular office address, a carrier-grade NAT IP) were flagged so they did not collapse unrelated customers into giant false rings.
  • Analyst merges and splits were written back as overrides that survived reprocessing.

Ring candidates came from connected components over the resolved graph, which groups nodes reachable from one another regardless of edge direction3. More detail in entity resolution for knowledge graphs.

In fraud work a false merge is not a modelling error, it is an accusation. Explainable matches and reversible overrides are what make a graph usable by investigators.

How it ran

Platform
  1. Resolves entities
  2. Updates graph
  3. Serves ring features
Risk scoring
  1. Reads features
  2. Scores event
  3. Opens case on high risk
Investigator
  1. Reviews ring and evidence
  2. Confirms, splits or merges
  3. Records outcome
Investigator outcomes flow back as labels and overrides.
Phase 1Model
  • Entity and relationship types
  • Known fraud cases mapped
  • Data sources inventoried
Phase 2Batch proof
  • Historical resolution
  • Rings found in past cases
  • Investigator feedback
Phase 3Streaming
  • Incremental resolution
  • Online features
  • Model integration
Phase 4Operate
  • Investigator UI
  • Override workflow
  • Runbooks and hand-off
A batch proof on historical cases before any real-time work.

Key decisions and trade-offs

DecisionAlternativeWhy
Probabilistic, explainable matchingExact keys onlyCatches variant spellings while keeping evidence for every merge
Graph features into existing modelsSeparate graph-based decision engineAdds signal without replacing a working decision stack
Small, defined graph modelLoad every attribute as a nodeFewer false connections and simpler queries
Batch proof before streamingBuild real-time firstValidates value on known cases before paying for latency
Durable analyst overridesRecompute from scratch each runHuman corrections are not lost on reprocessing

What I'd do again, and differently

Again: start with historical confirmed cases and show investigators the rings the graph would have surfaced. Differently: build the shared-infrastructure entity list on day one. It is the main source of false rings, and it is easier to design for than to clean up.

If you are considering a knowledge graph for risk or investigations, the ontology and knowledge graph page describes how I run these engagements, or analyse your challenge and bring the result to a call.

References
  1. 1
  2. 2
    Splink: probabilistic record linkage at scaleUK Ministry of Justice (GitHub)
  3. 3
  4. 4
    Log compaction (Kafka design)Confluent documentation
FAQ

Common questions

Why use a graph for fraud detection?

Organised fraud shows up as relationships: many accounts sharing a device, address or payee. A graph makes those shared connections first-class, so features like ring size and proximity to known fraud can be computed directly.

Why is entity resolution needed first?

The same person, device or address appears in slightly different forms across systems. Without resolving them into single entities, the graph fragments and the rings stay hidden.

Does the graph replace the existing fraud model?

No. It adds network features to the existing scoring and gives investigators a view of connected cases. Rules and models still make the real-time decision.

Keep reading

Related

Open to advisory, fractional CTO & select builds

Let's talk about what you're building.

The fastest route is a free 30-minute call. Prefer to write? Send a message and I'll reply personally within two business days.

Start a conversation

How would you like to reach me?

Book a 30-min callFastest. Pick any open slot on my calendar.→ Write in GmailOpens a pre-filled draft in your browser.→ Use my email appOutlook, Apple Mail or your default client.→

I reply personally within two business days. Time zones from the Americas and Europe to the Middle East and Asia-Pacific.