How to accept payments for a Nigerian product (cards, USSD, transfer)
Step-by-step guide to setting up card, USSD, and bank transfer payments for your Nigerian product. Compare providers, avoid common mistakes.
How to accept payments for a Nigerian product (cards, USSD, transfer)
You've built something people want. Now they need to pay you, and you need the money to actually land in your account. That sounds simple until you realise Nigeria's payment infrastructure is fragmented: your customer might have a Visa card, or they might only have USSD, or they might prefer direct bank transfer. You can't pick one and ignore the rest. If you do, you'll leave revenue on the table.
This playbook walks you through the mechanics of accepting all three payment types for a Nigerian product—whether you're selling SaaS, physical goods, or services. We'll cover which payment gateway to use, how to integrate it, what each method costs, and the mistakes that cost founders thousands in lost transactions. By the end, you'll have a working payment setup that captures money from customers however they prefer to send it.
Why payment method diversity matters in Nigeria
Card penetration in Nigeria is lower than you might think. According to CBN data, only about 40 million Nigerians hold a bank card, but over 200 million have a phone. USSD—the # codes you dial to check balance or send money—reaches feature phones and smartphones alike. Bank transfers are instant and trusted. If you only accept cards, you're excluding the majority of your potential market.
Here's the reality: a customer in Kano on a 3G connection with N5,000 in their account won't use your card payment form if it times out. They'll use USSD instead. A Lagos professional might prefer the Paystack mobile app experience. A trader in Onitsha might send a direct transfer and screenshot it as proof. Your job is to accept all three without creating a nightmare for yourself.
Understanding the three payment methods
Cards (Visa, Mastercard, Verve)
Card payments are what most founders think of first. A customer enters their card details, the payment processor validates it with their bank, and the money moves. In Nigeria, this includes Visa, Mastercard, and Verve (the local scheme). The catch: card transactions fail more often here than in the West. Network timeouts, incorrect CVV entry, daily card limits, and 3D Secure authentication all add friction.
Typical success rate for card payments in Nigeria sits between 60–75%, depending on the processor and the time of day. That means one in four transactions might fail on the first attempt. Your customer might retry, or they might leave.
USSD (*#code)
USSD is a protocol that runs on any phone—no internet needed. A customer dials a code like 73711amount*reference# and the payment is confirmed via SMS. It's synchronous, immediate, and works on a 2G phone. The downside: USSD codes are processor-specific, the experience is unfamiliar to some users, and there's a daily limit (usually N10,000–N50,000 per transaction, depending on the customer's bank).
For a deeper dive into how USSD works and why it matters, see our guide on USSD payments in Nigeria, explained for builders.
Bank transfers
Direct bank transfer is the most trusted method in Nigeria. A customer logs into their banking app or visits an ATM, enters your account details, and sends money. It's instant (if Same-Day Settlement is enabled) or arrives within hours. There's no daily limit, and the success rate is nearly 100% once initiated. The downside: it requires manual verification on your end unless you use a processor that automates it.
Choosing a payment processor
You won't build a payment system from scratch. You'll use a payment service provider (PSP) that handles the complexity: they connect to banks, manage fraud, handle reconciliation, and give you an API or dashboard to track transactions.
The main players in Nigeria are Paystack, Flutterwave, and Moniepoint. Each has a different strength.
| Provider | Card success | USSD | Bank transfer | Fees | Best for |
|---|---|---|---|---|---|
| Paystack | 70–75% | Yes (via partner) | Yes | 1.5% + N100 | SaaS, e-commerce, high volume |
| Flutterwave | 65–70% | Yes | Yes | 1.4% + N100 | International, multi-currency |
| Moniepoint | 60–65% | Yes | Yes | 1.5% + N100 | High-risk, agent network |
For a full breakdown of how these three compare in 2026, including new features and pricing changes, read Paystack vs Flutterwave vs Moniepoint in 2026: full comparison.
Paystack
Paystack (owned by Stripe) is the most popular choice for Nigerian founders. Their API is well-documented, their dashboard is intuitive, and their customer support is responsive. They support cards, USSD (through Paga), and bank transfers. Settlement is T+1 (money arrives in your account the next business day). Fees are 1.5% + N100 per transaction for cards and transfers.
Paystack is best if you're building a SaaS product, an e-commerce store, or a service marketplace. Their integration is fastest if you're technical, and their no-code dashboard works for non-technical founders.
Flutterwave
Flutterwave is stronger on the international side—they support payments from 35+ African countries and handle multi-currency settlement. Their USSD integration is seamless. If your product attracts customers from Kenya, Ghana, or Uganda, Flutterwave is worth comparing. Fees are similar (1.4% + N100), and settlement is also T+1.
Flutterwave is best if you plan to expand beyond Nigeria or if you need to accept payments in multiple currencies.
Moniepoint
Moniepoint started as a fintech for SMEs and now offers payment acceptance. They have a large agent network and strong USSD integration. They're often cheaper for high-risk merchants (betting, forex, etc.) but less common for SaaS or e-commerce. If you're a traditional business (retail, services) and want a processor with boots on the ground, Moniepoint is worth a conversation.
If neither of these three fits your use case, explore Best Paystack alternatives for African SMEs in 2026 for other options like OPay and Kuda.
Setting up card payments
Assuming you've chosen Paystack, here's how to accept card payments.
Step 1: Create an account and verify your identity
Go to paystack.com, sign up with your email, and complete KYC verification. You'll need:
- Your BVN (Bank Verification Number)
- A valid ID (passport, driver's license, or national ID)
- Your business registration (CAC) if you're a company
- A photo of you holding your ID
Verification takes 1–3 hours. Once approved, you can create a live API key.
Step 2: Get your API keys
In your Paystack dashboard, go to Settings > API Keys & Webhooks. You'll see a Public Key and a Secret Key. The Public Key is safe to use in your frontend code. The Secret Key must never be exposed—keep it in your backend environment variables.
Step 3: Integrate the payment form
If you're not technical, use Paystack's no-code payment link: create a link in the dashboard, share it with customers, and they pay via a hosted form. Money lands in your account automatically.
If you're technical, use the API:
// Example: initialise a transaction
const response = await fetch('https://api.paystack.co/transaction/initialize', {
method: 'POST',
headers: {
'Authorization': `Bearer ${SECRET_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
email: '[email protected]',
amount: 50000, // in kobo (N500)
metadata: { order_id: '12345' }
})
});
const data = await response.json();
const paymentUrl = data.data.authorization_url;
// Redirect customer to paymentUrl
The customer is redirected to a Paystack-hosted form, enters their card details, and completes 3D Secure authentication if required.
Step 4: Handle the response
After payment, Paystack sends a webhook to your backend with the result. Set up a webhook endpoint in your code:
app.post('/webhook/paystack', (req, res) => {
const hash = crypto
.createHmac('sha512', process.env.PAYSTACK_SECRET)
.update(JSON.stringify(req.body))
.digest('hex');
if (hash === req.headers['x-paystack-signature']) {
const { event, data } = req.body;
if (event === 'charge.success') {
// Payment succeeded; update your database
console.log(`Payment of N${data.amount / 100} confirmed`);
}
}
res.sendStatus(200);
});
Step 5: Test and go live
Paystack gives you test card numbers in their docs. Use them to verify the flow works end-to-end. Once confident, flip the switch to live mode in your dashboard.
Setting up USSD payments
USSD payments are faster to integrate but require a different UX. Instead of a form, the customer receives a code to dial.
How USSD works
When a customer chooses USSD on your checkout:
- Your backend calls the Paystack API with the customer's phone number and amount.
- Paystack returns a USSD code (e.g., 7371150000*ABC123#).
- You display the code to the customer.
- The customer dials the code on their phone.
- Their bank deducts the amount and sends an SMS confirmation.
- Paystack sends you a webhook confirming the payment.
Integration steps
// Step 1: Create a USSD charge
const response = await fetch('https://api.paystack.co/charge', {
method: 'POST',
headers: {
'Authorization': `Bearer ${SECRET_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
email: '[email protected]',
amount: 50000,
mobile_money: {
phone: '08012345678',
provider: 'MTN' // or 'AIRTEL', 'GLO', 'ETISALAT'
},
ussd: true
})
});
const data = await response.json();
const ussdCode = data.data.ussd_code; // e.g., *737*1*1*50000*ABC123#
// Display ussdCode to customer
The customer dials the code, and you receive a webhook when complete.
Best practices for USSD
- Display the code prominently: Most customers will copy-paste or manually dial. Make it easy to read.
- Set a timeout: USSD payments expire after 30 minutes. Warn the customer.
- Offer a fallback: If USSD fails, let them try card or transfer.
- Test with real phones: USSD codes are phone-specific. Test on MTN, Airtel, Glo, and 9mobile if possible.
Setting up bank transfers
Bank transfers are the most straightforward to set up but require automation to scale.
Manual approach (for low volume)
- Display your bank account details at checkout.
- Customer sends the exact amount.
- You receive an SMS or email notification.
- You manually verify and fulfill the order.
This works for 1–10 transactions per day but becomes a bottleneck quickly.
Automated approach (recommended)
Use Paystack's Transfer Recipients and Bulk Transfers API to generate unique virtual account numbers for each customer:
// Create a virtual account for a customer
const response = await fetch('https://api.paystack.co/transferrecipient', {
method: 'POST',
headers: {
'Authorization': `Bearer ${SECRET_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
type: 'nuban',
name: 'Customer Name',
account_number: '0123456789',
bank_code: '011' // GTBank
})
});
const recipientCode = response.data.recipient_code;
// Store this and use it to track inbound transfers
Alternatively, use a service like Kuda or Moniepoint that assigns you a unique account number per customer. When money arrives, they notify you via API.
Best practices for transfers
- Provide clear instructions: Tell the customer the exact amount, your account name, and what reference to use.
- Use a reference code: Ask customers to include your order ID in the transfer reference. This helps you match payments to orders.
- Set a timeout: If payment doesn't arrive within 24 hours, send a reminder.
- Reconcile daily: Check your bank account and Paystack dashboard each morning to catch any mismatches.
Handling failed transactions
Not every transaction succeeds. Here's how to handle common failures.
Card declines
A card might be declined due to:
- Insufficient funds
- Daily limit exceeded
- 3D Secure failure
- Fraud block
- Expired card
Your response: Show the customer the decline reason (if available) and offer an alternative method. Paystack's dashboard shows the decline code; use it to tailor your message.
USSD timeouts
The customer might not dial the code within 30 minutes, or their network might drop mid-transaction.
Your response: Automatically retry the USSD charge or suggest they try card or transfer. Don't charge them twice.
Transfer delays
Same-Day Settlement (SDS) is now standard in Nigeria, so transfers should arrive within hours. If a transfer is delayed:
- Check the customer's bank's status.
- Ask the customer to verify the account name matches their bank's records.
- If the name doesn't match, the transfer might be rejected (Confirmation of Payee rules).
Fees and profitability
Every payment method has a cost. Plan accordingly.
Fee structure (Paystack, as of 2026)
- Cards: 1.5% + N100 per transaction
- USSD: 1.5% + N100 per transaction
- Bank transfer: 1.5% + N100 per transaction
- Settlement: Free (T+1)
On a N50,000 transaction, you pay N850 (1.5% + N100). On a N5,000 transaction, you pay N175. For low-value items, this can eat into margins.
Strategies to manage fees
- Bundle small purchases: Encourage customers to buy in batches to reduce per-transaction fees.
- Add a convenience fee: Some businesses add 2–3% for card payments and offer a discount for USSD or transfer. This is transparent and legal.
- Negotiate volume discounts: Once you're processing N1M+ per month, contact Paystack directly for lower rates.
- Use USSD for low-value items: USSD has the same fee but higher success rates for small amounts.
Real-world examples
Kola (supply chain fintech)
Kola helps traders buy and sell goods via mobile. They accept USSD and bank transfers because their users are often in secondary markets with unreliable card access. By offering USSD, they capture transactions that would otherwise fail. Their checkout defaults to USSD, with card and transfer as fallbacks.
Okada (logistics)
Okada operates a delivery network across Nigeria. They accept all three payment methods but optimise for speed: card for quick checkouts, USSD for budget-conscious users, and transfer for corporate clients. Their API integrates Paystack but routes each user to their preferred method based on history.
Common mistakes to avoid
- Only accepting cards: You'll miss 60% of your market. Offer USSD and transfer from day one.
- Not handling webhooks correctly: If your webhook endpoint is buggy, you won't know when payments succeed. Test it thoroughly.
- Storing card details: Never store raw card data. Let Paystack handle it. If you need to charge a card multiple times, use Paystack's Authorization API and store only the authorization code.
- Not reconciling: Your records and Paystack's records should match daily. Discrepancies signal fraud or bugs.
- Setting fees too high: If your convenience fee is above 3%, customers will abandon checkout. Keep it transparent and reasonable.
- Ignoring failed transactions: A 25% card failure rate means 25% of your revenue is at risk. Investigate and fix.
Testing your payment flow
Before going live, test every scenario:
- Successful card payment: Use Paystack's test card numbers.
- Failed card payment: Use test numbers that trigger specific decline codes.
- USSD payment: Test on real phones if possible; at minimum, test the webhook.
- Bank transfer: Send yourself a small amount and verify it arrives and triggers your webhook.
- Refund: Process a refund and confirm your balance decreases.
- Webhook retry: Simulate a failed webhook and verify your system retries.
Scaling and monitoring
Once you're processing payments, monitor these metrics:
- Success rate: Aim for 85%+ across all methods. Below 80% signals a problem.
- Average transaction value: Track by method. If USSD average is much lower than card, investigate why.
- Settlement time: Confirm money arrives within 24 hours.
- Chargeback rate: Keep below 1%. High chargebacks can get your account flagged.
- Failed webhooks: Monitor your webhook endpoint. If it's down, you won't know about payments.
Paystack's dashboard shows most of these metrics. Set up alerts for anomalies.
FAQ
Q: Which payment method should I prioritise? A: Start with cards and bank transfer (highest success rate and customer familiarity), then add USSD. USSD has lower success rates but reaches customers without cards. Prioritise based on your target market.
Q: Can I accept payments without a business registration? A: Paystack requires individual KYC (BVN and ID) to create an account. You can operate as a sole proprietor without CAC registration, but you'll need a personal bank account. For a company, CAC registration is required.
Q: How do I handle currency conversion if a customer is abroad? A: Paystack and Flutterwave both support international cards and will auto-convert to NGN. If you want to accept USD or GBP directly, use Flutterwave's multi-currency feature or a service like Wise for business transfers.
Q: What's the difference between USSD and bank transfer? A: USSD is synchronous (instant) and works on feature phones but has daily limits. Bank transfer is unlimited but requires a banking app or ATM. For low-value, high-frequency transactions, use USSD. For high-value or corporate payments, use transfer.
Q: How do I prevent fraud? A: Use Paystack's fraud detection (enabled by default). For high-risk transactions, enable 3D Secure. For bank transfers, verify the account name matches the customer's ID. Monitor for unusual patterns (e.g., 100 transactions in 5 minutes).
What to do next
- Compare your options: Read Paystack vs Flutterwave vs Moniepoint in 2026: full comparison to decide which processor fits your business.
- Understand USSD: If you're targeting price-sensitive users, dive into USSD payments in Nigeria, explained for builders to see if it's right for you.
- Explore alternatives: If Paystack doesn't fit, check Best Paystack alternatives for African SMEs in 2026 for other processors and use cases.
Frequently asked questions
Which payment method should I prioritise?
Can I accept payments without a business registration?
How do I handle currency conversion if a customer is abroad?
What's the difference between USSD and bank transfer?
How do I prevent fraud?
Mentioned in this article
Founder of LaunchPad. Building the home for Nigerian makers. Previously shipped Headhunter.ng and a handful of other things.