v1.0 Now Public Beta

Unified Payments
Centralized Logic.

Stop rebuilding payment flows for every product. ZenPay provides a single, robust engine for Paystack, Stripe, and Flutterwave routing—built for the multi-SaaS ecosystem.

Z
I
G

Powering ZenMail, InvoiceApp & GrantWise

api.zenpay.io
Z

ZenMail

Paystack

₦50,000

✓ Success

I

InvoiceApp

Stripe

₦125,000

✓ Success

G

GrantWise

Paystack

₦75,000

◌ Pending

21:53:42 → Payment routed to Paystack

21:53:43 → Webhook delivered ✓

Features

Everything you need to orchestrate payments

Built by developers who were tired of rebuilding the same payment logic across multiple products.

Smart Routing

Route payments to Paystack, Stripe, or Flutterwave based on amount, currency, or custom rules.

Unified Security

PCI-compliant key management. Rotate secrets without touching your apps.

Auto-Retry Engine

Webhooks never fail for good. Exponential backoff with smart retry logic.

Real-time Analytics

Track transaction volume, success rates, and revenue across all your applications.

Instant Notifications

Get alerted on failed transactions, suspicious activity, and webhook failures.

Multi-Currency

Accept NGN, USD, GBP, EUR and more. Automatic currency detection and routing.

For Developers

Integrate in minutes, not weeks

Our SDK handles the complexity of multi-gateway routing, automatic failover, and webhook management. Focus on your product, not payment infrastructure.

  • TypeScript SDK with full intellisense
  • Automatic gateway selection & failover
  • Webhook signature verification built-in
  • Sandbox mode for testing
payment.ts
1// Initialize ZenPay
2const zenpay = new ZenPay({
3 secretKey: process.env.ZENPAY_SECRET_KEY
4});
5
6// Create a payment
7const payment = await zenpay.payments.create({
8 amount: 50000,
9 currency: 'NGN',
10 customer: {
11 email: 'customer@example.com'
12 },
13 metadata: {
14 orderId: 'ORD-12345'
15 }
16});
17
18// Payment automatically routed to best gateway
19console.log(payment.gateway); // "paystack"
20console.log(payment.status); // "success"