Orivanta Labs • Lead engineer • 2026 • Live
OrivantaPay
Mobile money payments infrastructure for African businesses.
The problem
Businesses that want to accept mobile money end up integrating each provider separately, handling retries and callbacks themselves, and reconciling by hand when a payment's outcome is unclear.
What I built
- Merchant onboarding and applications, API keys and webhook settings
- Pay-in, pay-out and fund collections through provider gateways
- Hosted checkout and payment links, with live status pushed to the customer's page
- Signed webhooks with automatic retries and background jobs
- Merchant, admin and support consoles with an audit log
- Developer documentation and a public status page with uptime history
Engineering decisions
A payment is credited exactly once
Settling a transaction is a single conditional update that only applies while it is still pending, and the merchant's balance is credited in the same database transaction. A duplicate callback or a retry finds nothing left to settle.
Callbacks are verified, not trusted
When a provider calls back, the service asks the provider for the transaction's real status before acting, and rejects callbacks whose order reference doesn't match.
Idempotent requests
Clients send an Idempotency-Key. A retry with the same key and the same request returns the original transaction; the same key with a different request is refused.
Unclear outcomes stay pending
If a gateway reply is unreadable or the connection drops after sending, the transaction stays pending for reconciliation instead of being marked failed, which could release money that was actually sent.
Hardened edge
Redis rate limiting and response caching, constant-time secret comparison, and temporary bans for clients that probe for scanner paths or flood 404s.
Stack
What I learned
In payments, "failed" and "don't know yet" are different states, and treating the second like the first is how money goes missing. The aggregator's tests and CI (clippy with warnings as errors, tests against a real Postgres) were what made changing the money paths safe.
