Search

Are you looking for test card numbers?

Would you like to contact support?

Point-of-sale icon

Adyen Giving for point of sale

Enable your shoppers to donate to charity when they make an in-store purchase.

  Read more

Learn more about Adyen Giving on adyen.com.

With Adyen Giving, you can give your shoppers the option to donate to a charity after they made a purchase in your store.

Donations can be made using many popular payment methods, and are settled directly to the charity's bank account.

Adyen Giving is supported with Terminal API and Classic integrations and also with the Standalone solution. All you need is one of the following payment terminals:

  • M400
  • P400 Plus
  • V240m Plus
  • V400c Plus
  • V400m

Before your charity can receive donations, they need to be onboarded and we need to configure Adyen Giving for your merchant account. The payment terminal will then prompt for a donation either:

  • Automatically after every payment. This is possible with all integrations and with the Standalone solution.
  • Through your payment request, so that you have control over when to ask for a donation. This is possible with a Terminal API integration.

Supported payment methods

In-store donations are supported for the following payment methods:

  • Credit and debit cards: American Express, Bancontact, Carte Bancaire, Diners, Discover, JCB, Mastercard, UnionPay, Visa, Visa Debit.
  • Wallets: Apple Pay and Google Pay.

How it works

The terminal doesn't prompt for a donation when it is offline or after a gift card payment.

Regardless of whether donation is prompted automatically after every payment of through your payment request, the donation flow is as follows:

  1. You initiate a payment for the goods your shopper is purchasing.

  2. The shopper presents their card on the payment terminal and completes the payment.
    In a Terminal API or Classic integration, you receive the response to your payment request.

  3. The terminal shows the payment is Approved and presents the options to donate to the charity.

       
  4. If the shopper chooses to donate, the terminal starts a new transaction (the donation transaction) for the amount that the shopper selected.
    In a Terminal API or classic integration, you won't receive a response for this transaction.

  5. The shopper presents their card and completes the donation transaction.
    The donation is routed to the charity, and settled directly to their bank account.

Your shopper will see two separate charges on their bank statement, one for the payment, and one for the donation.

Onboarding with Adyen Giving

Before your charity can receive donations, they need to be onboarded with Adyen Giving.

You should approach your chosen charity and get their consent before beginning the onboarding process.

To begin the onboarding process, contact either your Adyen Account Manager or our POS Support Team. They will handle the onboarding with the charity. The charity will get their own Customer Area account, where they can see an overview of donations, and handle any refunds and chargebacks.

Configure Adyen Giving

When you contact us to start the onboarding process of your charity, also let us know:

  • Whether you want to automatically prompt for a donation after every payment, or prompt for a donation through your payment request. The latter is possible with a Terminal API integration.
  • What donation options you want to show on the terminal display. You can also configure donation options and related settings yourself in your Customer Area under Payment features.

Donation options

The donation options include:

  • The Not now option. This enables shoppers to skip donating.
  • Up to three other options. These can include fixed donation amounts and the Custom option that lets shoppers enter an amount of their own choice.

Ask for a donation through your payment request

With a Terminal API integration you can use the tender option AskGiving in your payment request to control when the shopper is asked for a donation.

