Pesalink Transfers Through Paystack
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.
What Is Pesalink
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.
Setting Up Pesalink Recipients
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.
Initiating Pesalink Transfers
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 Transaction Limits
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."
Pesalink vs M-Pesa vs Standard Transfers
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:
- Offer M-Pesa as the default for individual recipients (drivers, freelancers)
- Use Pesalink for bank transfers within the limit threshold where speed matters
- Fall back to standard interbank for large amounts
- Let recipients choose their preferred method during onboarding
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 Failure Handling
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.
Key Takeaways
- ✓Pesalink provides real-time interbank transfers in Kenya. Money arrives in the recipient bank account within seconds.
- ✓Pesalink has per-transaction limits set by the network. It is best suited for transfers below those thresholds.
- ✓The recipient does not need to do anything special. As long as their bank is a Pesalink member, they receive the money instantly.
- ✓Pesalink transfers use the standard Paystack transfer flow: create recipient, initiate transfer, track via webhooks.
- ✓Choose Pesalink for speed-critical, moderate-amount payouts. Choose standard transfers for large amounts. Choose M-Pesa for recipients without bank accounts.
Frequently Asked Questions
- Do I need a special Paystack account to use Pesalink?
- No. Pesalink routing is handled by Paystack based on the destination bank and transfer characteristics. You use the standard transfer API. Paystack decides whether to route through Pesalink or standard interbank clearing.
- Does Pesalink work 24/7?
- Pesalink is designed for real-time processing, but availability can depend on the participating banks and the Pesalink network itself. Transfers initiated during banking hours are most reliably processed instantly. Off-hours transfers may experience slight delays depending on the receiving bank.
- Are Pesalink transfer fees different from standard transfer fees?
- Paystack may apply different fee structures for Pesalink vs standard transfers. Check your Paystack dashboard or pricing page for the current fee breakdown. Factor the appropriate fee into your balance calculations before initiating 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