Are you looking for test card numbers?

Would you like to contact support?

No momento, esta página não está disponível em inglês
Point-of-sale icon

Unreferenced refund

Issue a point-of-sale refund to any card presented to the payment terminal.

To return funds to a shopper after a payment is Approved, you need to refund the payment. Unreferenced refunds let you return any amount to any card presented to the payment terminal. But you need to manually reconcile those refunds.

If you are using unreferenced refunds, we highly recommend that you ensure your POS app can reconcile a refund against the original purchase. This reduces the risk of return fraud (a payment being refunded multiple times), and human error (store staff enter the wrong refund amount).

Also consider checking beforehand if the card that the shopper presents to the terminal is the same card that was used for the original payment. To do so, you need to implement card acquisition and save the card alias of all transactions. See card acquisition before refunding.

It is not possible to make an unreferenced refund to a QR code wallet, such as Alipay and WeChat Pay. To refund these payment methods you must make a referenced refund.

Enable unreferenced refunds

Before you make unreferenced refunds, contact our POS Support Team team and ask them to:

  • Enable unreferenced refunds for your merchant account.
  • (Optional) Set a refund delay, so you have time to cancel an unreferenced refund when necessary.

Make an unreferenced refund

For an unreferenced refund to a gift card, you need to specify more parameters than we describe here. Refer to Make a refund to a gift card.

  1. Make a POST request to a Terminal API endpoint, specifying:

    • PaymentRequest: the request body. Specify:

      Parameter Description
      SaleData.SaleTransactionID An object with:
      • TransactionID: your unique reference to identify the refund. Your Customer Area and Adyen reports show this ID as the merchant reference for the transaction.

        If the original payment was an offline payment, you can make reconciliation easier by including the tender reference of the offline payment.

      • TimeStamp: Date and time of the refund in UTC format.
      PaymentTransaction.AmountsReq An object with:
      • Currency: The transaction currency.
      • RequestedAmount: The amount being refunded to the card.
      PaymentData.PaymentType Refund

    The next example shows how to refund EUR 10.99 to a card.

    {
        "SaleToPOIRequest":{
            "MessageHeader":{
                "ProtocolVersion":"3.0",
                "MessageClass":"Service",
                "MessageCategory":"Payment",
                "MessageType":"Request",
                "SaleID":"POSSystemID12345",
                "ServiceID":"175",
                "POIID":"V400m-324688179"
            },
            "PaymentRequest":{
                "SaleData":{
                    "SaleTransactionID":{
                        "TimeStamp":"2022-02-04T11:54:28.000Z",
                        "TransactionID":"YOUR_REFUND_REFERENCE"
                    }
                },
                "PaymentTransaction":{
                    "AmountsReq":{
                        "Currency":"EUR",
                        "RequestedAmount":10.99
                    }
                },
                "PaymentData":{
                    "PaymentType":"Refund"
                }
            }
        }
    }
    String saleID = "YOUR_CASH_REGISTER_ID";
    String serviceID = "YOUR_UNIQUE_ATTEMPT_ID";
    String POIID = "YOUR_TERMINAL_ID";
    String transactionID = "YOUR_UNIQUE_TRANSACTION_ID";
    
    SaleToPOIRequest saleToPOIRequest = new SaleToPOIRequest();
    MessageHeader messageHeader = new MessageHeader();
    messageHeader.setProtocolVersion("3.0");
    messageHeader.setMessageClass( MessageClassType.SERVICE );
    messageHeader.setMessageCategory( MessageCategoryType.PAYMENT );
    messageHeader.setMessageType( MessageType.REQUEST );
    messageHeader.setSaleID(saleID);
    messageHeader.setServiceID(serviceID);
    messageHeader.setPOIID(POIID);
    saleToPOIRequest.setMessageHeader(messageHeader);
    
    PaymentRequest paymentRequest = new PaymentRequest();
    SaleData saleData = new SaleData();
    TransactionIdentification saleTransactionID = new TransactionIdentification();
    saleTransactionID.setTimeStamp(DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar()));
    saleTransactionID.setTransactionID(transactionID);
    saleData.setSaleTransactionID(saleTransactionID);
    paymentRequest.setSaleData(saleData);
    
    PaymentTransaction paymentTransaction = new PaymentTransaction();
    AmountsReq amountsReq = new AmountsReq();
    amountsReq.setCurrency("EUR");
    amountsReq.setRequestedAmount( BigDecimal.valueOf(10.99) );
    paymentTransaction.setAmountsReq(amountsReq);
    paymentRequest.setPaymentTransaction(paymentTransaction);
    
    PaymentData paymentData = new PaymentData();
    paymentData.setPaymentType( PaymentType.REFUND );
    paymentRequest.setPaymentData(paymentData);
    saleToPOIRequest.setPaymentRequest(paymentRequest);
    terminalAPIRequest.setSaleToPOIRequest(saleToPOIRequest);
  2. Let the shopper complete the transaction on the terminal. The terminal prompts the shopper to present their card, and then shows Approved.

  3. When you receive the PaymentResponse, note the following:

    • Response.Result: Success. This means we received your request. Usually, the refund is processed asynchronously.

      Whether the refund is processed synchronously or asynchronously depends on the card scheme and the country where the card is used. If processed synchronously, you get the acquirerResponseCode in the AdditionalResponse.

    • POIData.POITransactionID.TransactionID: the transaction identifier for this refund request, in the format tenderReference.pspReference.
    • PaymentReceipt: the generated receipt data. This includes transaction_type_refund.
    • SaleData.SaleTransactionID.TransactionID: the reference you provided in the request.
    • Response.AdditionalResponse with:
      • transactionType: REFUND
      • posAuthAmountValue: the refund amount (in minor units) that we try to get authorised.
      • pspReference: the PSP reference for this refund request.
      • acquirerResponseCode: if this field is included, the request was processed synchronously. The value Approved means the refund is approved.
    Unreferenced refund response
    {
        "SaleToPOIResponse": {
            "MessageHeader": {
                "MessageCategory": "Payment",
                "MessageClass": "Service",
                "MessageType": "Response",
                "POIID": "V400m-324688179",
                "ProtocolVersion": "3.0",
                "SaleID": "POSSystemID12345",
                "ServiceID": "175"
            },
            "PaymentResponse": {
                "POIData": {
                    "POIReconciliationID": "1000",
                    "POITransactionID": {
                        "TimeStamp": "2022-02-04T11:54:29.000Z",
                        "TransactionID": "ItS6001643972069002.ZC4R4RBFJGXXGN82"
                    }
                },
                "PaymentReceipt": [...],
                "PaymentResult": {
                    "AmountsResp": {
                        "AuthorizedAmount": 10.99,
                        "Currency": "EUR"
                    },
                    ...
                    "PaymentAcquirerData": {
                        "AcquirerPOIID": "V400m-324688179",
                        "AcquirerTransactionID": {
                            "TimeStamp": "2022-02-04T11:54:29.000Z",
                            "TransactionID": "ZC4R4RBFJGXXGN82"
                        },
                        "MerchantID": "YOUR_MERCHANT_ACCOUNT"
                    },
                    "PaymentInstrumentData": {
                        "CardData": {...}
                        },
                        "PaymentInstrumentType": "Card"
                    },
                    "PaymentType": "Refund"
                },
                "Response": {
                    "AdditionalResponse": "...transactionType=REFUND...{hint:This is included only if the refund is processed synchronously.}acquirerResponseCode=APPROVED{/hint}...posAuthAmountValue=1099...pspReference=ZC4R4RBFJGXXGN82...alias=P601291289070502",
                    "Result": "Success"
                },
                "SaleData": {
                    "SaleTransactionID": {
                        "TimeStamp": "2022-02-04T10:54:26.740Z",
                        "TransactionID": "YOUR_REFUND_REFERENCE"
                    }
                }
            }
        }
    }
  4. Wait for the REFUND_WITH_DATA webhook to learn the outcome. If successful, the refund is issued to the shopper's account.

For a complete list of fields you can pass and receive for an unreferenced refund, see the PaymentRequest API reference and the PaymentResponse API reference.

See also