Logo GenukaGenuka Pay
Guides

Pricing and fees

The all-in price per zone, who pays it, and how to get the exact amount before you collect.

Pricing and fees

Genuka Pay quotes one all-in price. The rate below is the total taken from the transaction, operator fee included — not a commission stacked on top of something else.

Rates

ZoneCurrencyRateMinimum
Central Africa (CEMAC)XAF3% + 2550 XAF
West Africa (UEMOA)XOF3% + 2550 XOF
Ivory CoastXOF4% + 2550 XOF

The minimum applies to the total: if 3% + 25 comes to less than 50, 50 is charged.

What all-in means

On 10,000 XOF collected in Ivory Coast, the total charge is 4% × 10,000 + 25 = 425 XOF, whatever share the operator takes that day. You receive 9,575 XOF.

Negotiated rates may apply to your account. Where they do, they replace the table above — and the quote below remains the source of truth.

Who pays the fees

The fee bearer is an account setting (fee_bearer), returned on every transaction.

ValueEffect
COMPANYThe customer is charged the requested amount. Fees are deducted from what you receive.
CUSTOMERFees are added to the amount the customer is charged. You receive the requested amount.

Get the exact amount before collecting

POST /api/v1/payments/quote
ParameterTypeRequiredDescription
amountnumberYesOrder amount
currencystringYesXAF or XOF
payer_phonestringYes (except card)E.164 format, e.g. +2250700000001
operator_codestringNoDerived from the phone number when omitted
countrystringNoTwo-letter ISO code. Selects the rate and the operator.
curl -X POST "{{BASE_URL}}/api/v1/payments/quote" \
  -H "X-Public-Key: YOUR_PUBLIC_KEY" \
  -H "X-Timestamp: UNIX_TIMESTAMP" \
  -H "X-Signature: HMAC_SHA256_SIGNATURE" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 10000,
    "currency": "XOF",
    "payer_phone": "+2250700000001",
    "country": "CI"
  }'
Response
{
  "message": "payin_fees_quoted",
  "data": {
    "amount": 10000,
    "currency": "XOF",
    "fee_bearer": "COMPANY",
    "provider_fee_amount": 150,
    "genuka_fee_amount": 275,
    "total_fee_amount": 425,
    "customer_pays": 10000,
    "merchant_receives": 9575
  }
}

Show customer_pays to your customer and merchant_receives in your back office. The split between provider_fee_amount and genuka_fee_amount is informational: only the total is charged to you.

A quote is an estimate, not a commitment

If the operator refuses the transaction, it is automatically retried elsewhere, and the applicable rate may change. When the customer bears the fees (fee_bearer = CUSTOMER), the amount actually charged is then recalculated. The firm amount is the one returned by the transaction itself.

Fees after the fact

Every payment returns the breakdown that was actually applied:

{
  "amount": 10000,
  "charged_amount": 10000,
  "provider_fee_amount": 150,
  "genuka_fee_amount": 275,
  "total_fee_amount": 425,
  "net_amount": 9575,
  "fee_bearer": "COMPANY",
  "fee_breakdown": {
    "customer_pays": 10000,
    "merchant_receives": 9575
  }
}

These amounts are final once the transaction reaches SUCCESS: they are reconciled against what the operator actually charged.

Next

How is this guide?

Last updated on