To ensure that the terminal prompts the shopper for a donation after their payment:

  • Make a PaymentRequest that contains a SaletoAcquirerData field with the tender option AskGiving specified in one of the following formats:

    • Option 1: A JSON object {"tenderOption": "AskGiving"} converted to a Base64 encoded string:
      "SaleToAcquirerData": "eyJ0ZW5kZXJPcHRpb24iOiAiQXNrR2l2aW5nIn0="

    • Option 2: tenderOption=AskGiving:
      "SaleToAcquirerData": "tenderOption=AskGiving"

    The format that you use here will also be the format of the AdditionalResponse that you receive.

    If there are more tender options and other data elements that you need to pass in the SaleToAcquirerData field, refer to Add information to a payment for instructions.

    {
        "SaleToPOIRequest": {
            "PaymentRequest": {
                "SaleData": {
                    "SaleTransactionID": {
                        "TransactionID": "5748",
                        "TimeStamp": "2020-05-12T15:15:10.094Z"
                    },
                    "SaleToAcquirerData": "tenderOption=AskGiving"
                },
                "PaymentTransaction": {
                    "AmountsReq": {
                        "Currency": "EUR",
                        "RequestedAmount": 155.75
                    }
                }
            },
            "MessageHeader": {
                "ProtocolVersion": "3.0",
                "MessageClass": "Service",
                "MessageCategory": "Payment",
                "MessageType": "Request",
                "ServiceID": "0110123015",
                "SaleID": "POSSystemID12345",
                "POIID": "M400-260193322"
            }
        }
    }
    {
        "SaleToPOIResponse": {
            "PaymentResponse": {
                "POIData": {...},
                "SaleData": {
                    "SaleTransactionID": {
                        "TimeStamp": "2020-05-12T15:15:10.114Z",
                        "TransactionID": "5748"
                    }
                },
                "PaymentReceipt": [...],
                "PaymentResult": {
                    "AuthenticationMethod": [
                        "OfflinePIN"
                    ],
                    "OnlineFlag": true,
                    "PaymentAcquirerData": {...},
                    "PaymentInstrumentData": {
                        "CardData": {
                            "EntryMode": [
                                "ICC"
                            ],
                            "PaymentBrand": "mc",
                            "MaskedPan": "679999 **** 9990",
                            "CardCountryCode": "056",
                            "SensitiveCardData": {
                                "CardSeqNumb": "53",
                                "ExpiryDate": "0228"
                            }
                        },
                        "PaymentInstrumentType": "Card"
                    },
                    "AmountsResp": {
                        "AuthorizedAmount": 155.75,
                        "Currency": "EUR"
                    }
                },
                "Response": {
                    "Result": "Success",
                    "AdditionalResponse": "tid=46403161&AID=A000000004306001&transactionType=GOODS_SERVICES&backendGiftcardIndicator=false&posadditionalamounts.originalAmountValue=15575&expiryYear=2028&acquirerAccountCode=TestPmmAcquirerAccount&alias=F104782554379733&posAmountGratuityValue=0&giftcardIndicator=false&authorisedAmountValue=15575&pspReference=8835892889814781&cardHolderName=TC03_MS_Approved&paymentMethodVariant=maestro&refusalReasonRaw=APPROVED&authorisationMid=1000&applicationPreferredName=ms%20en&acquirerCode=TestPmmAcquirer&store=StoreOne&txtime=15%3a09%3a30&iso8601TxDate=2020-05-12T13%3a09%3a30.0000000%2b0000&cardType=maestro&posOriginalAmountValue=15575&offline=false&aliasType=Default&txdate=12-05-2020&paymentMethod=mc&cvcResult=0%20Unknown&authorisedAmountCurrency=EUR&tc=245112BC14E6289F&avsResult=0%20Unknown&cardIssueNumber=53&mid=1000&merchantReference=5748&transactionReferenceNumber=8835892889814781&applicationLabel=MSEN&expiryMonth=02&cardSummary=9990&posadditionalamounts.originalAmountCurrency=EUR&posAuthAmountCurrency=EUR&cardHolderVerificationMethodResults=440702&authCode=123456&cardIssuerCountryId=056&adjustAuthorisationData=BQABAQCJI8pVcFu3cvL1028sueqfNOXsRlCVKnxplhEIkDch6y1DBWsoRCwu75q4%2bh83ORBZV%2fdk6GPAF2mHFY2avSLaOWgqlQNJ%2bU3fKrjFgg7bB3Ym11l6DhoZJ5CaoDdvxVYzJfLVep%2bhz%2bKGBwIv7lliBiUX2GcmCdTjPq7OSZZWaNfjmpKOxWlZzUuYMBuuvbB0Gm2GuDgrEpFtEMT444qfLXC%2fXhY%2fGy3%2fR7xIg1v2KM%2bGHn3i8U4J4XYuR7hYBnUE1pA0HdS20%2b90sct8iOEackSkxbBK9CvGbIXi6B5fYISduGZzRY2s72HdFk3ZnEo122kRd9uam5E9xm0EFYxpEKAzsvVGwJO%2bbt8oDqiGoA4AAIq3mLR0%2b0XQoOTCe25LzcWJMA5hM8jbV3GivUnDQdLAiIKjbNX54O0q8TqnWzU3e3yuuLViaQ1%2f4QKDS0%2b9sBZSYf9Id7UAjP%2bC5OoDA8BnkFwcqS6D8iSfGIPH5gNETS3Xe5y6v7op4jWSU0ZuXztOo%2fepQ78chOXm9N88ZgVnFdouF64g2t9aze7P6BOZJBeLC1Qa31l5St7vuT2%2fR4PoB9D%2bp%2b1SPmGkHtVboZuKcBkCkt9St73BWfvkwZ1jtjdvmGC12rhOEV5VgRZPkkqHBufjunT3OviR9O%2fx7v3drDGOB6z2W9%2bV2jCqfUqjL17T8KVgZGjRYB3mOJbHKTGfdMN25jA7gEmwdAQXPudRpJ9Qky9aeuq425ZPMBjjrBpfYEK2zH3GF6xukZKIQSWlFPahzDNnsS4TtBpYR7ngjNJjZYzc3cGxd4PMeO3%2fPd8OhXeOrvOqgJ9uhUR3ZTlcDQ%3d%3d&posAmountCashbackValue=0&posEntryMode=ICC&fundingSource=DEBIT&issuerCountry=BE&cardScheme=maestro&cardBin=679999&posAuthAmountValue=15575"
                }
            },
            "MessageHeader": {...}
        }
    }
    String serviceID = "YOUR_UNIQUE_ATTEMPT_ID";
        String saleID = "YOUR_CASH_REGISTER_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.setServiceID(serviceID);
        messageHeader.setSaleID(saleID);
        messageHeader.setPOIID(POIID);
        saleToPOIRequest.setMessageHeader(messageHeader);
    
        PaymentRequest paymentRequest = new PaymentRequest();
        SaleData saleData = new SaleData();
        TransactionIdentification saleTransactionID = new TransactionIdentification();
        saleTransactionID.setTransactionID(transactionID);
        saleTransactionID.setTimeStamp(DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar()));
        saleData.setSaleTransactionID(saleTransactionID);
        saleData.setSaleToAcquirerData("tenderOption=AskGiving");
        paymentRequest.setSaleData(saleData);
    
        PaymentTransaction paymentTransaction = new PaymentTransaction();
        AmountsReq amountsReq = new AmountsReq();
        amountsReq.setCurrency("EUR");
        amountsReq.setRequestedAmount( BigDecimal.valueOf(155.75) );
        paymentTransaction.setAmountsReq(amountsReq);
        paymentRequest.setPaymentTransaction(paymentTransaction);
        saleToPOIRequest.setPaymentRequest(paymentRequest);
        terminalAPIRequest.setSaleToPOIRequest(saleToPOIRequest);

    Note that the payment response is exactly the same as the response you receive for a payment request without AskGiving tender option. The cash register receives no information about the shopper's response to the donation prompt, because the donation transaction is started by the payment terminal after the payment transaction is completed.

See also