Bonaventure OgetoBy Bonaventure Ogeto|

Pay with Pesalink on Paystack: Developer Guide

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.

Supported Banks

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:

  • KCB Bank
  • Equity Bank
  • Co-operative Bank
  • NCBA (formerly CBA and NIC)
  • Absa Bank Kenya (formerly Barclays)
  • Standard Chartered
  • Stanbic Bank
  • Diamond Trust Bank (DTB)
  • I&M Bank
  • Family Bank
  • Bank of Africa
  • KWFT (Kenya Women Finance Trust)

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.

The Customer Experience at Checkout

Here is what the customer sees when they choose Pesalink at a Paystack-powered checkout:

  1. Payment method selection. The Paystack checkout popup or inline form shows available payment methods. If you have enabled bank_transfer, the customer sees a bank transfer option alongside M-Pesa and card.
  2. Bank selection. The customer selects their bank from a list of supported institutions.
  3. Authorization. Depending on the bank, the customer is either redirected to their bank's online banking portal, prompted via their banking app, or given a USSD code to dial. They review the payment details (amount, merchant name) and authorize it.
  4. Confirmation. Once the bank processes the transfer, Paystack receives confirmation and redirects the customer back to your callback URL. The payment is complete.

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.

Integration Code: Enabling Pesalink in Paystack

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.

Transaction Limits and Amounts

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:

FactorM-PesaPesalink
Per-transaction limitVaries by user tier, generally up to KES 150,000Higher limits, varies by bank
Daily limitKES 300,000 for most usersDepends on bank account type
Availability24/724/7
Settlement to merchantThrough Paystack settlement cycleThrough Paystack settlement cycle

Important caveats:

  • These limits are approximate and change. Safaricom adjusts M-Pesa limits periodically. Banks set their own Pesalink limits based on account type and customer profile. Do not hard-code limits into your application. Instead, handle limit-related failures gracefully.
  • Paystack may impose its own limits on top of the underlying payment method limits. Check the Paystack documentation and dashboard for the maximum transaction amount they support for bank_transfer in Kenya.
  • The customer's bank account balance is the real limit. Unlike M-Pesa where float can be an issue, bank transfers just need the funds to be in the account. For high-value B2B transactions, this is usually not a problem.

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.

Troubleshooting Pesalink Payments

Common issues you will encounter with Pesalink payments and how to handle them:

  • Customer's bank not listed. If a customer's bank is not yet on the Pesalink network, they will not see it as an option. Direct them to M-Pesa or card payment instead. Your checkout should always offer at least two payment methods.
  • Authorization timeout. The customer selects their bank but does not complete the authorization within the allowed window. The transaction expires. Display a clear message and let them try again with a new transaction.
  • Bank app not set up. Some customers have bank accounts but have never activated their mobile banking app. They cannot complete a Pesalink payment through the app flow. USSD-based authorization (where supported) is the fallback, but not all banks support it for Pesalink.
  • Amount exceeds bank limit. The customer's bank may have daily or per-transaction limits that are lower than the Pesalink network limit. The payment will be rejected by the bank. The customer needs to check with their bank or split the payment.
  • Weekend and holiday processing. While Pesalink itself works 24/7, some banks may have limited processing windows for certain types of transactions. This is rare but worth knowing about if you see intermittent failures on weekends.

For network-level issues that affect all payment methods in Kenya, see Building for Kenyan Network Conditions: Retries and Timeouts.

Next Steps

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.

Key Takeaways

  • Pesalink is an instant interbank payment network operated by IPSL (Integrated Payment Services Limited) under the Kenya Bankers Association. It enables real-time bank-to-bank transfers 24/7.
  • On Paystack, Pesalink falls under the bank_transfer channel. You include it in the channels array when initializing a transaction, and Paystack handles the bank selection and authorization flow.
  • Pesalink supports higher transaction amounts than M-Pesa, making it suitable for rent, school fees, wholesale orders, and other high-value payments where mobile money limits are a constraint.
  • Most major Kenyan banks support Pesalink, including KCB, Equity, Co-op Bank, NCBA, Absa, Stanbic, DTB, and I&M. The customer authorizes the payment through their bank's app or USSD.
  • From your backend, the integration is identical to other Paystack payment methods. You receive the same charge.success webhook regardless of whether the customer paid via M-Pesa, card, or Pesalink.
  • Pesalink is not a replacement for M-Pesa. It is a complement. Offer it alongside M-Pesa and cards to capture customers who prefer or need to pay from their bank account.

Frequently Asked Questions

Is Pesalink the same as a bank transfer?
Pesalink is a specific type of bank transfer. It uses the IPSL (Integrated Payment Services Limited) network to move money between banks in real time. On Paystack, Pesalink falls under the bank_transfer channel. When a customer selects bank transfer at Paystack checkout and chooses a participating bank, the payment goes through the Pesalink network.
Do I need a separate integration for Pesalink?
No. Pesalink is part of the standard Paystack integration. You enable it by including bank_transfer in the channels array when initializing a transaction. No additional API endpoints, credentials, or configurations are needed beyond your normal Paystack setup.
Can customers pay via Pesalink using USSD on feature phones?
Some banks support Pesalink authorization via USSD, which works on feature phones. However, the availability of USSD-based Pesalink depends on the customer bank. The more common flow uses the bank mobile app. If your audience includes feature phone users, M-Pesa is the more reliable option for that segment.
What happens if the customer closes the browser during Pesalink authorization?
If the customer closes the browser before completing authorization, the transaction remains pending until it expires. The customer is not charged. You can check the transaction status via the Paystack verify endpoint. If it shows as abandoned or expired, prompt the customer to try again.
Does Pesalink work for international payments?
No. Pesalink is a domestic Kenyan interbank network. It only works between Kenyan bank accounts. For international customers, offer card payments (Visa, Mastercard) or Apple Pay through Paystack.

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