Refund payments

Refunds return money from a completed payment back to your customer's original payment method. This tutorial shows you how to create full and partial refunds using the Merchant API, and how to monitor refund status until you can confirm the outcome in your system.

What is a refund

A refund is a server-to-server operation where your backend asks Revolut to return funds to the customer. When you refund a payment:

  • Revolut creates a new order of type refund.
  • The refund order contains related_order_id, which links to the original order you refunded.
  • The refund is processed asynchronously, so you should monitor the refund order's status.
Cancelling vs. refunding

If you use manual capture, cancelling an uncaptured order (or letting an authorisation expire) is typically faster and less costly than capturing and then refunding.

For more details, see:

How it works

Refunds are a server-to-server integration between the Merchant API and your backend server:

  1. Your system identifies the original order you want to refund (must be in state completed).
  2. Your server calls the Refund an order endpoint with the refund amount and currency.
  3. Revolut returns a new refund order. Store the id of the refund order in your system.
  4. Your system monitors the refund order's lifecycle.
Tip

To monitor refund processing in real time, use webhooks. For setup steps, see: Use webhooks to track order and payment lifecycle.

How refunds fit in your operations

In most merchant setups, refunds are triggered from a customer support tool or an order management system (OMS). Typical steps are:

  • Validate the request (e.g., returns policy, delivery status, fraud checks).
  • Calculate the refund amount (full vs. partial, shipping, taxes, discounts).
  • Create the refund through your backend (Merchant API).
  • Update internal systems (OMS, accounting, inventory) and notify the customer.

Full vs partial refunds

Full refundPartial refund
When to useYou return the entire captured amountYou return only part of the captured amount
API requestamount equals the original order amountamount is less than the original order amount
Multiple refundsNot applicableYou can issue multiple partial refunds, as long as the total refunded amount does not exceed the original paid amount

Before you begin

Ensure you have:

Caution

Refunds are not supported with Pay by Bank payments.

Implement refund processing

1. Retrieve the original order details

Use the Retrieve an order endpoint to confirm:

  • the order is in state completed
  • the amount and currency you will use for the refund
  • how much you have already refunded (if you support multiple partial refunds)

2. Create a refund order

Create a refund by calling Refund an order from your backend server, using the original order id you want to refund.

Required parameters:

ParameterDescription
amountSpecified in the smallest currency unit (for example, 10000 = £100.00).
currencyMust match the original order currency.

Optional parameters:

ParameterDescription
descriptionOptional, user-facing description for the refund.
merchant_order_data.referenceYour internal refund reference/ID for correlating Revolut refund orders with your system. This value is included in webhook callbacks as merchant_order_ext_ref.
metadataOptional key-value pairs for internal tracking.

Set amount to the full captured amount of the original order.

Request body
{
"amount": 10000,
"currency": "GBP"
}

When the operation succeeds, store the refund order id from the response. You'll use it to monitor the refund status.

3. Monitor refund status

Refunds are processed asynchronously, so you should monitor the refund order until you can confirm that it completed successfully.

Listen to webhooks to receive asynchronous notifications when the refund order changes state. This is the recommended way to get notified about refund outcomes.

To set up webhooks, follow: Use webhooks to track order and payment lifecycle.

When you create the refund, you receive a refund order id. Use that value to correlate webhook callbacks (it will appear as order_id in the webhook payload).

Subscribe to these events and handle them for the refund order:

EventDescription
ORDER_COMPLETEDRefund finished successfully
ORDER_PAYMENT_DECLINEDRefund could not be processed (declined)
ORDER_PAYMENT_FAILEDRefund could not be processed (technical failure)
Webhook payload example
{
"event": "ORDER_COMPLETED",
"order_id": "6852e9a6-5cf0-ac65-8182-6a9c251011ce"
}
Info

For refunds to card-based payment methods (including digital wallets), your system may receive confirmation (for example, ORDER_COMPLETED) before the customer sees the funds on their account.

If the customer contacts you, retrieve the refund order and check payments[].payment_method.arn. The ARN (Acquirer Reference Number) is a 23-digit reference that the customer's bank can use to trace the refund and potentially speed up support on their side.

The arn is only returned for refund payments made by a card.

What's next

Explore related topics:

API references:

Related resources:

Setup:

Accept payments integrations: