USSD Payments
Accepting USSD bank payments from Nigerian customers via Flutterwave.
USSD (Unstructured Supplementary Service Data) lets customers pay by dialing a bank code on their phone. It’s a widely used payment method in Nigeria for customers who prefer not to use card or bank transfer.
How it works
- Customer selects USSD in the checkout modal.
- Modal displays a bank selection grid.
- Customer selects their bank.
- The backend charges Flutterwave, which returns the USSD code to dial (e.g.
*329*...#). - Customer dials the code on their phone and follows the bank’s prompts.
- Flutterwave confirms the payment via webhook (or background tx_ref polling).
- Backend settles and shows success.
The entire flow happens on the customer’s phone - no app installation required.
Supported banks
The modal’s bank grid uses Flutterwave bank codes. Each bank also has a USSD shortcode (the *xxx# code customers normally dial for USSD banking) shown for reference:
| Bank | Flutterwave Code | USSD Code | Icon |
|---|---|---|---|
| Access Bank | 044 |
*901# |
access.png |
| FCMB | 214 |
*329# |
fcmb.png |
| First Bank | 011 |
*894# |
firstbank.png |
| GTBank | 058 |
*737# |
gtb.png |
| Sterling Bank | 232 |
*822# |
sterling.png |
| UBA | 033 |
*919# |
uba.png |
| Union Bank | 032 |
*826# |
union.png |
| VFD MFB | 090110 |
*5037# |
vfd.png |
| Wema Bank | 035 |
*945# |
wema.png |
| Zenith Bank | 057 |
*966# |
zenith.png |
The bank icons are served from the API host (GET /assets/banks/<icon>.png), which is mounted from the backend’s static assets directory. The exact USSD code to dial is returned by Flutterwave at charge time and may differ from the shortcode above (e.g. *329*10*08#).
Operator requirements
- Flutterwave keys: Set
FLW_SECRET_KEY_testandFLW_SECRET_KEY_livein the backend environment. - Currency: USSD is only available for NGN (Nigerian Naira) payments.
- Flutterwave account: A Flutterwave merchant account with USSD enabled.
Merchants integrating via npm install suioutkit do not need to configure anything - the hosted API handles provider setup. This section is for operators running the self-hosted backend.
Customer UX
1. Bank selection
The modal displays available banks. The customer selects their bank.
2. USSD code display
After selecting a bank, the backend charges Flutterwave and the modal shows:
- The full USSD code to dial (returned by Flutterwave)
- Instructions to dial the code and follow the prompts
- The amount to authorize
- An optional payment code to enter if prompted
3. Phone authorization
The customer:
- Opens their phone dialer
- Dials the displayed code
- Follows the bank’s voice/text prompts
- Enters their PIN to authorize
4. Confirmation
Once the bank confirms, Flutterwave sends a webhook. The modal shows the payment as confirmed and proceeds to settlement.
Limitations
- NGN only: USSD is only available for Nigerian Naira payments.
- Amount limits: Each bank has its own USSD transaction limits (typically ₦100,000 - ₦500,000 per transaction).
- Phone required: Customer must have a phone with USSD capability (any phone, not just smartphones).
- Bank-specific: Not all banks support USSD payments through Flutterwave/provider.
Testing
In test mode, Flutterwave simulates the USSD flow without requiring an actual bank call. The modal shows the same UX but the payment is confirmed immediately via simulated webhook.
FLW_MODE=test
See also
- Cross-Region Payments - accepting NGN from non-NGN customers
- Backend API - charge endpoint with
ussdmethod - Environment - Flutterwave key configuration