Inspiration

Payment infrastructure in Nigeria is fragmented. Every provider — Nomba, Paystack, Flutterwave, OPay — requires a separate SDK, a different auth flow, and a different webhook format. Businesses stay locked into one provider not because it is the best, but because switching costs too much. We watched developers spend days re-integrating payment systems just to try a new provider, and merchants lose revenue during provider outages because routing around downtime meant an emergency code deploy. We built Paye to remove that switching cost entirely.

What it does

Paye is a unified payment infrastructure layer that sits between merchant applications and multiple payment providers. Developers integrate once against Paye's single REST API or JS SDK, and from that point everything is abstracted checkout, virtual accounts, webhooks, subscriptions, and customer identity all live in Paye, not inside any single provider.

Key features: Zero code-change provider switching — toggle between Nomba, Paystack, Flutterwave, and OPay from a single dashboard click Virtual Accounts Management— provision dedicated bank accounts per customer with automatic reconciliation and real-time credit notifications Unified Webhook Proxy — all provider webhooks normalized into one consistent schema with signature verification and idempotency guarantees Misdirected Payments Dashboard— captures and flags transfers sent to expired or unknown virtual accounts so nothing is ever lost Built-in CRM— every payer tracked automatically with lifetime value and transaction history across all providers Smart Payouts — automatic fallback to an alternative provider if the active provider's payout service is down

How we built it

Backend:Go (Golang) with PostgreSQL via GORM — chosen for high concurrency, minimal memory footprint, and extreme execution speed Frontend: Next.js and TypeScript with Tailwind CSS and shadcn/ui components Auth:JWT-based authentication with separated merchant and admin contexts API:RESTful JSON with automated Swagger documentation and an interactive API playground Real-time: Server-Sent Events for instant credit notifications pushed to the merchant dashboard the moment a webhook lands Provider Integrations: Nomba, Paystack, and Flutterwave implemented through a unified Provider interface in Go, making adding new providers a structured and repeatable process

Challenges we ran into

The hardest problem was designing the VA Migration Engine. When a merchant switches providers, virtual accounts provisioned on the old provider still receive transfers from customers who were not notified of the change. We had to build a system that captures those payments, logs them as misdirected, and gives merchants visibility and resolution tools — so no funds are ever silently lost during a provider switch. Getting webhook idempotency right was equally challenging. Providers sometimes deliver the same webhook event multiple times, and our reconciliation bots needed to safely re-process dropped webhooks without double-crediting any transaction. Designing that guarantee in Go with PostgreSQL required careful use of unique constraints and soft-delete patterns.

Accomplishments that we're proud of

Built a fully working multi-provider payment infrastructure in a one-week hackathon build sprint Onboarded 16 real merchants within weeks of launch without any paid marketing Finished Top 3 out of 1,000+ participants at the Nomba x DevCareer Hackathon 2026 Selected in the top 48 of 2,290+ applications for the OPay Scholars Innovation Challenge 2026 Delivered the VA Migration Engine, misdirected payments reconciliation, and real-time SSE notifications as production-ready features within the competition timeline

What we learned

Building a multi-provider abstraction layer taught us that the hardest problems are never the happy path they are the edge cases. Card declines, expired virtual accounts, dropped webhooks, provider-specific error formats, and silent failures are where real infrastructure earns its value. We also learned that developer experience is a product decision — a well-documented, predictable API with a single webhook schema is itself a competitive advantage that makes adoption faster and stickier.

What's next for PAYE

Harden the core — smarter provider routing, faster failover, and deeper reliability across all supported providers Pricing tiers— introduce our SaaS subscription model unlocking the VA Migration Engine, advanced CRM analytics, and multi-provider load balancing for paying merchants Expand provider support — add OPay, Moniepoint, and other providers relevant to African markets Grow real usage— convert free merchants to paying users and use their feedback to shape the roadmap Enterprise whitelabeling— dedicated Paye instances for large businesses on custom domains

Built With

  • flutterwave
  • go
  • gorm
  • jwt
  • next.js
  • nomba-api
  • paystack-api
  • postgresql
  • rest-api
  • server-sent-events
  • shadcn/ui
  • swagger
  • tailwind-css
  • typescript
  • vercel
  • webhooks
Share this project:

Updates

Submission history