Payment Gateway Platform
PromptPay and bank-transfer deposit gateway for the Thai market, running automated reconciliation at production scale.
Solo-built platform of ~15 services behind six operator and merchant portals. The matching and account-routing design is covered by NDA, so what is shown here is the shape of the system and the surfaces around it — not its internals.
PromptPay and bank-transfer deposits for the Thai market had to reconcile without an operator in the loop, across six merchant and operator portals. Targets: over 99% of deposits auto-matched, deposit-to-webhook under 60 s at p95.
Solo build: every commit across ~17 repos has one author, on a ~17-week plan from kickoff to GA. A small EKS cluster with about three pods of headroom. Client internals are under NDA, so the matching and account-routing design cannot be shown.
- Chose a self-built Next.js dashboard over Grafana and ArgoCD because those would add six or seven pods to a cluster with about three to spare. It reads Prometheus server-side, never exposes it, and its Release button doubles as the deploy pipeline.
- Split the single Go worker into separate ingest, webhook and worker binaries built from one image, because one ingest bug used to stall webhooks, payment expiry and snapshots together. The split needed no new repo, CI or secret.
Automated deposit reconciliation running at production scale. A 50-VU k6 run exposed lock contention failing 92% of requests; the lock was replaced with an optimistic retry on unique-constraint conflicts. Index work at ~300k rows took the hottest query from 29.8 ms to 0.06 ms.