Resid+
Resid+ is a booking platform serving six African countries, shipping on iOS and Android. I built the backend and the payments integration - which in this market means supporting the wallets people actually use rather than assuming a card.
- Year
- 2024
- Role
- Backend, payment gateway integration
- Context
- Client product
- Category
- Marketplace

Listings across six markets.
Card penetration is low across the target markets. A booking flow that ends at a card form ends at abandonment. The platform had to accept Orange, Wave, Moov and other regional methods, and hold inventory correctly while a payment on any of those rails was still in flight.
Payments route through Paydunya, which fronts the regional wallet networks behind a single integration. Bookings hold inventory on a provisional state, confirmed only on a verified payment callback and released automatically if the payment never lands. Authentication is JWT-based, and Socket.IO delivers booking and payment updates without the client polling.
How the pieces fit.
API
Express.js services for listings, bookings and payment orchestration.
Payments
Paydunya covering Orange, Wave, Moov and other regional methods.
Data
MongoDB for listings, availability and booking records.
Auth
JWT-based authentication with scoped tokens.
Realtime
Socket.IO for booking confirmations and notifications.
Deployment
- Hosted on DigitalOcean
- Domain registered with Namecheap and connected via DNS
- Nginx as reverse proxy and for server management
- Regional payment methods - Orange, Wave, Moov and others - through one gateway integration
- Provisional inventory holds released automatically when payment does not complete
- JWT authentication with scoped access
- Real-time booking and notification updates over Socket.IO
The parts that were not obvious at the start.
- 01
Holding inventory against a slow payment
Mobile money confirmations are not instant. Confirming a booking optimistically risks double-selling a property; blocking until settlement risks losing the customer. Provisional holds with automatic expiry gave both sides a bounded, predictable window.
- 02
Six countries, one product
Currency, available payment methods and settlement behaviour all vary by market. Keeping that variation in configuration rather than in branching logic kept the booking code readable as the country list grew.
- Live on the App Store and Google Play
- Serving bookings across six African markets
- Localisation is a payments problem before it is a language problem.
- An expiring provisional state solves more consistency problems than a distributed transaction would have.