One integration, every rail your customers reach for
Accepting a card payment in London and a Mobile Money payment in Douala look identical to your customer: they approve, you get paid. Underneath, they could not be more different. Cards settle through acquirers and schemes. Mobile Money runs on carrier ledgers with their own state machines. Bank transfers clear on rails that were never designed for real-time commerce.
The cost of three integrations
Most teams end up wiring each rail separately. Three sets of credentials, three retry policies, three webhook shapes to reconcile. Every new market multiplies the surface area you maintain instead of the product you ship.
We took the opposite position: one payment object, one lifecycle, one signed webhook. Whether the money moved over MTN Mobile Money or Visa, your code reads the same fields and reacts to the same events.
What stays the same
- A single
paymentresource with a predictable status lifecycle. - One webhook signature scheme, verified the same way for every rail.
- Idempotency keys that behave identically across providers.
Adding a market becomes a configuration change, not a rewrite. That is the whole point of building on rails instead of around them.