To accept bank transfer payments, initialize a transaction with bank_transfer in the channels array. Paystack generates a temporary bank account number and shows it on the checkout page. The customer transfers the exact amount from their banking app. Paystack confirms the transfer and fires a charge.success webhook. The temporary account expires after the transaction window.
When a customer selects bank transfer at Paystack checkout, the flow is:
charge.success webhookThe customer never shares card details, which is why many Nigerians prefer this channel. They are transferring from their own banking app, using the same interface they use for everyday transfers.
var response = await fetch('https://api.paystack.co/transaction/initialize', {
method: 'POST',
headers: {
Authorization: 'Bearer ' + process.env.PAYSTACK_SECRET_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
email: 'customer@example.com',
amount: 500000, // 5,000 NGN
currency: 'NGN',
channels: ['bank_transfer'],
callback_url: 'https://yoursite.com/payment/callback',
}),
});
var data = await response.json();
// Redirect to data.data.authorization_url
// Paystack checkout shows the temporary account details
If you include bank_transfer alongside other channels (like ['card', 'bank_transfer']), the customer can choose between card and bank transfer on the checkout page.
Paystack's checkout handles displaying the account number, bank name, and amount. It also shows a countdown timer for how long the temporary account is valid and a status indicator that updates when the transfer is confirmed.
Get weekly developer tips
Join 25,000+ developers. Practical guides, job tips, and new content — straight to your inbox.
No spam. Unsubscribe anytime.
Bank transfer confirmation is not instant. After the customer initiates the transfer from their banking app, there is a delay while the inter-bank settlement system processes it. This typically takes anywhere from 30 seconds to a few minutes, but can occasionally take longer during peak banking hours or system maintenance.
The Paystack checkout page shows a waiting indicator after the customer indicates they have transferred. When Paystack confirms the payment, the page updates and the customer is redirected to your callback URL.
From your server's perspective, the charge.success webhook is the reliable confirmation. Do not rely on the customer telling you they transferred. Wait for the webhook.
// Webhook handler for bank transfer confirmation
app.post('/webhooks/paystack', function(req, res) {
res.sendStatus(200);
var event = req.body;
if (event.event === 'charge.success') {
var channel = event.data.channel;
if (channel === 'bank_transfer') {
console.log('Bank transfer confirmed: ' + event.data.reference);
}
// Fulfill regardless of channel
fulfillOrder(event.data.reference);
}
});
What happens if the customer transfers the wrong amount?
The checkout page clearly displays the exact amount and instructions to transfer that exact amount. Most banking apps allow the customer to enter the exact figure. The most common issue is rounding: if the amount includes kobo (like 5,000.50 NGN), the customer might transfer 5,000 or 5,001.
To avoid this, consider rounding your amounts to whole Naira values when bank transfer is a primary channel. A 5,000 NGN charge (500000 kobo) is less error-prone than a 5,000.50 NGN charge (500050 kobo).
Bank transfer through Paystack checkout uses temporary accounts: one-time-use account numbers generated per transaction. For ongoing collections, Paystack offers dedicated virtual accounts (DVAs): permanent account numbers assigned to specific customers.
| Feature | Temporary Account | Dedicated Virtual Account |
|---|---|---|
| Lifespan | One transaction | Permanent |
| Per customer | No (per transaction) | Yes |
| Amount flexibility | Fixed per transaction | Any amount |
| Setup | Automatic via checkout | API call to create |
| Use case | One-time purchases | Wallets, recurring deposits |
For wallet top-up flows or apps where customers deposit money regularly, dedicated virtual accounts are the better choice. See dedicated virtual accounts implementation for the full guide.
Bank transfer involves the customer copying an account number and switching to a different app. Make this as smooth as possible:
KES 2,999
The definitive guide to building payment systems with Paystack — from your first transaction to production-grade payment infrastructure across Africa. 9 modules, 47 lessons. Free preview available.
Start Paystack Course