Skip to content
VERACITY
Financial services

Real-time transaction enrichment on Kafka and Scala

A card issuer's fraud team moved from overnight batch to sub-second stream enrichment using Scala, Akka Streams and Kafka.

2025·6 months·2 Scala engineers, 1 platform engineer
  • < 400ms

    p95 latency

  • 12k events/sec

    Throughput

  • 6

    Overnight jobs replaced

The challenge

A UK card issuer's fraud team was working from overnight batches. Alerts fired hours after a fraudulent pattern had run its course, and reconciliation across three source systems relied on scheduled jobs that regularly slipped their SLAs. The team needed sub-second enrichment without abandoning their existing Kafka backbone.

What we did

  • Designed a streaming architecture on Kafka with enrichment services in Scala using Akka Streams and Alpakka connectors.
  • Built type-safe schemas with Avro and the Confluent Schema Registry, breaking-change checks enforced in CI so producers can't silently break consumers.
  • Ran the services on Kubernetes (AKS) with backpressure, dead-letter queues and idempotent consumers for at-least-once semantics.
  • Instrumented end-to-end with OpenTelemetry, Prometheus and Grafana, including per-tenant SLOs the fraud team can see and challenge us on.

Results

  • End-to-end enrichment latency: overnight batch → p95 under 400ms.
  • Fraud rule engine now receives enriched events in-flight, not after the fact.
  • Zero schema-related production incidents in the six months since go-live.
  • Handover documentation and a runbook the on-call rota actually follows.

They understood Scala, they understood Kafka, and, importantly, they understood our controls environment. That combination is rarer than it should be.

Head of Fraud Platforms · UK Card Issuer
Let's talk

Ready to build?

Tell us what you need built. We'll reply within one working day with an honest answer.