Skip to content

Chapa

Chapa is Ethiopia’s most developer-friendly payment gateway. It aggregates multiple Ethiopian payment methods (Telebirr, CBEBirr, bank transfers, cards) behind a single checkout page — making it the easiest single integration for broad payment coverage.


PropertyValue
OperatorChapa Financial Technologies
TypePayment Gateway (multi-method)
CountryEthiopia
CurrencyETB, USD (limited)
FlowHosted Checkout
Programmatic RefundsYes
Sandbox AvailableYes (excellent)
SettlementT+2 business days

Supported Payment Methods (via Chapa Checkout)

Section titled “Supported Payment Methods (via Chapa Checkout)”

When a customer lands on the Chapa checkout page, they can pay via:

  • Telebirr
  • CBEBirr
  • Commercial Bank of Ethiopia (bank transfer)
  • Awash Bank
  • Cooperative Bank
  • Amhara Bank
  • Visa / Mastercard (limited availability)

This makes Chapa a compelling “one integration, many methods” option for Ethiopian merchants.


CredentialDescription
secretKeyYour Chapa secret key (CHASECK_TEST-... for test, CHASECK-... for live)

Get your keys from dashboard.chapa.co.


const zirzir = new Zirzir({
provider: 'chapa',
credentials: {
secretKey: process.env.CHAPA_SECRET_KEY!
}
})
client = zirzir.Zirzir(
provider="chapa",
credentials={"secret_key": os.environ["CHAPA_SECRET_KEY"]}
)
client := zirzir.New(zirzir.Config{
Provider: "chapa",
Credentials: map[string]string{
"secret_key": os.Getenv("CHAPA_SECRET_KEY"),
},
})

const tx = await zirzir.charge({
amount: 1500,
currency: 'ETB',
firstName: 'Dawit',
lastName: 'Bekele',
txRef: `order_${Date.now()}`,
returnUrl: 'https://yourapp.com/payment/success',
callbackUrl: 'https://yourapp.com/webhooks/zirzir',
})
// Redirect to Chapa's hosted checkout
res.redirect(tx.checkoutUrl)

Unlike USSD-based providers, Chapa returns a proper checkoutUrl — redirect the customer there.


Chapa has the best sandbox of any Ethiopian gateway. Test cards and credentials:

FieldValue
Card Number4200000000000000
ExpiryAny future date
CVVAny 3 digits

Use any valid-format phone number in sandbox. The USSD prompt is simulated automatically — no real phone required.

Test keys start with CHASECK_TEST-. Make sure you’re using the test key in development.


After the customer completes payment and returns to your returnUrl, Chapa appends ?trx_ref=... to the URL. Verify server-side:

app.get('/payment/success', async (req, res) => {
const txRef = req.query.trx_ref as string
const tx = await zirzir.verify(txRef)
if (tx.status === 'success') {
await fulfillOrder(txRef)
return res.render('success')
}
res.render('error', { message: 'Payment was not completed' })
})

Chapa’s checkout page supports limited customization via metadata:

const tx = await zirzir.charge({
amount: 500,
currency: 'ETB',
txRef: 'order_001',
metadata: {
hide_receipt: false, // Show/hide receipt page
customization: {
title: 'Your Store Name',
description: 'Paying for Order #001',
logo: 'https://yourstore.com/logo.png'
}
}
})

Chapa’s API uses tx_ref in request bodies but returns trx_ref in query params on the return URL. Zirzir normalizes this — always use txRef in Zirzir calls.

Chapa’s webhook verification uses a hash of the transaction data, not an HMAC of the body. Zirzir handles this internally — use zirzir.webhooks.verify() as normal.

Chapa advertises T+1 settlement but T+2 is more common in practice. Weekends and holidays extend this further.

USD payments through Chapa require additional merchant approval and are not available on new accounts by default.


Verify current rates with Chapa. Fees change and may vary by merchant tier.

VolumeFee
Standard1.5% per transaction
Negotiated (high volume)0.8% - 1.2%
Minimum fee5 ETB

Chapa fees are inclusive — no additional setup or monthly fees for the basic tier.


Chapa supports full and partial programmatic refunds:

// Full refund
const refund = await zirzir.refund('order_001')
// Partial refund
const refund = await zirzir.refund('order_001', { amount: 250 })

Refunds typically process within 3-5 business days.


  • Cycle: T+2 business days (in practice)
  • Minimum threshold: 500 ETB
  • Method: Bank transfer to your registered bank account
  • Reports: Available in Chapa dashboard and Zirzir Dashboard (server mode)