Smart routing
Route by country, method, amount or success rate. Every charge carries an ordered chain of your providers.
- GH · MoMo
- hubtel→paystack→flutterwave
- GH · Card
- paystack→hubtel→flutterwave
- NG · Card
- paystack→flutterwave
- KE · MoMo
- mpesa
Payments that don’t miss.
Mobile money, cards and bank transfers through the providers you already use — routed to the one most likely to approve, switched the moment one goes down. Built in Ghana.
Route by country, method, amount or success rate. Every charge carries an ordered chain of your providers.
The ways Ghana actually pays, in one React component.
No code. Set a price — or let the customer choose — and share it anywhere.
Renewals that collect themselves. A failed charge is retried over the next three days.
Limits and blocks enforced before any charge is attempted. Every decision logged.
One paid order sets off everything after it — receipts, the courier, the tracking link, the team.
Payments, routing decisions, webhooks and provider health — every provider, test and live.
reevit init logs you in, installs the SDK, wires your env and writes working checkout and webhook code. Then reevit doctor proves it with a real sandbox payment.
$ npm install -g @reevit/cli$ reevit init✓ Logged in · approved in your browser✓ Detected Next.js✓ Installed @reevit/node @reevit/react✓ Wrote .env.local · API key, org ID, webhook secret✓ Created src/lib/reevit.ts✓ Created src/app/api/reevit/checkout/route.ts✓ Created src/app/api/webhooks/reevit/route.ts✓ Created src/components/reevit-checkout-button.tsx $ reevit doctor --e2e✓ Sandbox payment delivered to your handler · signed✓ Tampered event rejectedReady. No real money moved.
import Reevit from '@reevit/node';
const reevit = new Reevit('pfk_live_…', 'org_…');
// One request — Reevit picks the provider and fails over for you.
const payment = await reevit.payments.createIntent(
{
amount: 45000, // GHS 450.00, in pesewas
currency: 'GHS',
method: 'mobile_money',
country: 'GH',
customer_id: 'cust_123',
},
{ idempotencyKey: 'order_8817' },
);
console.log(payment.id, payment.status);
import { useState } from 'react';
import { ReevitCheckout } from '@reevit/react';
import '@reevit/react/styles.css';
export function BuyButton() {
const [open, setOpen] = useState(false);
return (
<>
<button onClick={() => setOpen(true)}>Pay GHS 450.00</button>
<ReevitCheckout
publicKey="pfk_test_…"
amount={45000} // GHS 450.00, in pesewas
currency="GHS"
phone="+233201234567"
isOpen={open}
onOpenChange={setOpen}
onSuccess={(result) => unlockOrder(result)}
/>
</>
);
}
import { verifyWebhookSignature } from '@reevit/node';
export async function POST(request: Request) {
const body = await request.text();
const signature = request.headers.get('x-reevit-signature');
// Reject anything Reevit didn't sign.
if (!verifyWebhookSignature(body, signature, process.env.REEVIT_WEBHOOK_SECRET)) {
return new Response('invalid signature', { status: 401 });
}
const event = JSON.parse(body);
if (event.type === 'payment.succeeded') {
await markOrderPaid(event.data.reference);
}
return Response.json({ received: true });
}
Connect the accounts you already have. Reevit routes the charge; the money settles with your provider, exactly like today.
Ghana · Nigeria
Ghana
Ghana
Ghana · Nigeria · Kenya
16 African markets
Kenya
Nigeria
International
Payments settle straight into your own provider account. Reevit routes charges; it never holds funds.
Customers enter cards with the provider and approve mobile money on their phone. Your keys are stored encrypted.
Made by the CSS team, on the rails Ghana actually uses — for the businesses around us.
We built payments for Harbour Price and Miss Cookie Spices. Every provider outage cost them orders. So we built the layer we kept wishing for.
Running an online business is already difficult. Payments should not add to that stress. Reevit improved our payment process, which gave me the confidence to sell more online.