When a full payment is made a JSON request is sent to the merchant’s callback url.
We send out IPNs on the callback_url
provided on the checkout payload. The payment notifications are in the form of HTTP requests from our platform.
We send a HTTP POST request to the merchant's callback URL
Webhook Request
Parameter Name | Type | Description |
---|---|---|
checkout_request_id | Double | A unique identifier on Cellulant’s end. |
merchant_transaction_id | String | Unique ID the merchant raised for the request |
request_amount | Double | The converted amount for the request raised by the merchant |
original_request_amount | Double | The original request amount raised by the merchant in the invoice currency |
request_currency_code | String | Converted currency for the request the customer made the payment in |
original_request_currency_code | String | ISO Code of the currency code the merchant raised the request in |
account_number | Double | Merchant reference the customer was paying for |
currency_code | String | ISO Currency code of the payment made |
amount_paid | Double | Amount the customer paid for the request |
service_charge_amount | Double | Charges added to the service for the request initiated |
request_date | Date | Date when the request was raised in |
service_code | String | Unique service code identifying the service the payment request was raised for. |
request_status_code | String | Overall request code indicating the status of the service 177 - partially paid requests 178 - indicating the request was fully paid for 179 - indicating the request was partially paid for but expired 129 - Request expired without payments 102 - Insufficient funds 101 - Invalid pin/canceled 99 - Generic Failed Payment Status |
request_status_description | String | Description of the status given back on the webhook request |
MSISDN | String | The mobile number the person came with from the merchant site |
payments | JSON Array | An array of successful payments made to the request |
failed_payments | JSON Array | An array of any payments initiated but not successfully authorized |
extra_data | String | metadata |
country_abbrv | String | Abbreviation of the country |
Payments array for both failed and successful payments array.
Parameter Name | Type | Description |
---|---|---|
customer_name | string | Customer name of the person who made the payment |
account_number | string | Merchant reference the customer was paying for. |
cpg_transaction_id | String | Unique Cellulant identity |
currency_code | string | ISO Currency code of the payment made |
payer_client_code | string | Payment option customer paid with e.g. Airtel |
payer_client_name | String | Payment option customer name |
amount_paid | double | Amount customer paid for |
service_code | String | Code of service paid to |
date_payment_received | Date | When the payment was made and received |
MSISDN | string | The mobile number the customer is paying for |
payer_transaction_id | string | Unique ID the MNO or bank generated for the transaction |
hub_overall_status | string | The overall status of the payment made is described in the status code table below 138 - Payment request initiated but failed 139 - Payment pending acknowledgment from the merchant 140 - Payment accepted by the merchant 141 - Payment rejected by merchant system 144 - Payment delivered to the merchant but not yet acknowledged as successful 219 - Payment escalated |
payer_narration | String | MNO, bank, or card acquirer given payment description. |
Here is a sample JSON request body that you'll receive in the IPN:
{
"request_status_code": 178,
"account_number": "11800",
"merchant_transaction_id": "56679792",
"amount_paid": 15,
"service_charge_amount": 0,
"request_amount": "10",
"payments": [
{
"account_number": "11800",
"payer_client_name": "Mula Checkout",
"amount_paid": 5,
"payer_narration": "The service request is processed successfully.",
"date_payment_received": "2021-11-26 14:47:45.0",
"currency_code": "KES",
"payer_transaction_id": "PKQ082LB08",
"cpg_transaction_id": "1195072932",
"payer_client_code": "MULACHECKOUT_KEN",
"hub_overall_status": 139,
"service_code": "MULACHECKOUTONLINE",
"customer_name": "Customer",
"msisdn": 254700000000
},
{
"account_number": "11800",
"payer_client_name": "Mula Checkout",
"amount_paid": 5,
"payer_narration": "The service request is processed successfully.",
"date_payment_received": "2021-11-26 14:47:45.0",
"currency_code": "KES",
"payer_transaction_id": "PKQ082LB08",
"cpg_transaction_id": "1195072932",
"payer_client_code": "MULACHECKOUT_KEN",
"hub_overall_status": 139,
"service_code": "MULACHECKOUTONLINE",
"customer_name": "Customer",
"msisdn": 254700000000
},
],
"original_request_amount": 10,
"checkout_request_id": 6,
"currency_code": "KES",
"failed_payments": [],
"request_currency_code": "KES",
"request_date": "Fri Nov 26 11:47:04 GMT 2021",
"service_code": "MULACHECKOUTONLINE",
"request_status_description": "Success payment",
"original_request_currency_code": "KES",
"msisdn": "254700000000",
"extra_data": "abcd",
"country_abbrv": "KEN"
}
{
"request_status_code":99,
"account_number":"2252523565",
"merchant_transaction_id":"1152468646",
"amount_paid":0,
"service_charge_amount":10,
"request_amount":"10",
"original_request_amount":10,
"checkout_request_id":5098938,
"currency_code":"KES",
"failed_payments":[
{
"account_number":"2252523565",
"payer_client_name":"Mula Checkout",
"amount_paid":10,
"payer_narration":"{\"statusDescription\":\"PAN is invalid. retry with correct card PAN\",\"statusCode\":213}",
"date_payment_received":"2024-04-11 14:44:03",
"currency_code":"KES",
"payer_transaction_id":"3613032_410214093703_1561460982605433261",
"cpg_transaction_id":"341644746",
"payer_client_code":"MULACHECKOUT_KEN",
"hub_overall_status":138,
"service_code":"MULACHECKOUTONLINE",
"customer_name":"Joan Munene",
"msisdn":254700000000
},
{
"account_number":"2252523565",
"payer_client_name":"Mula Checkout",
"amount_paid":10,
"payer_narration":"{\"statusDescription\":\"PAN is invalid. retry with correct card PAN\",\"statusCode\":213}",
"date_payment_received":"2024-04-11 14:44:03",
"currency_code":"KES",
"payer_transaction_id":"3613032_410214093703_1561460982605433261",
"cpg_transaction_id":"341644746",
"payer_client_code":"MULACHECKOUT_KEN",
"hub_overall_status":138,
"service_code":"MULACHECKOUTONLINE",
"customer_name":"Joan Munene",
"msisdn":254700000000
}
],
"extra_data":"",
"request_currency_code":"KES",
"request_date":"Thu Apr 11 14:38:28 GMT 2024",
"service_code":"MULACHECKOUTONLINE",
"request_status_description":"Failed payment notification received",
"original_request_currency_code":"KES",
"msisdn":"254700000000",
"country_abbrv":"KE"
}
After receiving the HTTP POST request on the callback_url
specified on the checkout payload, you have to respond with the following JSON payloads to either accept or reject the payment according to your business processes.
Webhook Response
Parameter Name | Type | Description |
---|---|---|
checkout_request_id | String | The unique Cellulant ID on the database |
merchant_transaction_id | String | Unique ID the merchant raised for the request |
status_code | String | Indicate if a request is received successfully, failed, or accepted 183 - Successful 180 - Payment rejected 188 - Payment received and will be acknowledged later |
status_description | String | A narration of the status code meaning |
receipt_number | String | Unique identifier of the acknowledgment response given back |
Sample Response for processed payments
{
"status_code": "183",
"checkout_request_id": 4826296,
"receipt_number": "r77az121236884",
"merchant_transaction_id": "abcd-efg-hijklm",
"status_description": "Successfully"
}
{
"status_code": "180",
"checkout_request_id": 4826296,
"receipt_number": "r77az121236884",
"merchant_transaction_id": "abcd-efg-hijklm",
"status_description": "Payment rejected"
}