Pesalink transfers through Paystack let you send instant bank-to-bank payments in Kenya. The recipient sees the money in their bank account within seconds. Pesalink has per-transaction limits, so it is best for transfers below those thresholds. For larger amounts, standard interbank transfers are the alternative. Create recipients with the appropriate bank code and KES currency, then initiate the transfer as usual.
Pesalink is a real-time payment platform operated by the Kenya Bankers Association (KBA). It connects member banks and enables instant interbank transfers. Unlike standard interbank clearing, which batches and processes transfers over hours, Pesalink settles each transaction individually and in real time.
For developers, Pesalink through Paystack means you can send money from your Paystack KES balance to a recipient's bank account and have it arrive in seconds. No waiting for batch clearing cycles. No next-business-day delays. The recipient sees the credit in their bank account almost immediately.
Most major Kenyan banks are Pesalink members, including Kenya Commercial Bank, Equity Bank, Co-operative Bank, Absa Kenya, Standard Chartered Kenya, and many others. The KBA continues to add member banks. If the recipient's bank is a Pesalink member, the transfer goes through the Pesalink rail. If not, it falls back to standard interbank clearing.
Pesalink recipients are created the same way as standard Kenyan bank recipients. The routing to Pesalink happens based on the bank's Pesalink membership and the transfer amount being within Pesalink limits.
const createPesalinkRecipient = async (name, accountNumber, bankCode) => {
var response = await fetch('https://api.paystack.co/transferrecipient', {
method: 'POST',
headers: {
Authorization: 'Bearer ' + process.env.PAYSTACK_SECRET_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
type: 'nuban',
name: name,
account_number: accountNumber,
bank_code: bankCode,
currency: 'KES',
}),
});
var data = await response.json();
if (!data.status) {
throw new Error('Recipient creation failed: ' + data.message);
}
return data.data;
};
You do not need to specify "Pesalink" anywhere in the recipient creation. Paystack determines the routing based on the destination bank and the transfer characteristics. Your job is to create the recipient with the correct bank code and account number, and Paystack handles the routing decision.
Get weekly developer tips
Join 25,000+ developers. Practical guides, job tips, and new content — straight to your inbox.
No spam. Unsubscribe anytime.
const sendViaPesalink = async (recipientCode, amountKES, reason, reference) => {
var amountCents = Math.round(amountKES * 100);
var response = await fetch('https://api.paystack.co/transfer', {
method: 'POST',
headers: {
Authorization: 'Bearer ' + process.env.PAYSTACK_SECRET_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
source: 'balance',
amount: amountCents,
recipient: recipientCode,
reason: reason,
reference: reference,
}),
});
var data = await response.json();
if (!data.status) {
throw new Error('Transfer failed: ' + data.message);
}
// Pesalink transfers resolve quickly
// The transfer.success webhook should arrive within seconds
return data.data;
};
var result = await sendViaPesalink(
'RCP_kes_vendor_01',
5000, // 5,000 KES
'Instant settlement - Order #8834',
'instant_payout_8834'
);
The transfer initiation is identical to any other Paystack transfer. What is different is the speed. Standard interbank transfers settle over hours. Pesalink transfers settle in seconds. Your webhook handler receives the transfer.success event almost immediately after initiation.
This speed means your user experience can be different. If you are building a platform where sellers can request instant withdrawals, Pesalink lets you confirm the payout was delivered within moments of the request. The seller does not have to wait until tomorrow to know their money arrived.
Pesalink has per-transaction limits that are set by the network, not by Paystack. These limits can change as the KBA updates the Pesalink framework. Check the current limits with Paystack or the KBA before designing your payout logic around specific amounts.
For transfers that exceed Pesalink limits, the payment is routed through standard interbank clearing instead. This means it will still arrive, just not instantly. Your code does not need to handle this routing decision; Paystack and the banking infrastructure manage it.
// Helper to decide the best transfer method
function recommendTransferMethod(amountKES, recipientType) {
// These are illustrative thresholds, not actual Pesalink limits
// Check current Pesalink limits before using specific values
var pesalinkIndicativeMax = 999999; // Example only
if (recipientType === 'mpesa') {
return {
method: 'M-Pesa',
speed: 'Instant (seconds)',
note: 'Best for individuals and small amounts',
};
}
if (amountKES <= pesalinkIndicativeMax) {
return {
method: 'Pesalink',
speed: 'Instant (seconds)',
note: 'Real-time bank-to-bank within Pesalink limits',
};
}
return {
method: 'Standard interbank',
speed: 'Minutes to hours',
note: 'Amount exceeds Pesalink limits, routed via standard clearing',
};
}
In your admin dashboard or vendor portal, show the expected settlement speed based on the transfer method. Setting correct expectations prevents support tickets. "Your payout of 5,000 KES will arrive in seconds via Pesalink" is much better than a vague "payout processing."
Kenya gives you three payout rails. Each has trade-offs.
Pesalink: Instant, bank-to-bank, transaction limits apply. Best for moderate-amount payouts to recipients with bank accounts who need speed.
M-Pesa: Near-instant, mobile wallet, wallet limits apply. Best for individuals, small to moderate amounts, recipients who prefer or only have M-Pesa.
Standard interbank: Slower (minutes to hours), no transaction limit concerns for most amounts, works for any bank. Best for large corporate payouts where speed is less critical.
The optimal strategy for most Kenyan platforms:
For M-Pesa details, see transfers to M-Pesa wallets, Paybills, and Tills. For standard bank transfers, see transfers to Kenyan bank accounts via Paystack.
Pesalink transfers can fail for the same reasons as standard bank transfers: invalid account, bank downtime, account restrictions. The difference is that failures are reported faster because Pesalink processes in real time.
A Pesalink failure arrives as a transfer.failed webhook within seconds of initiation, not hours later. This means your retry logic can also execute faster. If a Pesalink transfer fails due to a transient issue, a retry after 5-10 minutes (instead of the 15-60 minutes recommended for standard transfers) is reasonable because the feedback loop is much shorter.
One Pesalink-specific failure mode: the destination bank may be a Pesalink member but temporarily not processing Pesalink transactions (maintenance, connectivity issues with the Pesalink network). In this case, Paystack may route the transfer through standard interbank clearing instead, resulting in a slower settlement but not a failure. Your code handles this transparently because the webhook events are the same regardless of which rail Paystack used internally.
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