Reevit

Payments

Process unified payments with smart routing and automated failover

Unified Payments

Reevit Payments allows you to accept funds from customers globally via a single API. We abstract away the technical debt of integrating multiple Gateways, Mobile Money providers, and Bank Transfer systems into one standardized flow.

https://dashboard.reevit.io
Live

Snapshot

Payment overview for the last 30 days

Total Volume

$429.8K

+12.5%from last period

Transactions

2,704

+8.2%from last period

Success Rate

96.8%

+0.3%from last period

Failed

18

transactions failed

Recent Payments

View all
Payment IDAmountStatusProviderMethodFeeAttemptsCreated
pay_1a2b3c4d5e6...GHS 150.00Succeeded
Paystack
CARDGHS 4.651/15 minutes ago
pay_2b3c4d5e6f7...GHS 500.00Pending
Hubtel
MOMOGHS 7.500/115 minutes ago
pay_3c4d5e6f7g8...NGN 250.00Failed
Flutterwave
CARDNGN 0.000/230 minutes ago
pay_4d5e6f7g8h9...NGN 899.00Succeeded
Monnify
CARDNGN 22.471/2about 1 hour ago
pay_5e6f7g8h9i0...NGN 1,200.00Requires Action
Paystack
BANK_TRANSFERNGN 18.000/1about 1 hour ago

🏆 The Reevit Advantage

🏢 For Business Growth

  • Maximized Acceptance: If a card fails on one provider, we instantly retry on another. Never lose a sale to a gateway outage again.
  • Optimized Fees: Route transactions to providers with the lowest processing fees based on the customer's region.
  • Unified Reporting: View your consolidated revenue across Hubtel, Paystack, and Stripe in a single dashboard.

💻 For Engineering Velocity

  • Standardized Lifecycle: No more mapping "Success" from paystack to "Completed" from Hubtel. Every transaction follows a unified state machine.
  • Developer-First SDKs: Use our typed libraries to handle payment intents, idempotency, and error handling out of the box.
  • One Integration: Add a new country or payment method by simply toggling a switch in the dashboard—no code changes required.

🔄 The Transaction Lifecycle

Every payment on Reevit follows a secure, 5-step lifecycle:

  1. Intent Created: Your server requests a Payment Intent.
  2. Smart Routing: Reevit selects the optimal connection based on your Routing Rules.
  3. Customer Action: The customer completes the required action (OTP, PIN, or 3DS).
  4. Transaction Finalized: The PSP confirms success to Reevit.
  5. Verified Webhook: Your application receives a standardized notification to fulfill the order.

🛠️ Implementation

Creating a Payment Intent

To start a transaction, use the create method in the SDK. This reserves the payment and returns a client_secret if frontend action is needed.

import { Reevit } from '@reevit/node';

const payment = await reevit.payments.create({
  amount: 1000,           // 10.00 GHS
  currency: 'GHS',
  method: 'card',         // 'card', 'momo', or 'bank'
  country: 'GH',
  customer_id: 'user_1',
  reference: 'ORD-12345',
  metadata: { 
    cart_id: '99',
    // Required for webhook routing - see below
    org_id: process.env.REEVIT_ORG_ID,
    connection_id: 'conn_xxx',
    payment_id: 'order_12345'
  }
});

// Response status: 'requires_action' | 'succeeded' | 'failed'

Required Metadata for Webhook Routing

Critical: For payment provider webhooks (Paystack, Flutterwave, etc.) to route back to Reevit correctly, you must include specific fields in the metadata object. Without these, webhooks will fail with a 400 Bad Request error.

Metadata FieldRequiredDescription
org_id✅ YesYour organization ID (from Reevit Dashboard → Settings)
connection_id✅ YesThe connection ID for the payment provider
payment_id✅ YesYour internal payment/order ID (Required for Stripe & Webhook routing)
customer_emailOptionalCustomer email for receipts

Payment Links: If you're using Reevit Payment Links, these metadata fields are automatically included. You only need to set them manually when creating payments via API or SDK.

Handling Next Actions

If a payment requires user input (like a 3D Secure redirect or a Mobile Money prompt), the status will be requires_action.

  • Redirect: For cards, the SDK provides a URL to redirect the user to finish the secure check.
  • Asynchronous (MoMo): For mobile money, the payment stays in a processing state until the customer approves the prompt on their phone.

✅ Best Practices

  1. Always use Idempotency: Provide an idempotency_key (like an Order ID) to prevent double-charging customers during network retries.
  2. Fulfill on Webhooks: Never fulfill an order based solely on a frontend redirect. Wait for the payment.succeeded webhook event.
  3. Use Test Mode: Develop your integration using pfk_test_ keys to simulate different success and failure scenarios.