A bank account
for every customer.
Auto-matched. Instant.
Assign a dedicated bank account number to every customer, order, or merchant. Incoming transfers are automatically matched to the right record — no manual reconciliation, no reference errors.
Virtual accounts
3 of 1,000 shownKwame Asante
GCB Bank · 200-441-8821
TechApp Ltd.
GCB Bank · 200-441-8822
Ama Serwaa Ltd.
Stanbic Ghana · 200-441-8823
Bank transfer details — share with customer
Live inbound transfers
99.8%
Auto-match rate
< 1s
Match time
50+
Banks
99.8%
Auto-match rate
< 1s
Match speed
50+
Partner banks
10+
Countries
∞
Accounts per org
99.9%
Uptime SLA
What is a virtual account?
A real account number.
Zero bank paperwork.
A virtual account is a dedicated bank account number that you generate via API and assign to any entity — a customer, an order, a merchant, or a project. It looks and works exactly like a real bank account: customers transfer money to it from any bank in the country.
The difference: when money arrives, Sendexa automatically identifies which account was credited, matches it to your customer record, and fires a webhook to your server — all in under a second. No manual bank statement parsing, no ambiguous references, no reconciliation backlog.
Each account has a unique number — no shared reference ambiguity
Works with any local bank's internet banking or mobile app
Customer experience is identical to a normal bank transfer
You hold one master account; all VA credits flow through it
Generate as many accounts as you need — no per-account fee
❌ Without virtual accounts
Ref: "payment for invoice"
⚠ Which invoice? Amount mismatch?
Ref: "transfer"
⚠ Same amount — which customer?
Ref: "4500"
⚠ Off by 1 — accept or reject?
Hours of manual reconciliation per week.
✓ With Sendexa virtual accounts
→ cust_001 · GHS 4,500
Webhook fired in <1s
→ cust_003 · GHS 4,500
Webhook fired in <1s
→ cust_009 · GHS 4,499
Webhook fired in <1s
Zero manual reconciliation. Every time.
Account types
Four account types.
Every collection scenario.
Customer accounts
Assign one permanent virtual account to each customer. All their payments — invoices, subscriptions, top-ups — arrive in one place and are matched automatically.
Order / invoice accounts
Create a fresh virtual account for each order or invoice. Once payment is received (or the account expires), it's automatically closed. Perfect for one-off collection.
Merchant / sub-merchant accounts
For marketplace and platform operators: give every merchant their own virtual account. Funds flow in, splits are applied, and net amounts are disbursed automatically.
Treasury / pooling accounts
Create virtual accounts mapped to internal cost centres, departments, or projects. Route inter-company transfers without needing multiple physical bank accounts.
Auto-reconciliation
Transfer arrives.
Your system knows in 1 second.
The entire reconciliation pipeline — from the customer's bank transfer to your webhook — takes under two seconds. No polling. No cron jobs. No manual statement downloads.
No reference number ambiguity — each account is unique per customer
Handles partial payments and over-payments with configurable rules
Configurable match rules: exact amount, threshold, or any amount
Full audit log of every credit, match attempt, and webhook delivery
Manual override available for edge cases from the dashboard
Transfer initiated
0ms▶Customer logs in to their bank and transfers to the unique account number you provided them.
Bank clearing
~800msThe transfer clears through the national clearing network (GhIPSS, NIBSS, Pesalink) to the Sendexa pool account.
Account identification
< 50msSendexa's engine identifies the destination virtual account number from the incoming transaction.
Customer record matched
< 10msThe virtual account maps to your customer, order, or merchant record. Balance is updated instantly.
Webhook fired
< 1sA signed virtual_account.credited webhook fires to your endpoint within 1 second of the transfer arriving.
Your system fulfils
~1.2sYour server processes the event — activates a subscription, marks an invoice paid, or triggers a payout.
What's included
Everything for
zero-touch collection.
Instant account provisioning
Generate a virtual account number in under 100ms via API. No manual bank paperwork, no waiting period, no approval queue.
Auto-matching engine
Every incoming transfer is matched to the correct virtual account in milliseconds. 99.8% auto-match rate across all supported banks.
Real-time webhooks
Every credit fires a virtual_account.credited webhook within 1 second. Includes full transfer metadata — sender, bank, amount, timestamp.
Multi-bank coverage
Virtual accounts are issued across 50+ local banks in Ghana, Nigeria, Kenya, and beyond. Customers can transfer from any bank in the country.
Flexible match rules
Configure exact-amount matching, threshold tolerance (e.g. ±5%), or any-amount acceptance. Set expiry and overpayment handling per account.
Account lifecycle management
Set expiry times on temporary accounts — they auto-deactivate after the deadline or after a payment is received. Permanent accounts can be closed via API.
Balance & ledger API
Query real-time balance on any virtual account. Pull full transaction history with pagination and date filters. Export to CSV or push to your data warehouse.
Multi-currency support
Provision virtual accounts in GHS, NGN, KES, XOF, and USD. Each currency settles independently. FX conversion available for cross-currency flows.
Dashboard & audit trail
Every credit, webhook, and override is logged with full timestamps and metadata. Filter by date, account, amount, or status. Download for compliance audits.
Developer experience
Three API calls.
Full automation.
Create an account, give the details to your customer, then handle the webhook when they pay. SDKs for Node.js, Python, PHP, and direct REST.
POST /v1/virtual-accounts — get an account number in < 100ms
Share account number, bank, and name with your customer
Handle virtual_account.credited webhook — payment confirmed
import Sendexa from "sendexa";
const client = new Sendexa(process.env.SENDEXA_API_KEY);
// 1. Create a virtual account for a customer
const va = await client.virtualAccounts.create({
customer_id: "cust_001",
label: "Kwame Asante",
currency: "GHS",
bank: "gcb", // preferred bank
type: "permanent", // or "temporary"
match_rule: "exact", // "exact" | "any" | "threshold"
notify: {
webhook: "https://myapp.co/webhooks/sendexa",
email: "kwame@techapp.gh",
},
metadata: { plan: "pro", invoice_id: null },
});
console.log(va.account_number); // → "200-441-8821"
console.log(va.bank_name); // → "GCB Bank"
console.log(va.account_name); // → "Sendexa / Kwame Asante"
// Share these details with your customer.
// They transfer from any bank in Ghana.
// 2. Handle the webhook when payment arrives
app.post("/webhooks/sendexa", async (req, res) => {
const event = req.body;
if (event.event === "virtual_account.credited") {
const { customer_id, amount, currency, sender, bank } = event.data;
// Mark invoice paid, activate plan, etc.
await markInvoicePaid(customer_id, amount);
console.log(`${currency} ${amount} received from ${sender.name} (${bank})`);
}
res.json({ received: true });
});
// 3. Query account balance & history
const balance = await client.virtualAccounts.balance("va_8821");
const history = await client.virtualAccounts.transactions("va_8821", {
from: "2025-01-01",
to: "2025-03-31",
limit: 50,
});Use cases
Virtual accounts power
every collection model.
B2B invoice collection
Assign one permanent virtual account per business customer. Every invoice they settle — regardless of amount — is matched to the right record automatically.
Wallet top-up
Give every app user a unique account number. When they transfer from their bank, their in-app wallet is credited in real time — no manual verification.
E-commerce orders
Create a temporary virtual account for each order at checkout. Once paid, it deactivates. Eliminates bank transfer ambiguity for customers who prefer bank transfers over cards.
Marketplace settlement
Each merchant on your platform gets their own virtual account. Payments from their buyers are credited there, then you split and disburse net amounts on a schedule.
School fee collection
Assign a virtual account per student or per fee type. Payments from any bank are auto-matched to the right student record — no teller, no manual entry.
Lending & loan repayment
Create a virtual account per loan. Borrower repayments are matched to the right loan — principal, interest, and fees calculated automatically.
Cooperative collections
Each cooperative member gets a unique account. Dues, levies, and savings contributions are auto-matched without requiring a treasurer to reconcile manually.
Rent & property management
One virtual account per tenancy. Monthly rent payments from any bank are automatically matched, timestamped, and reported — landlord gets notified instantly.
Project / escrow funding
Issue a virtual account for each project. Milestones are funded progressively — release to the contractor when conditions are met via your webhook handler.
Security & compliance
Bank-grade infrastructure.
Built for regulated money flows.
Virtual accounts involve real money movement through licensed banking infrastructure. Sendexa operates as a licensed payment service provider, regulated in every market we operate in.
Licensed payment service provider — Bank of Ghana, CBN, CBK regulated
All funds held in segregated trust accounts at tier-1 banks
AML / KYC checks on account provisioning where required by regulation
Full audit trail per virtual account — exportable for compliance
HMAC-SHA256 signed webhooks to verify event authenticity
End-to-end TLS 1.3 encryption on all API traffic
PSP Licensed
Bank of Ghana
Regulated payment service provider in Ghana
PSP Licensed
CBN Nigeria
Licensed under Central Bank of Nigeria frameworks
Segregated funds
Tier-1 banks
Client funds held separate from operational accounts
AML compliant
KYC enforced
Anti-money laundering checks on every account open
TLS 1.3
In transit
All API traffic encrypted — no legacy protocols accepted
HMAC signed
Webhooks
Every event payload signed and verifiable in one line
Pricing
Simple per-credit pricing.
Accounts are free to create.
Create unlimited virtual accounts at no cost. Pay only when a credit is received and matched.
Starter
Up to 500 credits / month
per credit received · GHS 0.50 min
Perfect for small teams and pilots
Get startedGrowth
500–10,000 credits / month
per credit received · GHS 0.30 min
Automated reconciliation at scale
Get startedAccount creation
Create unlimited virtual accounts at zero cost. Provisioning is free — you only pay on successful credits.
Volume discounts
Credits above 10,000 per month automatically attract lower rates. No renegotiation required.
No hidden fees
The percentage you see covers matching, webhooks, and settlement. No per-webhook fee, no setup cost.
Eliminate reconciliation.
Start collecting.
Get your API key, create your first virtual account in under 100ms, and receive your first auto-matched transfer — all without writing a reconciliation script.