| API edge and service mesh |
Envoy behind an anycast VIP, mTLS to all backends, per-merchant concurrency and fair queuing |
open source, self-hosted |
NGINX or HAProxy at the edge; a managed API gateway where one is permitted |
Per-merchant concurrency limiting, not just rate limiting, is the mechanism that contains a single merchant's sale peak |
ADR-08 |
| Idempotency key store |
Redis with 24-hour TTL, storing a request-body hash beside the resulting payment identifier |
open source, self-hosted |
A relational table with a TTL sweep, at lower volume |
A hot in-memory lookup on the critical path, where a conflicting key reuse must be detected rather than silently served |
ADR-03 |
| Durable event log |
Kafka, 5 brokers stretched across both data centres, RF 3, min.insync.replicas 2, partitioned by payment identifier, 7-year retention |
open source, self-hosted |
Redpanda; Pulsar; NATS JetStream at lower volume |
Per-payment ordering plus long retention makes the log evidence as well as transport, which is what lets any projection be rebuilt by replay |
ADR-01 |
| Ledger store |
PostgreSQL, append-only tables with UPDATE and DELETE revoked, a deferred zero-sum constraint per transaction, synchronous replication to DC-2, partitioned by period and account class |
open source, self-hosted |
A managed ledger service where permitted; CockroachDB or YugabyteDB for multi-region; TigerBeetle for pure ledger throughput |
A balance check enforced by the store catches a class of bug no amount of application test coverage reliably catches |
ADR-02 |
| Payment state store |
PostgreSQL shards keyed by a hash of merchant identifier, shard map in the config registry |
open source, self-hosted |
Vitess or Citus for managed sharding; a single large instance below a few hundred attempts a second |
The merchant is the isolation boundary, and every payment-path operation must stay inside one shard so no synchronous cross-shard transaction exists |
ADR-08 |
| Token vault and card data proxy |
Self-hosted tokenisation service on a dedicated Kubernetes cluster in its own network segment, format-preserving tokens, no PAN at rest outside it |
open source, self-hosted |
A PCI-compliant vault as a service; network tokens from the card schemes where coverage allows |
Scope reduction beats scope hardening: the application estate only ever sees tokens |
ADR-11 |
| Key custody |
Network HSM pair per data centre, FIPS 140-3, no key exportable in plaintext, used for tokenisation, provider authentication and dual-control signing |
vendor hardware |
A cloud HSM service where permitted; SoftHSM for non-production only |
An operator with full database access still cannot decrypt anything, and a dual-control approval is cryptographic evidence rather than a row |
ADR-14 |
| Routing policy registry |
Content-addressed YAML artefacts promoted through the release pipeline with commercial sign-off; active version stamped on every attempt |
open source, self-hosted |
A commercial decision-engine; a feature-flag platform for simpler weighting |
A routing decision must be reproducible from stored inputs years later, which is two columns and a registry rather than a model |
ADR-06 |
| Workforce identity |
Self-hosted OIDC provider with phishing-resistant MFA, feeding the ops console and the dual-control service |
open source, self-hosted |
A managed workforce IdP where permitted |
A payments back office is a credential-phishing target by definition, and the second approver's identity must be independently trustworthy |
ADR-14 |
| Settlement file transport |
SFTP ingest with file hashing and a run identifier, idempotent and re-runnable, restatements posting corrections |
open source, self-hosted |
Provider streaming APIs where offered, which most do not |
The file is the evidence, so ingest must be repeatable without changing the books |
ADR-05 |
| Observability |
Prometheus and Grafana for metrics, OpenTelemetry collection, Loki for logs with 400-day retention, correctness alarms separated from latency and saturation |
open source, self-hosted |
A managed observability platform where egress of operational metadata is permitted |
Only the correctness row pages: an unbalanced-transaction rejection or a bank-versus-ledger delta, not a latency percentile |
ADR-16 |
| Compute platform |
Self-managed Kubernetes, three control-plane nodes per data centre, separate cluster for the CDE |
open source, self-hosted |
A managed Kubernetes service in an in-country region where the regulator accepts the provider |
Residency, PCI scope containment and dependency approval drove it, not a preference for owned hardware |
ADR-18 |