KES Bank Transfer

Learn how to collect payment directly from your Kenyan customers via bank transfers.

📘

Getting Started

We recommend checking out the introductory section to understand the basics of direct charge first. This guide assumes you’ve read that.

The Process

Collecting payments via bank transfer charge is straightforward:

  • You call the bank transfer charge endpoint to create a charge and generate account details for the customer to pay into.
  • The customer transfers to the generated account.
  • We send you a webhook notifying you that we've received the payment.
  • You verify the payment and complete the customer's order.

Initiating the Charge

To initiate the charge, send a POST request to the bank transfer charge endpoint with the following parameters:

  • tx_ref: A unique reference code you generate for each transaction.
  • amount: The transaction amount.
  • currency: The currency set to KES.
  • customer_account_number: This is the customer’s account number, which is required for payment confirmation.
  • fullname: The customer's account name, consisting of the first and last name.
  • email: The customer’s email address.
curl --request POST \
   --url https://api.flutterwave.com/v3/charges?type=bank_transfer \
   --header 'Authorization: Bearer FLW_SECRET_KEY' \
   --header 'content-type: application/json' \
   --data '{
    "tx_ref”:”UNIQUE_TRANSACTION_REFERENCE”,
    "amount":10,
    "currency":"KES",
    "customer_account_number": "1234567897"
    "fullname":"John Doe",
    "email":"[email protected]"
    }'

📘

Integration Tip

You can also specify a list of subaccounts to split the payment into. See split payments for details.

There are more options available when initiating a bank transfer charge, such as the payment expiry, customer's phone_number and additional meta. See the endpoint docs for details.

{
    "tx_ref":"UNIQUE_TRANSACTION_REFERENCE",
    "email":"[email protected]",
    "amount": 1,
    "currency":"KES",
    "fullname":"John Doe",
    "customer_account_number":"1234567890",
    "subaccounts": [
    {
      "id": "RS_D87A9EE339AE28BFA2AE86041C6DE70E"
    }
  ]
}


{
    "tx_ref":"UNIQUE_TRANSACTION_REFERENCE",
    "email":"[email protected]",
    "amount": 1,
    "currency":"KES",
    "fullname":"John Doe",
    "customer_account_number":"1234567890",
    "bank_transfer_options": {
		"expires": 3600
	}
}

If the charge is created successfully, you'll get a successful response containing the generated account details.

{
    "status": "success",
    "message": "Charge initiated",
    "meta": {
        "authorization": {
            "transfer_reference": "MockFLWRef-1752065916285",
            "transfer_account": "29019229920",
            "transfer_bank": "NBK",
            "account_expiration": "2025-07-10 01:58:35",
            "transfer_note": "Mock note",
            "transfer_amount": "10.30",
            "customer_ref": "ECR2272075416",
            "mode": "banktransfer"
        }
    }
}


Completing the Payment

The meta.authorization object contains the account details for the transfer: the bank name (transfer_bank), account number (transfer_account), transfer narration(customer_ref) and amount (transfer_amount). Pass the details on to your customer, and they can make a transfer into the account (for instance, from their bank app).

📘

Payment Reference Requirement

The customer_ref must be included by the customer in the narration when making a bank transfer from their banking application. This is required to ensure accurate and timely payment confirmation.

Webhooks

When payment is made, we'll send you a webhook with a payload like this:

{
  "event": "charge.completed",
  "data": {
    "id": 674786961,
    "tx_ref": "mcdfrd",
    "flw_ref": "6573910296281752065928588",
    "device_fingerprint": "N/A",
    "amount": 10,
    "currency": "KES",
    "charged_amount": 10.3,
    "app_fee": 0,
    "merchant_fee": 0,
    "processor_response": "success",
    "auth_model": "AUTH",
    "ip": "102.89.83.128",
    "narration": "Wave KES Pool Account",
    "status": "successful",
    "payment_type": "bank_transfer",
    "created_at": "2025-07-09T12:58:55.000Z",
    "account_id": 1091430,
    "customer": {
      "id": 585248738,
      "name": "John Doe",
      "phone_number": "08012345678",
      "email": "[email protected]”,
      "created_at": "2025-07-09T12:53:18.000Z"
    }
  }
}

Now, your webhook endpoint can handle the event and complete the customer's order. For help setting up webhooks, see our guide to webhooks.

In your webhook handler, you can then verify the payment and credit your customers with whatever they paid for. See our guide to transaction verification for details.