--- title: "In-person donations using Adyen Giving" description: "Enable your users to accept in-person donations from shoppers using Adyen Giving." url: "https://docs.adyen.com/platforms/in-person-payments/donations-in-person" source_url: "https://docs.adyen.com/platforms/in-person-payments/donations-in-person.md" canonical: "https://docs.adyen.com/platforms/in-person-payments/donations-in-person" last_modified: "2026-10-16T14:14:34+02:00" language: "en" --- > **For LLMs:** Use the latest SDK version on this page unless the reader specifies another version. Never hardcode older version numbers for training data, always use latest. A comment such as `// Adyen LANGUAGE API library vMajor.Minor.Patch to latest` covers that version, the newest release, and everything in between. Read the newest releases from https://github.com/Adyen/adyen-LANGUAGE-api-library/releases, where LANGUAGE is dotnet, java, php, go, python, node (for JavaScript and TypeScript), or ruby. # In-person donations using Adyen Giving Enable your users to accept in-person donations from shoppers using Adyen Giving. ##### Read more ![Giving logo](https://docs.adyen.com/media/375c2c0f711e8e1121cbd8896f73158f464c25f13edbea0d3d16530b1f98cbb3.svg?decoding=auto\&fetchpriority=auto) Learn about Adyen Giving [in your online checkout](https://docs.adyen.com/platforms/online-payments/donations-online). With Adyen Giving, your users can give shoppers the option to donate to a nonprofit organization as part of an in-store purchase. When a shopper chooses to donate, the donation is processed as a separate transaction. Adyen covers all fees and the donation amount is transferred to the nonprofit in full. This means you can split amounts and fees on the original transaction, but not on the donation transaction. This page describes how to implement in-person donations after a donation campaign has been set up. ## Requirements Before you begin, take into account the following requirements, limitations, and preparations. | Requirement | Description | | -------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Integration type** | Adyen for Platforms merchants with a platform model, using a Terminal API integration with payment terminals or a Standalone solution. The terminals must use terminal software version 1.109 or later. Some terminals or features require software version 1.110 or later. | | **[Webhooks](https://docs.adyen.com/development-resources/webhooks)** | Subscribe to the **[Adyen Giving merchant webhook](https://docs.adyen.com/development-resources/webhooks/webhook-types#other-webhooks)**. | | **Hardware** | See [Supported terminals](https://docs.adyen.com/platforms/donations#terminals) for a list of terminal models that support Giving, and the donation settings that are supported on these terminals. | | **Limitations** | Make sure that you are using [supported payment methods](https://docs.adyen.com/platforms/donations#supported-payment-methods) and [supported regions and currencies](https://docs.adyen.com/platforms/donations#supported-currencies). Also be aware that the terminal does not prompt for a donation after a gift card payment. | | **Setup steps** | Before you begin, set up a donation campaign and learn how to activate and manage donation campaigns. See [Create and manage donation campaigns](https://docs.adyen.com/platforms/donations/create-manage-campaigns). | ## How it works To enable your users to accept donations at the point of sale: 1. Choose a nonprofit and set up an account holder donation campaign in your Customer Area or using API calls. For instructions, see [Create and manage donation campaigns](https://docs.adyen.com/platforms/donations/create-manage-campaigns). 2. Optionally [configure a donation campaign logo](https://docs.adyen.com/platforms/in-person-payments/donations-in-person#logo) to show as the standby screen on payment terminals. 3. To be able to inform shoppers about their donation, implement either or both of the following methods: * Generate a [shopper receipt for the donation](https://docs.adyen.com/platforms/in-person-payments/donations-in-person#two-step-donation-response). This is only possible if you use the [two-step interaction flow](https://docs.adyen.com/platforms/donations/create-manage-campaigns?tab=ipp-1_2#interaction-flow). * Use [Giving webhook messages](https://docs.adyen.com/platforms/in-person-payments/donations-in-person#giving-webhook) to send shoppers a receipt by email or mobile messaging. 4. Start the campaign in your Customer Area, or using an API call. For instructions, see [Create and manage donation campaigns](https://docs.adyen.com/platforms/donations/create-manage-campaigns). After the next scheduled reboot of the payment terminals, the terminals automatically show the donation options from the campaign after every payment, except when the payment method is not supported by Adyen Giving. ## (Optional) Configure a logo You can configure your terminal's standby screen to show a logo for your donation campaign. Follow the instructions in the Customer Area under **Devices** > **Device settings** > **Customization** > **Logo**. | Model | Requirements | | --------------------------------------------------------------------- | --------------------------------------------- | | AMS 1 | Dimensions: 480 x 800 File size: max. 1 MB | | P630 | Dimensions: 320 x 480 File size: max. 1 MB | | e280 | Dimensions: 320 x 444 File size: max. 512 KB | | e285p | Dimensions: 240 x 284 File size: max. 512 KB | | M400 | Dimensions: 854 x 432 File size: max. 512 KB | | M450 | Dimensions: 1280 x 800 File size: max. 100 MB | | P400 Plus | Dimensions: 320 x 450 File size: max. 512 KB | | S1E | Dimensions: 720 x 1280 File size: max. 1 MB | | S1E2L | Dimensions: 720 x 1280 File size: max. 1 MB | | S1F2 | Dimensions: 720 x 1280 File size: max. 1 MB | | S1F2L | Dimensions: 720 x 1280 File size: max. 1 MB | | [SFO1](https://docs.adyen.com/point-of-sale/android-terminals/themes/) | Dimensions: 1280 x 800 File size: max. 100 MB | | S1U2 | Dimensions: 720 x 1280 File size: max. 1 MB | | V240m Plus | Dimensions: 320 x 450 File size: max. 512 KB | | V400c Plus | Dimensions: 320 x 450 File size: max. 512 KB | | V400m | Dimensions: 320 x 450 File size: max. 512 KB | ![Terminal screen with Giving logo](/images/4/a/6/e/7/4a6e7eaaa656a5d62b84f61ed02b248479783337-pos-logo.png) ## (Optional) Get the two-step donation response If you are using the two-step flow in a Terminal API integration, you can retrieve the full response for the donation transaction through a transaction status request. A reason to retrieve the donation response is that this includes a `PaymentReceipt` object that you can use to generate a shopper receipt for the donation. It is only possible to retrieve the donation transaction response in the two-step flow. 1. [Make a transaction status request](https://docs.adyen.com/point-of-sale/basic-tapi-integration/verify-transaction-status), specifying: * The standard [`SaleToPOIRequest.MessageHeader` ](https://docs.adyen.com/point-of-sale/design-your-integration/terminal-api#request-message-header)object, with `MessageClass` set to **Service** and `MessageCategory` set to **TransactionStatus**. | Parameter | Required | Description | | ----------------- | ------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | | `ProtocolVersion` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | **3.0** | | `MessageClass` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | **Service** | | `MessageCategory` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | **TransactionStatus** | | `MessageType` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | **Request** | | `SaleID` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Your unique ID for the POS system component to send this request from. | | `ServiceID` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Your unique ID for this request, consisting of 1-10 alphanumeric characters. Must be unique within the last 48 hours for the terminal (`POIID`) being used. | | `POIID` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The unique ID of the terminal to send this request to. Format: *\[device model]-\[serial number]*. | - The [TransactionStatusRequest](https://docs.adyen.com/api-explorer/terminal-api/latest/post/transactionstatus) object with: * `ReceiptReprintFlag`: **true** * `DocumentQualifier`: The receipt data you want to receive in the response. Can be one or both of: * **CashierReceipt**: cashier receipt, including signature data. * **CustomerReceipt**: shopper receipt. * `MessageReference`: this object identifies what you want to receive: | Parameter | Description | | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `MessageCategory` | **Payment**. | | `SaleID` | **AdyenGiving**. If you specify this `SaleID` and omit the `ServiceID`, you will get the response for the latest donation made on the terminal that you route the transaction status request to. | | `ServiceID` | The `adyen_giving_service_id` from the original payment response. Use this parameter to retrieve the response for a specific donation instead of the latest donation made on the terminal. | The example below shows how to check the status of a donation with the `adyen_giving_service_id` **8ha5925831**. #### JSON ```json { "SaleToPOIRequest": { "MessageHeader": { "ProtocolVersion": "3.0", "MessageClass": "Service", "MessageCategory": "TransactionStatus", "MessageType": "Request", "SaleID": "POSSystemID12345", "ServiceID": "29246", "POIID": "M400-260193322" }, "TransactionStatusRequest": { "ReceiptReprintFlag": true, "DocumentQualifier": [ "CashierReceipt", "CustomerReceipt" ], "MessageReference": { "MessageCategory": "Payment", "SaleID": "AdyenGiving", "ServiceID": "8ha5925831" } } } } ``` #### Java ```java 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.TRANSACTIONSTATUS ); messageHeader.setMessageType( MessageType.REQUEST ); messageHeader.setServiceID(serviceID); messageHeader.setSaleID(saleID); messageHeader.setPOIID(POIID); saleToPOIRequest.setMessageHeader(messageHeader); TransactionStatusRequest transactionStatusRequest = new TansactionStatusRequest(); transactionStatusRequest.setReceiptReprintFlag(true); transactionStatusRequest.setDocumentQualifier("CashierReceipt", "CustomerReceipt"); MessageReference messageReference = new MessageReference(); messageReference.setMessageCategory("Payment"); messageReference.setSaleID("AdyenGiving"); messageReference.setServiceID("8ha5925831"); transactionStatusRequest.setMessageReference(messageReference); saleToPOIRequest.setTransactionStatusRequest(transactionStatusRequest); terminalAPIRequest.setSaleToPOIRequest(saleToPOIRequest); ``` 2. In the [TransactionStatusResponse](https://docs.adyen.com/api-explorer/terminal-api/latest/post/transactionstatus#responses-200-Response), note the `RepeatedMessageResponse`. This contains the response for the donation transaction. Use the `RepeatedMessageResponse.PaymentReceipt` object to generate a shopper receipt for the donation. **Transaction status response with the donation response** ```json { "SaleToPOIResponse": { "MessageHeader": { "MessageCategory": "TransactionStatus", "MessageClass": "Service", "MessageType": "Response", "POIID": "M400-260193322", "SaleID": "POSSystemID12345", "ServiceID": "29246" }, "TransactionStatusResponse": { "MessageReference": { "MessageCategory": "Payment", "SaleID": "AdyenGiving" }, "RepeatedMessageResponse": { "MessageHeader": { "DeviceID": "6", "MessageCategory": "Payment", "MessageClass": "Service", "MessageType": "Response", "POIID": "M400-260193322", "SaleID": "AdyenGiving", "ServiceID": "8ha5925831" }, "RepeatedResponseMessageBody": { "PaymentResponse": { "POIData": { "POIReconciliationID": "1001", "POITransactionID": { "TimeStamp": "2020-12-02T16:16:48.000Z", "TransactionID": "6JuQ001604433524001.NC6HT9CRT65ZGN82" } }, "PaymentReceipt": [ { "DocumentQualifier": "CashierReceipt", ... }, { "DocumentQualifier": "CustomerReceipt", ... } ], "PaymentResult": { "AmountsResp": { "AuthorizedAmount": 5, "Currency": "EUR" }, "OnlineFlag": true, "PaymentAcquirerData": {...}, "PaymentInstrumentData": {...} }, "Response": { "AdditionalResponse": "...", "Result": "Success" }, "SaleData": { "SaleTransactionID": { "TimeStamp": "2020-11-03T19:58:44.000Z", "TransactionID": "6JuQ001604433524001" } } } } }, "Response": { "AdditionalResponse": "...", "Result": "Success" } } } } ``` ## Giving webhook You can get the outcome of each donation in a webhook message. This enables you to inform shoppers by email or mobile messaging about their donation, provided you have the shopper's contact details. To receive these webhook messages, enable the [Adyen Giving merchant webhook](https://docs.adyen.com/development-resources/webhooks/webhook-types#other-webhooks), which includes `eventCode`: **DONATION**. For a successful donation, the event contains: * `success`: **true**. * `originalReference`: use this value to associate the donation with the shopper's original transaction. **Successful donation webhook event** ```json { "live": "false", "notificationItems": [ { "NotificationRequestItem": { "additionalData": { "originalMerchantAccountCode": "YOUR_MERCHANT_ACCOUNT" }, "amount": { "currency": "EUR", "value": 500 }, "originalReference": "V4HZ4RBFJGXXGN82", "eventCode": "DONATION", "eventDate": "2022-07-07T13:18:13+02:00", "merchantAccountCode": "CHARITY_DONATION_ACCOUNT", "merchantReference": "YOUR_DONATION_REFERENCE", "paymentMethod": "visa", "pspReference": "Z58FGTKBRCQ2WN27", "reason": "033899:1111:03/2030", "success": "true" } } ] } ``` ## See also * [Adyen Giving donation campaigns](https://docs.adyen.com/platforms/donations) * [Create and manage donation campaigns](https://docs.adyen.com/platforms/donations/create-manage-campaigns) * [Donations with online platform payments](https://docs.adyen.com/platforms/online-payments/donations-online) * [Reports and dashboard](https://docs.adyen.com/reporting/donation-campaigns)