Returns, cancellations, and refunds

Learn how to cancel a payment or request a refund for your customers

With Kushki you can process credit and debit card payment returns in an approved status. Once a return is approved, the funds will be returned to your customer’s card.

Refunds can be of two kinds, depending on the day and time the original transaction and reversal request is processed:

1. Online or Automatic Void.

This is when the return request is processed during the same day as the transaction, before 23:00. We will make up to three return attempts with the processor and if successful, the purchase will be removed from your customer’s transaction statement and the purchase amount will be refunded to your customer’s account.

Anulación en línea ES

2. Manual Refund

When an online cancellation is not possible, a manual refund will be required. A manual refund can be given in the following scenarios:

  • When the refund request is processed after 23:59 on the transaction approval day.
  • When all three online reversal attempts fail.
  • When the reversal request is made on a different day than the original transaction day.

These types of refunds can take up to 7 business days to process and up to 45 business days to reflect on your customer’s statement, depending on the card issuing bank. Below is an illustration of the manual refund process:

Reembolso manual ES

How to process a return?

You can process returns from your Console as explained here or integrate our cancel request API method into your application so that your buyers can request from your site the return of a purchase.

To request a reversal of a payment you need to use the ticketNumber of the original transaction as path parameter and send your private credential, as shown in the following example:

  • Javascript
  • Python
  • PHP
var request = require("request");
var options = {
method: 'DELETE',
headers: {
'Private-Merchant-Id': 'your-private-merchat-id', // Replace with your Private merchant id
'Content-Type': 'application/json' },
url: 'https://api-uat.kushkipagos.com/v1/charges/ticket number ', // Test environment
body: {
fullResponse: true
},
json:true
};
request(options, function(error, response, body) {
if (error) throw new Error(error);
console.log(body);
});
import requests
url = "https://api-uat.kushkipagos.com/v1/charges/ticket number"
payload = '{"fullResponse":true}'
headers = {
"Private-Merchant-Id": "your-private-merchat-id",
"Content-Type": "application/json",
}
response = requests.request("DELETE", url, headers=headers, data=payload)
print(response.text)
$client = new http\Client;
$request = new http\Client\Request;
$body = new http\Message\Body;
$body->append('{\"fullResponse\":true}');
$request->setRequestUrl('https://api-uat.kushkipagos.com/v1/charges/6383937262783');
$request->setRequestMethod('DELETE');
$request->setBody($body);
$request->setHeaders(array(
'Private-Merchant-Id: 'your-private-merchat-id',// Replace this with your Private Key
'Content-Type: application/json'
));
$client->enqueue($request)->send();
$response = $client->getResponse();
echo $response->getBody()

How to process a partial refund?

You can allow your customers to request partial refunds using the same transaction reversal endpoint, so it is possible for a single charge to have multiple refund requests associated with it, as long as the sum of these does not exceed the total amount of the original transaction.

Partial refunds can be requested manually, through the Console or via API, as explained below.

Partial refunds via API

To request a partial refund, you can use the cancellation request endpoint. You must send the ticketNumber as path parameter, your private credential and the amount and tax breakdown in the amount object. Make sure that the tax and amount calculation is correct.

  • Javascript
  • Python
  • PHP
var request = require("request");
var options = {
method: 'DELETE',
headers: {
'Private-Merchant-Id': 'your-private-merchat-id', // Replace with your Private merchant id
'Content-Type': 'application/json'
},
url: 'https://api-uat.kushkipagos.com/v1/charges/ticket number ', // Test environment
body: {
fullResponse: true,
amount: {
subtotalIva: 1000,
subtotalIva0: 0,
iva: 0,
currency: 'MXN'
}
},
json: true
};
request(options, function(error, response, body) {
if (error) throw new Error(error);
console.log(body);
});
import requests
url = "https://api-uat.kushkipagos.com/v1/charges/ticket number"
payload = '{\"fullResponse\":true,\"amount\":{\"subtotalIva\":100,\"subtotalIva0\":0,\"ice\":0,\"iva\":0,\"currency\":\"MXN\"}}'
headers = {
"Private-Merchant-Id": "your-private-merchat-id",
"Content-Type": "application/json",
}
response = requests.request("DELETE", url, headers=headers, data=payload)
print(response.text)
$client = new http\Client;
$request = new http\Client\Request;
$body = new http\Message\Body;
$body->append('{"fullResponse":true,"amount":{"subtotalIva":100,"subtotalIva0":0,"ice":0,"iva":0,"currency":"MXN"}}');
$request->setRequestUrl('https://api-uat.kushkipagos.com/v1/charges/6383937262783');
$request->setRequestMethod('DELETE');
$request->setBody($body);
$request->setHeaders(array(
'Private-Merchant-Id: 'your-private-merchat-id',// Replace this with your Private Key
'Content-Type: application/json'
));
$client->enqueue($request)->send();
$response = $client->getResponse();
echo $response->getBody()

How to know the status of a return?

You can check the status of a void from your Console as explained here or set up a Webhook-chargebacks, in which Kushki will notify you when a return request is successfully completed, either void or refund.


Webhook for returns

Check the status of your returns