Bonaventure OgetoBy Bonaventure Ogeto|

Accepting Bank Transfer Payments Through Paystack

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.

How Bank Transfer Works

When a customer selects bank transfer at Paystack checkout, the flow is:

  1. Paystack generates a temporary bank account number (usually at a partner bank like Wema or Providus)
  2. The checkout page displays the account number, bank name, and the exact amount to transfer
  3. The customer opens their banking app (GTBank, First Bank, Kuda, OPay, etc.) and initiates a transfer to that account for the exact amount
  4. The customer's bank processes the transfer
  5. Paystack's partner bank receives the funds and notifies Paystack
  6. Paystack confirms the payment and fires a charge.success webhook
  7. The temporary account expires and can no longer receive transfers

The 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.

Initializing a Bank Transfer Transaction

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.

Confirmation Timing

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);
  }
});

Handling Wrong Amounts

What happens if the customer transfers the wrong amount?

  • Less than required: The payment is not confirmed. The transaction remains pending. The customer needs to make up the difference or the transaction eventually expires.
  • Exact amount: The payment is confirmed normally.
  • More than required: Paystack's handling of overpayments may vary. The excess may be refunded according to Paystack's policy.

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).

Temporary vs Dedicated Virtual Accounts

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.

FeatureTemporary AccountDedicated Virtual Account
LifespanOne transactionPermanent
Per customerNo (per transaction)Yes
Amount flexibilityFixed per transactionAny amount
SetupAutomatic via checkoutAPI call to create
Use caseOne-time purchasesWallets, 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 UX Tips

Bank transfer involves the customer copying an account number and switching to a different app. Make this as smooth as possible:

  • Copy button: Paystack checkout includes a copy button next to the account number. If you build a custom UI, add one too.
  • Clear instructions: "Transfer exactly N5,000 to the account below using any banking app."
  • Timer: Show how long the account is valid. Creates gentle urgency and sets expectations.
  • Confirmation message: After the customer says they have transferred, show "Confirming your transfer..." with a loading indicator.
  • Fallback: If confirmation takes too long (over 5 minutes), offer the option to check status later or contact support.

Stay Up to Date

Bank transfer is the fastest-evolving Paystack payment channel. New partner banks and features are added regularly.

Sign up for the McTaba newsletter to stay informed about Paystack bank transfer updates.

Key Takeaways

  • Bank transfer is available for NGN transactions. Paystack generates a temporary bank account for each transaction.
  • The customer transfers from their banking app or USSD banking. No card needed.
  • Transfer confirmation is asynchronous. There is a delay between the transfer and Paystack confirming it.
  • The temporary account is valid for the transaction window only. After expiry or payment, it cannot receive more funds.
  • For permanent per-customer accounts, use dedicated virtual accounts instead of temporary ones.
  • Bank transfer works for customers who do not have or do not want to use cards, which is a significant portion of the Nigerian market.

Frequently Asked Questions

Which banks can customers transfer from?
Customers can transfer from any Nigerian bank that supports inter-bank transfers. This includes all major banks: GTBank, First Bank, UBA, Zenith, Access, Kuda, OPay, PalmPay, and others. The transfer goes to a Paystack partner bank (like Wema or Providus), so it is a standard inter-bank transfer.
Is there a transfer fee the customer pays?
Inter-bank transfers in Nigeria may incur small NIP (NIBSS Instant Payments) charges depending on the sending bank and the amount. These are charged by the customer bank, not by Paystack. The exact fee depends on the customer bank policies.
Can I use bank transfer for GHS, ZAR, or KES transactions?
Bank transfer as a Paystack checkout channel is currently available only for NGN (Nigeria) transactions. For other currencies, card and mobile money (GHS) are the primary channels.
What if the customer transfers after the temporary account expires?
If the temporary account has expired, the transfer may be rejected or returned by the receiving bank. The customer funds should be returned to their account, though this may take time depending on the banks involved. Expired accounts should not accept new transfers.

Ready to build real-world apps?

Join the McTaba Labs full-stack marathon (4 months full-time · 6 months part-time). Learn M-Pesa, USSD, and WhatsApp engineering while shipping 8 production apps.

Apply to the McTaba Marathon