Bank transfers in Nigeria work through virtual account numbers generated at checkout. The customer opens their banking app (or uses USSD), transfers to the virtual account, and the payment gateway confirms the transaction via webhook. USSD payments use bank-specific shortcodes like *737# (GTBank), *901# (Access Bank), *770# (Fidelity), and *894# (First Bank). The customer dials the code, follows prompts on their phone keypad, and the bank processes the payment without internet. Both methods are supported by Paystack and Flutterwave as standard payment channels.
In most of the world, online payments mean credit or debit cards. In Nigeria, bank transfers are king. This is not a temporary trend or a quirk. It reflects how the Nigerian banking system actually works and what customers trust.
Several factors drive this:
For developers, the practical implication is clear: if your checkout only accepts cards, you are losing a significant share of potential customers. Bank transfer support is not a nice-to-have feature. It is baseline functionality for any serious Nigerian e-commerce or fintech product.
When a customer selects "bank transfer" at checkout on a Paystack or Flutterwave-powered site, the following happens behind the scenes:
Key technical considerations:
Get weekly developer tips
Join 25,000+ developers. Practical guides, job tips, and new content — straight to your inbox.
No spam. Unsubscribe anytime.
USSD (Unstructured Supplementary Service Data) is a communication protocol that works on every GSM phone, from the latest iPhone to a 10-year-old Nokia. It does not require internet access, only cellular network coverage. In Nigeria, every major bank offers USSD banking through a dedicated shortcode:
How USSD payment works for e-commerce:
USSD is slower than bank transfers. The customer has to navigate multiple text-based menus, enter their PIN, and wait for each step to process. A USSD payment that takes 30 seconds on a bank transfer can take 2 to 3 minutes via USSD. Your frontend needs to accommodate this with clear waiting indicators and a longer timeout before showing a failure message.
When to offer USSD: USSD matters most when your product serves a broad Nigerian audience, including people in areas with poor internet connectivity, older demographics who are more comfortable with phone keypads than apps, or customers on feature phones. If your audience is primarily urban, app-savvy users in Lagos, bank transfers and cards may be sufficient. But adding USSD costs nothing extra through Paystack and Flutterwave, so there is little reason to exclude it.
Both Paystack and Flutterwave treat bank transfers and USSD as payment "channels" that you enable when initializing a transaction. The core integration is the same as for card payments; you just specify which channels to offer.
With Paystack: When initializing a transaction, include a "channels" array in your request body. To offer bank transfers, include "bank_transfer". To offer USSD, include "ussd". You can combine them: ["card", "bank_transfer", "ussd"]. The Paystack checkout page will display only the methods you have enabled.
With Flutterwave: The approach is similar. When using the Flutterwave Standard (redirect) or inline checkout, you specify payment_options in the initialization payload. Include "banktransfer" and "ussd" alongside "card" as needed.
Webhook handling for both methods: The webhook payload for bank transfer and USSD payments looks the same as for card payments, with the same verification flow. The key difference is timing. Card payments trigger a webhook almost instantly. Bank transfer and USSD webhooks can arrive 10 seconds to several minutes after the customer initiates payment. Your webhook handler must be resilient to this delay.
Practical patterns for your backend:
Both Paystack and Flutterwave provide test environments where you can simulate bank transfers and USSD payments without real money moving.
Paystack test mode: Use your test secret key (sk_test_...) to initialize transactions. When the checkout shows a bank transfer option, the sandbox generates a virtual account that you can "pay" using the test dashboard's simulation tools. USSD in test mode shows a USSD code, but since you cannot actually dial it from a sandbox, Paystack provides a way to simulate the completion on their test dashboard.
Flutterwave test mode: Use your test keys (FLWSECK_TEST-...) and the staging API URL. Flutterwave's sandbox simulates bank transfer confirmations. You can trigger success or failure scenarios from the sandbox interface.
What to test:
For testing on real devices before going live, you can make small test transactions (NGN 50 to 100) using live keys. This catches issues that the sandbox cannot simulate, like actual bank processing delays and real OTP delivery times.
Understanding bank transfers and USSD is foundational for any developer building products for the Nigerian market. These are not edge-case payment methods here. They are the primary way money moves online.
If you want structured training that covers payment integration alongside the full stack of skills you need (frontend, backend, databases, deployment), McTaba Academy offers courses designed for the African market.
Start here: Tech Foundations (NGN 3,500 to 6,000; exchange rates fluctuate, check current price at checkout) covers the fundamentals every developer needs before writing their first integration.
Full payment training: Full-Stack Software & AI Engineering (NGN 140,000 to 220,000; exchange rates fluctuate, check current price at checkout) includes a dedicated payment integration module covering Paystack and Flutterwave from initialization through webhook handling and production deployment.
Or create a free account to explore the platform first.
The official documentation from Paystack and Flutterwave is also excellent. Both have dedicated sections on bank transfer and USSD integration with sample code in multiple languages.
Create a free McTaba Academy account. Access starter lessons, join the community, and explore at your own pace.
Create Free Account