Paystack payment channels include card (Visa, Mastercard, Verve), bank transfer (customer transfers to a temporary account), USSD (customer dials a code on their phone), mobile money (MTN MoMo, AirtelTigo, Vodafone Cash), QR code, and Apple Pay. Availability depends on your business country and currency. Card works everywhere. Other channels are market-specific.
Card payments are the baseline channel. They work in every Paystack market (Nigeria, Ghana, South Africa, Kenya) and support Visa, Mastercard, and Verve (Nigeria-only) cards. International cards are also accepted on accounts enabled for international payments.
When a customer pays by card through Paystack checkout, the flow is:
charge.success eventCard payments settle based on your account's settlement schedule. The customer sees the charge on their statement immediately (or as a pending charge), but the funds reach your Paystack balance according to the settlement cycle.
From a developer perspective, card payments require no special handling when using Initialize Transaction. Paystack's checkout manages the entire card collection, 3DS flow, and OTP flow. If you use the Charge API directly, you need to handle send_pin, send_otp, and open_url responses. See OTP and PIN flows in custom checkout for details.
Bank transfer is available in Nigeria and has become the most popular payment channel for many businesses. Instead of entering card details, the customer is shown a bank account number and transfers money from their banking app or USSD banking.
How it works:
channels: ['bank_transfer'] (or include it alongside other channels)charge.success webhookBank transfers are popular because they work without a card, do not require the customer to share card details, and many Nigerian customers are comfortable with bank transfers from their mobile banking apps.
For ongoing collections where you want a permanent account number per customer, see dedicated virtual accounts.
For a deeper look at bank transfer implementation, see accepting bank transfer payments.
Get weekly developer tips
Join 25,000+ developers. Practical guides, job tips, and new content — straight to your inbox.
No spam. Unsubscribe anytime.
USSD payments are available in Nigeria and let customers pay by dialing a code on their phone. This works on feature phones and does not require a data connection, which makes it valuable for reaching customers without smartphones.
The flow:
charge.success webhookUSSD payments are asynchronous. The customer dials the code on a separate device (their phone), and the confirmation can take anywhere from seconds to minutes. Your checkout flow needs to handle this wait time gracefully. The Paystack checkout page shows a waiting indicator and updates when the payment is confirmed.
USSD is supported by major Nigerian banks including GTBank, UBA, Zenith Bank, and First Bank, each with their own USSD format. Paystack handles the bank-specific code generation. For implementation details, see accepting USSD payments.
Mobile money is available in Ghana and is the dominant payment method in that market. It works with MTN Mobile Money (MoMo), AirtelTigo Money, and Vodafone Cash.
The flow:
charge.success webhookLike USSD, mobile money is asynchronous. The customer acts on a separate device, and there can be a delay between the prompt being sent and the customer approving. Timeout handling is important: if the customer does not approve within the provider's timeout window, the transaction fails.
Mobile money transactions are denominated in GHS (pesewas for the smallest unit). You need a Paystack account registered in Ghana to accept mobile money payments. For implementation details, see accepting mobile money payments.
QR code payments are available in Nigeria. The customer scans a QR code with a supported banking app to complete the payment.
The flow:
charge.success webhookQR payments are well-suited for point-of-sale scenarios where a physical device displays the QR code and the customer scans it with their phone. For online checkout, QR is less common because it requires the customer to use a second device to scan the screen. Still, some customers prefer it because they do not need to enter card details.
QR adoption is growing as more Nigerian banks add QR scanning to their mobile apps. For implementation details, see accepting QR payments.
Apple Pay is available across Paystack markets for customers on Apple devices (iPhone, iPad, Mac with Safari). It lets customers pay with a card stored in their Apple Wallet, authenticated by Face ID, Touch ID, or device passcode.
Setting up Apple Pay requires domain verification: you host a verification file on your domain so Apple can confirm you control the site. Once verified, Apple Pay appears as a payment option on Paystack checkout for customers on supported devices.
The user experience is fast because the customer does not type card numbers. They tap the Apple Pay button, authenticate with biometrics, and the payment completes. This can improve conversion rates on Apple devices.
Apple Pay only appears for customers on compatible devices and browsers. Other customers simply do not see the option, so it works as an additive improvement without affecting anyone else's checkout experience. For setup instructions, see Apple Pay setup and domain verification.
You do not have to support all channels. Paystack checkout shows all available channels by default, but you can restrict which ones appear using the channels parameter when initializing a transaction:
// Only show card and bank transfer
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,
currency: 'NGN',
channels: ['card', 'bank_transfer'],
}),
});
Valid channel values: card, bank, ussd, mobile_money, bank_transfer, qr, apple_pay.
Reasons to restrict channels:
For detailed guidance on channel restriction strategy, see restricting payment channels at checkout.
All channels fire the charge.success webhook when a payment completes. However, the channel field in the webhook payload tells you which method the customer used. This can be useful for analytics, reconciliation, or channel-specific post-payment logic.
// In your webhook handler
app.post('/webhooks/paystack', function(req, res) {
var event = req.body;
if (event.event === 'charge.success') {
var channel = event.data.channel;
// channel is one of: 'card', 'bank', 'ussd', 'mobile_money', 'bank_transfer', 'qr'
console.log('Payment via: ' + channel);
console.log('Amount: ' + event.data.amount);
console.log('Currency: ' + event.data.currency);
// Fulfill the order regardless of channel
fulfillOrder(event.data.reference);
}
res.sendStatus(200);
});
Your fulfillment logic should be channel-agnostic. Whether the customer paid by card, bank transfer, or mobile money, the order gets the same fulfillment. The channel field is for logging and analytics, not for branching your business logic.
One exception: if you are building dashboards or reports, knowing the channel breakdown helps you understand your customers' preferences and optimize accordingly.
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