All case studies

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

Rust (Axum, sqlx, Tokio)TypeScriptHono + oRPCNext.jsPostgreSQLRedisDrizzleBetter Auth

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.

Humanity has come this far because of curiosity

© 2026 Breye Foka L. All rights reserved.