Multi-currency payments in African fitness
Stripe covers 47 countries. Nigeria isn't one of them. Paystack covers Nigeria brilliantly — but try charging in South African Rand and you'll hit a wall. Flutterwave bridges some gaps but doesn't do recurring billing the way a subscription platform needs.
We built a payment routing layer that abstracts the processor entirely. When a member in Lagos subscribes to a gym plan priced in Naira, the charge goes through Paystack. When the same platform signs up a Cape Town gym charging in Rand, it routes to Stripe. The gym owner sees one dashboard.
The routing decision happens at checkout time based on three inputs: the member's country, the provider's settlement currency, and processor availability. If Paystack is down (rare, but it happens), the system fails gracefully with a retry prompt — it doesn't silently try a different processor.
Currency conversion is handled at display time, not charge time. We show approximate equivalents for discovery ('~$12/month') but always charge in the provider's native currency. This avoids the FX surprise that kills conversion in cross-border commerce.
The hardest part wasn't the routing — it was reconciliation. Three processors, three webhook formats, three settlement timelines. We built a unified ledger that normalises everything into a single schema, with a 15-minute reconciliation loop that flags discrepancies before they become support tickets.
Today we process in 8 currencies across 50+ countries. The goal isn't to replace Stripe or Paystack — it's to make the operator forget they exist.