Refunds

You can issue a refund for each payment received on your Volt Connect account. Refunds are available for up to a year from the original payment date.

The refund will always be sent to the bank account that originated the payment and it will be sent from your current Volt Connect account in the currency of the payment.

If you are using our settlement sweep functionality please be aware that your refund amounts will be deducted from your settlement total. The settlement report will contain all the refunds that were included in calculating the total.

Important note!

Not all of the available Volt Connect banking providers support sending refunds. If this is a functionality you require please make sure to choose the right banking provider for your needs during the onboarding process.

Refund processing

Refunds can be created for payments that are in the RECEIVED or SETTLED statuses. 

You can refund either the full payment amount or a part of it. You can also perform multiple partial refunds, as long as their sum doesn’t exceed the full payment amount.

For a refund to be successful you need to have the money to fund it in your Volt Connect account in that currency. If you do not have enough funds when requesting a refund, most of our banking providers will not immediately reject that refund but instead wait for up to a few days for additional credits to hit the account. In that scenario your refund will be in the REFUND_PROCESSING status until it’s either confirmed or fails.

You can request a Refund via our API or the Fuzebox platform.

Requesting a refund using API

Checking refund availability

Before you request a refund you are able to check if it’s actually available for the given payment.

To do to so you need to check the following endpoint:

Request location

  • Sandbox
  • Production
GET https://api.sandbox.volt.io/payments/{paymentId}/refund-details
GET https://api.volt.io/payments/{paymentId}/refund-details

And the response can contain the following information if the refund is available:

{
    "refundAvailable": true
}

Or an extra message and code if it’s not:

{
    "refundAvailable": false
    "message": "Payment with id: 0da43922-e01d-4c7f-8a63-0d8da56459be has been fully refunded.",
    "code": "PaymentRefundBalanceIsNotAvailable"
}

Response fields

  • refundAvailable is a flag that tells you if a refund can be created for this payment
  • message is an optional field that will contain detailed information about why you cannot create a refund for this payment
  • code is an optional field that will contain a code for why you cannot create a refund for this payment

Requesting a refund

To request a refund via the API you need to use the endpoint below.

Request location

  • Sandbox
  • Production
https://api.sandbox.volt.io/payments/{paymentId}/request-refund
https://api.volt.io/payments/{paymentId}/request-refund

Full refunds

If you want to refund the full payment amount, the request body should be an empty JSON (as no additional data is required):

{}

Partial refunds

If you want to refund only a part of the payment you need to specify the amount and assign your unique external reference.

{
  "amount": 1,
  "externalReference": "my-external-reference"
}

Request form parameters

  • amount is the amount you want to refund (in minor units)
  • externalReference should be a maximum of 40 characters and should contain letters and numbers only. It is the reference you want to use for this refund

Note

Creating a partial refund for the full payment amount is equivalent to creating a full refund.

Refunds processing statuses

REFUND_CREATED

The initial status of a refund.

REFUND_APPROVED

The refund approval process on your end (to be added in a later version) has completed successfully and Volt can now try to send out the funds.

Refunds created using the API or created by Financial Admins will be automatically moved to this status.

REFUND_REJECTED

The refund request has been rejected by the approval workflow setup in your company (to be added in a later version).

REFUND_PROCESSING

The refund request has been sent to our banking provider. If you don’t currently have money on the account to fund this refund it might take up to a few days for the next status transition.

REFUND_CONFIRMED

The refund has been sent from your Volt Connect account to the original shopper account.

REFUND_FAILED

The refund has failed. More information will be available in the error message of the refund notification.

The most common reason is that you didn’t have enough money to fund the refund.

Notification details

  • Volt will send you one notification per refund request, detailing its final status
  • This notification will be delivered to your payment notification URL
  • The User-Agent will be Volt/2.0 for Connect notifications and will also contain an X-Volt-Type header of refund_confirmed or refund_failed or so that you can easily identify the message format to process

Completed refund notification

Notification header
POST /payment_notification_url HTTP/1.1
Host: customer.com
Content-Type: application/json
User-Agent: Volt/2.0
X-Volt-Timed: 20200131123456
X-Volt-Signed: eda5e46baa6a676851975365e12b4ae61ee48442c0cbb8d0e3c3cfd47c3e1085
X-Volt-Type: refund_confirmed
Notification content
{
  "refundId": "026cefa0-a174-4ca3-a1e6-533a129d9c32",
  "paymentId": "01dfb01b-c5ab-49e4-bfa4-277c766d5ecc",
  "status": "REFUND_CONFIRMED",
  "error": "",
  "amount": 100,
  "currency": "GBP",
  "externalReference": null,
  "timestamp": "2022-05-12T12:41:12+00:00",
  "sender": {
    "iban": "DK8389009999910135",
    "swiftBic": "ALBPPLPW",
    "name": "test customer name"
  },
  "recipient": {
    "accountNumber": "12345678",
    "sortCode": "654321",
    "iban": "DE33500105173822933531",
    "swiftBic": "SXPYDKKKXXX",
    "name": "test recipient name"
  }
}

Failed refund notification

Notification header
POST /payment_notification_url HTTP/1.1
Host: customer.com
Content-Type: application/json
User-Agent: Volt/2.0
X-Volt-Timed: 20200131123456
X-Volt-Signed: eda5e46baa6a676851975365e12b4ae61ee48442c0cbb8d0e3c3cfd47c3e1085
X-Volt-Type: refund_failed
Notification content
{
  "refundId": "83a15d24-02b8-11ed-b939-0242ac120002",
  "paymentId": "01dfb01b-c5ab-49e4-bfa4-277c766d5ecc",
  "status": "REFUND_FAILED",
  "error": "Payout Rejected by Provider",
  "amount": 100,
  "currency": "GBP",
  "externalReference": null,
  "timestamp": "2022-05-12T12:41:12+00:00",
  "sender": {
    "iban": "DK8389009999910135",
    "swiftBic": "ALBPPLPW",
    "name": "test customer name"
  },
  "recipient": {
    "accountNumber": "12345678",
    "sortCode": "654321",
    "iban": "DE33500105173822933531",
    "swiftBic": "SXPYDKKKXXX",
    "name": "test recipient name"
  }
}

Requesting a refund using Fuzebox

Refunds can be requested using Fuzebox. Requesting refunds will only be available for users with the FINANCIAL ADMIN permissions set. Each refund request will have to be confirmed with a 2FA code.

To request a refund, go to the transaction details screen and click on the “Refund Transaction” button. If the button is not there then a refund is not available for this payment.

The refund has to be confirmed using 2FA:

Refund details will be displayed in the refunds section:

Testing your refunds integration on Sandbox

You are able to test both the REFUND_CONFIRMED and REFUND_FAILED scenarios for your integration on our Sandbox environment.

  • REFUND_CONFIRMED
    1. Create a payment with any amount different to 1178 or 2050 minor units, and wait until it’s changed to the RECEIVED status.
    2. Create a refund and wait for a few seconds.
    3. The refund request should be transitioned to the REFUND_CONFIRMED status with the corresponding notification being sent.
  • REFUND_FAILED 
    1. Create a payment with an amount equal to 1178 minor units, and wait until it’s changed to the RECEIVED status.
    2. Create a refund and wait a few seconds
    3. The refund request should be transitioned to the REFUND_FAILED status with the corresponding notification being sent.