Pesalink is Kenya's instant bank-to-bank transfer network, run by IPSL under the Kenya Bankers Association. On Paystack, you enable it by including bank_transfer in the channels array when initializing a transaction. The customer selects Pesalink at checkout, picks their bank, and authorizes payment from their banking app or USSD. You receive the same charge.success webhook as any other payment method.
Pesalink is Kenya's real-time interbank payment network. It is operated by Integrated Payment Services Limited (IPSL), a company owned by the Kenya Bankers Association. When a customer pays via Pesalink, the money moves directly from their bank account to the merchant's bank account in real time. No cards, no mobile money, no float.
For most Kenyan developers, M-Pesa is the default payment method. And for good reason. More Kenyans have M-Pesa than have bank accounts. But there are transactions where M-Pesa is not the right fit:
Pesalink is not going to replace M-Pesa for everyday transactions. But for the use cases listed above, it fills a gap that M-Pesa cannot. And through Paystack, you get it as part of the same integration you already have. No separate API to learn.
Pesalink is available at most major banks in Kenya. The network currently includes over 40 banks and microfinance institutions. The banks your customers are most likely to use include:
The full list of participating banks is maintained by IPSL and can change as new institutions join the network. When a customer selects Pesalink at Paystack's checkout, Paystack presents the list of available banks. The customer picks their bank and is redirected to authorize the payment.
In practice, KCB, Equity, and Co-op Bank cover the majority of banked Kenyans. If Pesalink works with those three, you are reaching most of the addressable audience for 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.
Here is what the customer sees when they choose Pesalink at a Paystack-powered checkout:
The entire flow takes a minute or two. It is not as fast as M-Pesa STK push (which takes seconds), but it is significantly faster than manual bank transfers where the customer has to type account numbers and references.
One thing to communicate clearly to your users: Pesalink requires the customer to have an account at a participating bank and access to their banking app or USSD banking. This is obvious to developers but not always obvious to end users. A brief note like "Pay directly from your bank account" in your checkout UI helps set expectations.
On the Paystack side, Pesalink is part of the bank_transfer channel. You enable it by including bank_transfer in the channels array when you initialize a transaction.
Option 1: Transaction Initialize (server-side redirect)
const initializeWithPesalink = async (email, amountKes) => {
const response = await fetch('https://api.paystack.co/transaction/initialize', {
method: 'POST',
headers: {
Authorization: 'Bearer sk_live_YOUR_SECRET_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
email: email,
amount: amountKes * 100, // Convert to cents
currency: 'KES',
channels: ['bank_transfer', 'mobile_money', 'card'],
callback_url: 'https://yourapp.com/payment/callback',
}),
});
const data = await response.json();
// Redirect the customer to data.data.authorization_url
return data.data.authorization_url;
};
// Accept a KES 250,000 school fees payment
const checkoutUrl = await initializeWithPesalink(
'parent@example.com',
250000
);
// Redirect the user to checkoutUrl
Option 2: Paystack Inline (client-side popup)
// In your frontend JavaScript
const handler = PaystackPop.setup({
key: 'pk_live_YOUR_PUBLIC_KEY',
email: 'parent@example.com',
amount: 25000000, // KES 250,000 in kobo/cents
currency: 'KES',
channels: ['bank_transfer', 'mobile_money', 'card'],
callback: function (response) {
// Verify the transaction on your server
verifyTransaction(response.reference);
},
onClose: function () {
console.log('Checkout closed');
},
});
handler.openIframe();
The key line is channels: ['bank_transfer', 'mobile_money', 'card']. This tells Paystack to show all three payment method options at checkout. If you want to offer only Pesalink (for example, on a page specifically for high-value payments), you can pass channels: ['bank_transfer'] alone.
Your backend does not need to know which channel the customer chose. When the payment completes, you receive the same charge.success webhook regardless of the method. The webhook payload includes a channel field that tells you how the customer paid, which is useful for analytics and reconciliation but does not change your processing logic.
Verification works the same way as any other Paystack payment. You verify using the transaction reference, either through the webhook or by calling the verify endpoint directly.
const verifyTransaction = async (reference) => {
const response = await fetch(
`https://api.paystack.co/transaction/verify/${reference}`,
{
headers: {
Authorization: 'Bearer sk_live_YOUR_SECRET_KEY',
},
}
);
const data = await response.json();
if (data.data.status === 'success') {
const { amount, currency, channel } = data.data;
console.log(`Payment of ${amount / 100} ${currency} via ${channel}`);
// channel will be 'bank_transfer' for Pesalink payments
return true;
}
return false;
};
The channel field in the response will be bank_transfer for Pesalink payments. You can use this information for reporting (e.g., "45% of our payments over KES 100,000 come through Pesalink") but your fulfillment logic should not branch on it. A successful payment is a successful payment regardless of the channel.
Always verify on your server. Never rely on the client-side callback alone. This applies to Pesalink just as it applies to M-Pesa and card payments. The webhooks guide covers the full verification and webhook handling pattern.
One of the main reasons to offer Pesalink is its higher transaction limits compared to M-Pesa. Here is how the limits compare at a high level:
| Factor | M-Pesa | Pesalink |
|---|---|---|
| Per-transaction limit | Varies by user tier, generally up to KES 150,000 | Higher limits, varies by bank |
| Daily limit | KES 300,000 for most users | Depends on bank account type |
| Availability | 24/7 | 24/7 |
| Settlement to merchant | Through Paystack settlement cycle | Through Paystack settlement cycle |
Important caveats:
If your product regularly handles payments above KES 100,000, Pesalink should be a prominent option in your checkout. For school fees portals, rent collection platforms, and wholesale order systems, it is often the most practical payment method. See Building a School Fees Portal for a Kenyan School for a concrete example.
Not every checkout needs Pesalink prominently featured. Here is when it matters and when it does not.
Prioritize Pesalink when:
Pesalink is less important when:
The smart approach is to offer all available methods and let the customer choose. Use the channels array to include ['mobile_money', 'bank_transfer', 'card']. Paystack's checkout will present them in a sensible order. If you know your audience leans toward bank transfers (e.g., a B2B platform), you can adjust the UI to feature Pesalink more prominently. For guidance on payment method placement, see Why Kenyan Checkout Conversion Depends on Mobile Money Placement.
Cards (Visa, Mastercard) are another option for payments above M-Pesa limits. So when does Pesalink beat cards, and when do cards win?
Pesalink advantages over cards:
Card advantages over Pesalink:
The takeaway: offer both. Let the customer decide. Your backend code does not change either way.
Common issues you will encounter with Pesalink payments and how to handle them:
For network-level issues that affect all payment methods in Kenya, see Building for Kenyan Network Conditions: Retries and Timeouts.
Pesalink gives you a high-value payment method with minimal additional code. Here is where to go next:
If you are building payment systems for the Kenyan market, the McTaba 26-week Full-Stack Software and AI Engineering bootcamp covers payment integration as part of a complete engineering education. You build and ship products that handle real money from real Kenyan customers.
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