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
| Zone | Currency | Rate | Minimum |
|---|---|---|---|
| Central Africa (CEMAC) | XAF | 3% + 25 | 50 XAF |
| West Africa (UEMOA) | XOF | 3% + 25 | 50 XOF |
| Ivory Coast | XOF | 4% + 25 | 50 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.
| Value | Effect |
|---|---|
COMPANY | The customer is charged the requested amount. Fees are deducted from what you receive. |
CUSTOMER | Fees 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| Parameter | Type | Required | Description |
|---|---|---|---|
amount | number | Yes | Order amount |
currency | string | Yes | XAF or XOF |
payer_phone | string | Yes (except card) | E.164 format, e.g. +2250700000001 |
operator_code | string | No | Derived from the phone number when omitted |
country | string | No | Two-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"
}'{
"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