McTaba Labs logo
Software EngineeringThe WhiteboardProjectsEventsMasterclassesWebinarsLearn
Book Call

500+ developers already in the community

Get answers, find accountability partners, and stay ahead

Join Discord →
McTaba Labs logo

Educating 1 million students in tech by 2030.

Programs

  • HighSchool Graduates Launchpad
  • AI & Business Automation
  • Corporate Training
  • McTaba Story & Mission
  • Full-Stack Curriculum
  • Course Pricing & Plans
  • Frequently Asked Questions

Resources

  • Join Discord Community
  • Tech Events in Nairobi
  • Masterclasses
  • Free Resources
  • Learn
  • Campus
  • Africa Tech Talent Report
  • Partner With Us
  • Start a Project
  • Our Work

Contact Us

  • 124 Manyani East Road, Lavington, Nairobi
  • +254727795603
  • Book a Discovery Call

Office Hours:

Mon-Fri: 9am - 2pm EAT

Sat: 10am - 12pm EAT

© 2027 McTaba Labs - A product of Edtech Industries. All rights reserved.

Privacy PolicyTerms of ServiceRefund Policy
  1. Learn
  2. Paystack for African Developers
  3. Accepting Bank Transfer Payments Through Paystack
Bonaventure OgetoBy Bonaventure Ogeto|Updated July 20, 2026

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.

In this article

  1. 1. How Bank Transfer Works
  2. 2. Initializing a Bank Transfer Transaction
  3. 3. Confirmation Timing
  4. 4. Handling Wrong Amounts
  5. 5. Temporary vs Dedicated Virtual Accounts
  6. 6. Bank Transfer UX Tips
  7. 7. Stay Up to Date

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.

Get weekly developer tips

Join 25,000+ developers. Practical guides, job tips, and new content — straight to your inbox.

No spam. Unsubscribe anytime.

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.

Learn Paystack Integration

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

Not ready? Create Free Account

Keep reading

Accepting Payments with Paystack: Complete Guide

Everything you need to accept your first payment with Paystack: choosing between Initialize Transaction and the Charge API, handling amounts in kobo, attaching metadata, setting callback URLs, and designing transaction references that keep your system clean.

Read more

Paystack Metadata: Passing Custom Data Through a Transaction

Paystack metadata lets you attach arbitrary JSON data to a transaction that flows through the entire lifecycle: from initialization to verification to webhooks. This guide shows you what to put in metadata, how to structure it for different use cases, and the limits you need to stay within.

Read more

Paystack Product API for Simple Storefronts

The Paystack Product API lets you create products with names, prices, and descriptions, then generate payment links for each one. For simple storefronts selling a handful of products, this is faster than building a full e-commerce backend. This guide covers creating products, linking them to payment pages, and knowing when to outgrow this approach.

Read more

Building a Wallet Top-Up Flow on Paystack

A step-by-step guide to building wallet top-up flows with Paystack. Initialize payment, handle webhooks, credit wallets safely, enforce minimum amounts, and prevent double-crediting in production.

Read more

Why You Must Return 200 Immediately from a Paystack Webhook

The number one Paystack webhook reliability rule: return 200 before doing anything else. This guide explains why Paystack has a timeout, what happens when you break the rule, and how to implement the respond-first-then-queue pattern in Node.js.

Read more

Explore related topics

M-Pesa & African Stack

M-Pesa Daraja API tutorials, USSD development, and WhatsApp Business API guides. The African Stack that global bootcamps do not teach.

Learn to Code in Kenya

Everything a Kenyan needs to know before writing their first line of code. Career paths, real costs, hardware requirements, and honest answers about what it takes.

Learning to Code

Roadmaps, language guides, and practical advice for learning to code and launching a programming career.

Breaking Into Tech

Practical, no-nonsense guides for anyone looking to start or change their career in tech. From choosing your first language to acing interviews.

The African Stack: Skills for This Market

The skills that make Kenyan developers hard to replace: M-Pesa, USSD, WhatsApp, fintech, and building for the African market.

Bonaventure Ogeto

Bonaventure Ogeto

Founder, McTaba Labs

Bonaventure is the founder of McTaba Labs, a coding bootcamp in Nairobi, Kenya. He has spent years building products for the African market and mentoring the next generation of developers across the continent.