2024 · Team · Production
KwikNkap
Mobile-money merchant platform on 15+ NestJS services over gRPC. Core backend and deployment orchestration.
Mission
A fintech and merchant-commerce platform for the African market: mobile money, KYC, SMS, storefronts, invoicing, savings, and delivery for small merchants who run their business from a phone.
For whom: 200+ merchants across Cameroon. Constraints: a team of four, mobile-money rails that each behave differently, regulatory KYC, and a platform that has to keep growing services without a rewrite.
Manifest
| Layer | Choice | Version | Why |
|---|---|---|---|
| services | NestJS microservices over gRPC | 11 | 15+ services with protobuf contracts; REST only at the gateways. |
| services | Keycloak | — | Federated identity, composite roles for units and RBAC. |
| data | PostgreSQL + Kysely | — | Typed queries per service; one database per bounded context. |
| infra | RabbitMQ, NATS, BullMQ | — | Durable queues for payments, fan-out for events, delayed jobs for cron. |
| infra | Docker + SOPS/age + 1Password | — | Encrypted per-environment env files with local and CI parity. |
| app | Next.js ×3 | — | Admin, merchant app, checkout. |
Decisions
An Nx monorepo of 15+ NestJS microservices over gRPC/protobuf. User, business, payment, savings, invoice, inventory, storefront, delivery, KYC, media, and cron, exposed through REST gateways with Swagger and Keycloak auth.
A shared backbone config layer. Mobile-money and card rails, KYC providers, messaging (NATS, Pusher, email, SMS), Redis/BullMQ queues, object storage, and Medusa commerce all plug in through one validated namespace.
Three Next.js apps. Admin dashboard, merchant web app with web-push and KYC onboarding, and a checkout UI.
A plug-and-play WhatsApp platform. Self-hosted Evolution API with RabbitMQ quorum queues and anti-ban guardrails.
Nudle POS for restaurants. Server-side KYC-gated onboarding, units and RBAC via Keycloak composite roles, mobile-money payments, invoicing, floor-plan persistence, a two-tier audit log, and realtime floor ops.
Impact
- Active merchants
- 200+
- Processed since 2024
- 20M+ XAF
- Microservices
- 15+
200+ active merchants and 20M+ XAF processed since 2024, with a core team of four.
What broke
Two that I remember. CI: every service build copied artefacts out of its container with docker cp into the same shared /tmp path, so two pipelines landing at once would overwrite each other and ship a service with another service’s build. Fixed by giving each job its own temp directory keyed on the pipeline id, and by making the copy step fail if the target already exists.
Auth: Keycloak federated identities carry a prefixed subject, and one service compared the raw sub against the prefixed one. Unit tests passed because they stubbed the token; real users onboarded through federation were invisible to the service. Caught in staging with a real token, fixed by normalising the subject once at the gateway and never again downstream.
Ship log
- Joined as Lead Backend Engineer
- WhatsApp platform live
- Now: 200+ merchants, 15+ services