{"title":"Tipping from the POS app","category":"default","creationDate":1681720800,"content":"<p>Here we describe how to implement tipping in your payment flow where the payment request that you send from your POS app includes a tip amount. The terminal shows the original transaction amount and the tip amount. The customer then uses the terminal to confirm the tip, change the amount, or decline giving a tip.<\/p>\n<h2 id=\"before-you-begin\">Requirements<\/h2>\n<p>Before you begin, take into account the following requirements, limitations, and preparations.<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Requirement<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><strong>Integration type<\/strong><\/td>\n<td style=\"text-align: left;\">A <a href=\"\/point-of-sale\/design-your-integration\/terminal-api\">Terminal API<\/a> with payment terminals.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong>Hardware<\/strong><\/td>\n<td style=\"text-align: left;\">All terminal models are supported, except unattended terminals.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong>Setup steps<\/strong><\/td>\n<td style=\"text-align: left;\">Implement logic in your POS app to provide the tip amount for payment requests.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Set up tipping in your POS app<\/h2>\n<p>The tip amount to propose to your customer on the terminal can be a percentage of the transaction amount, a fixed amount, one of various fixed amounts depending on the transaction amount, and so on.<br \/>\nYou need to implement logic on your end to ensure your POS app provides the tip amount that you need to include in your payment request.<\/p>\n<h2 id=\"make-payment\">Make a payment<\/h2>\n<p>After you configured tipping in your POS system, you are ready to make a payment request that includes a <code>TipAmount<\/code>. This shows the transaction amount and the proposed tip amount on the terminal display.<\/p>\n<ol>\n<li>\n<p><a href=\"\/point-of-sale\/basic-tapi-integration\/make-a-payment\">Make a payment request<\/a>, specifying:<\/p>\n<ul>\n<li>\n<p>The standard <a href=\"\/point-of-sale\/design-your-integration\/terminal-api#request-message-header\">\n  <code>SaleToPOIRequest.MessageHeader<\/code>\n<\/a> object, with <code>MessageClass<\/code> set to <span translate=\"no\"><strong>Service<\/strong><\/span> and <code>MessageCategory<\/code> set to <span translate=\"no\"><strong>Payment<\/strong><\/span>.<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: center;\">Required<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>ProtocolVersion<\/code><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\"><strong>3.0<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>MessageClass<\/code><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\"><span translate=\"no\"><strong>Service<\/strong><\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>MessageCategory<\/code><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\"><span translate=\"no\"><strong>Payment<\/strong><\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>MessageType<\/code><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\"><span translate=\"no\"><strong>Request<\/strong><\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>ServiceID<\/code><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\">Your unique ID for this request, consisting of 1-10 alphanumeric characters. Must be unique within the last 48 hours for the terminal (<code>POIID<\/code>) being used.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>SaleID<\/code><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\">Your unique ID for the POS system component to send this request from.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>POIID<\/code><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\">The unique ID of the terminal to send this request to. Format: <em>[device model]-[serial number]<\/em>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>The  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/terminal-api\/latest\/post\/payment\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">PaymentRequest<\/a> object with:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: center;\">Required<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>SaleData.SaleTransactionID<\/code><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\">An object with: <ul><li markdown=\"1\"><code>TransactionID<\/code>: your reference to identify a payment. We recommend using a unique value. In your Customer Area and Adyen reports, this will show as the <strong>merchant reference<\/strong> for the transaction.<\/li> <li markdown=\"1\"><code>TimeStamp<\/code>: date and time of the request in <a href=\"https:\/\/en.wikipedia.org\/wiki\/ISO_8601#Coordinated_Universal_Time_(UTC)\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">UTC format<\/a>.<\/li><\/ul><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>PaymentTransaction.AmountsReq<\/code><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\">An object with: <ul><li markdown=\"1\"><code>Currency<\/code>: the transaction <a href=\"\/development-resources\/currency-codes\">currency<\/a>.<\/li><li markdown=\"1\"><code>RequestedAmount<\/code>: the transaction amount.<\/li> <li markdown=\"1\"><code>TipAmount<\/code>: the tip amount.<\/li><\/ul><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/li>\n<\/ul>\n<p>The example below shows how to initiate a payment of <strong>EUR&nbsp;142.50<\/strong> with a <strong>10%<\/strong> tip.<\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Payment request with tipping'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n  \\\"SaleToPOIRequest\\\":{\\n    \\\"MessageHeader\\\":{\\n      \\\"ProtocolVersion\\\":\\\"3.0\\\",\\n      \\\"MessageClass\\\":\\\"Service\\\",\\n      \\\"MessageCategory\\\":\\\"Payment\\\",\\n      \\\"MessageType\\\":\\\"Request\\\",\\n      \\\"SaleID\\\":\\\"POSSystemID12345\\\",\\n      \\\"ServiceID\\\":\\\"0207111104\\\",\\n      \\\"POIID\\\":\\\"P400Plus-275688710\\\"\\n    },\\n    \\\"PaymentRequest\\\":{\\n      \\\"SaleData\\\":{\\n        \\\"SaleTransactionID\\\":{\\n          \\\"TransactionID\\\":\\\"27908\\\",\\n          \\\"TimeStamp\\\":\\\"2019-12-17T10:11:03.000Z\\\"\\n        }\\n      },\\n      \\\"PaymentTransaction\\\":{\\n        \\\"AmountsReq\\\":{\\n          \\\"Currency\\\":\\\"EUR\\\",\\n          \\\"RequestedAmount\\\":142.50,\\n          \\\"TipAmount\\\":14.25\\n        }\\n      }\\n    }\\n  }\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<p>The payment request is routed to the payment terminal. The customer accepts, changes, or declines the tip and completes the payment. The terminal then collects the payment details and sends the request for the original transaction amount plus the tip amount to the Adyen payments platform.<\/p>\n<p>If successful, the terminal shows the payment is approved.<\/p>\n<\/li>\n<li>\n<p>In the  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/terminal-api\/latest\/post\/payment#responses-200\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">PaymentResponse<\/a> note the following:<\/p>\n<ul>\n<li>\n<p><code>POIData.POITransactionID.TransactionID<\/code>: <a href=\"\/point-of-sale\/design-your-integration\/terminal-api#transaction-identifier\">Transaction identifier<\/a> for the payment.<\/p>\n<\/li>\n<li>\n<p><code>PaymentReceipt<\/code>: receipt data with the original transaction amount, the tip amount (not included if the customer didn't add a tip), and the total amount.<\/p>\n<\/li>\n<li>\n<p><code>PaymentResult.AmountsResp<\/code>:<\/p>\n<ul>\n<li><code>TipAmount<\/code>: the amount of the tip. If the customer didn't add a tip, this field is not included.<\/li>\n<li><code>AuthorizedAmount<\/code>: the total amount of the payment, consisting of the original transaction amount plus the tip amount.<\/li>\n<li>\n<p><code>Currency<\/code>: the currency of the payment.<\/p>\n <!-- list separator -->\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><code>Response.Result<\/code>: <span translate=\"no\"><strong>Success<\/strong><\/span><\/p>\n<\/li>\n<li>\n<p><code>Response.AdditionalResponse<\/code>: additional transaction data. Depending on the format you used in the request, you receive either a string of form-encoded key-value pairs or a Base64 string that you need to decode to get a JSON object. This includes:<\/p>\n<ul>\n<li><code>posadditionalamounts.originalAmountValue<\/code>: the original transaction amount in <a href=\"\/development-resources\/currency-codes\">minor units<\/a>.<\/li>\n<li><code>posAmountGratuityValue<\/code>: the tip amount in minor units.<\/li>\n<li><code>authorisedAmountValue<\/code>: the total authorized amount in minor units.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>The example below shows the response for a <strong>EUR142.50<\/strong> transaction with a 10% tip added.<\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Payment response with tip added'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n  \\\"SaleToPOIResponse\\\": {\\n    \\\"PaymentResponse\\\": {\\n      \\\"POIData\\\": {\\n        \\\"POITransactionID\\\": {\\n          \\\"TimeStamp\\\": \\\"2019-12-17T10:11:12.000Z\\\",\\n          \\\"TransactionID\\\": \\\"8ha5001575467786000.NC6HT9CRT65ZGN82\\\"\\n        },\\n      \\\"SaleData\\\": {...},\\n        \\\"PaymentReceipt\\\": [...],\\n        \\\"PaymentResult\\\": {\\n          \\\"AuthenticationMethod\\\": [...],\\n          \\\"OnlineFlag\\\": true,\\n          \\\"PaymentAcquirerData\\\": {...},\\n          \\\"PaymentInstrumentData\\\": {...},\\n          \\\"AmountsResp\\\": {\\n            \\\"TipAmount\\\": 14.25,\\n            \\\"AuthorizedAmount\\\": 156.75,\\n            \\\"Currency\\\": \\\"EUR\\\"\\n          }\\n        },\\n        \\\"Response\\\": {\\n          \\\"Result\\\": \\\"Success\\\",\\n          \\\"AdditionalResponse\\\": \\\"...posadditionalamounts.originalAmountValue=14250&amp;...posAmountGratuityValue=1425&amp;gratuityAmount=1425&amp;...authorisedAmountValue=15675...&amp;posAuthAmountValue=15675&amp;posadditionalamounts.gratuityAmount=1425\\\"\\n          }\\n        },\\n        \\\"MessageHeader\\\": {...}\\n    }\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<\/ol>\n<h2>Add tip amounts to reporting<\/h2>\n<p>The <a href=\"\/reporting\/settlement-reconciliation\/transaction-level\/settlement-details-report\/#generate-and-download-reports\">Settlement details report<\/a> is an overview of payments details that have been settled and paid out to you by Adyen, and the cost of each transaction. When you generate a Settlement details report, you can include an overview of tips by adding the <strong>gratuity amount<\/strong> column to your report in your <a href=\"https:\/\/ca-test.adyen.com\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Customer Area<\/a>.<\/p>\n<p>For more information on how to add the <strong>gratuity amount<\/strong> column to your report, see <a href=\"\/reporting\/settlement-reconciliation\/transaction-level\/settlement-details-report\/#configure-report-columns\">Configure report columns<\/a>.<\/p>\n<h2>See also<\/h2>\n<div class=\"see-also-links output-inline\" id=\"see-also\">\n<ul><li><a href=\"\/point-of-sale\/basic-tapi-integration\/make-a-payment\"\n                        target=\"_self\"\n                        >\n                    Make a payment\n                <\/a><\/li><li><a href=\"\/reporting\/settlement-reconciliation\/transaction-level\/settlement-details-report\/\"\n                        target=\"_self\"\n                        >\n                    Settlement details report\n                <\/a><\/li><\/ul><\/div>\n","url":"https:\/\/docs.adyen.com\/point-of-sale\/tipping\/tipping-from-cash-register","articleFields":{"description":"Implement tipping from the POS app in your payment flow.","feedback_component":true,"filters_component":false,"last_edit_on":"17-04-2023 10:40"},"algolia":{"url":"https:\/\/docs.adyen.com\/point-of-sale\/tipping\/tipping-from-cash-register","title":"Tipping from the POS app","content":"Here we describe how to implement tipping in your payment flow where the payment request that you send from your POS app includes a tip amount. The terminal shows the original transaction amount and the tip amount. The customer then uses the terminal to confirm the tip, change the amount, or decline giving a tip.\nRequirements\nBefore you begin, take into account the following requirements, limitations, and preparations.\n\n\n\nRequirement\nDescription\n\n\n\n\nIntegration type\nA Terminal API with payment terminals.\n\n\nHardware\nAll terminal models are supported, except unattended terminals.\n\n\nSetup steps\nImplement logic in your POS app to provide the tip amount for payment requests.\n\n\n\nSet up tipping in your POS app\nThe tip amount to propose to your customer on the terminal can be a percentage of the transaction amount, a fixed amount, one of various fixed amounts depending on the transaction amount, and so on.\nYou need to implement logic on your end to ensure your POS app provides the tip amount that you need to include in your payment request.\nMake a payment\nAfter you configured tipping in your POS system, you are ready to make a payment request that includes a TipAmount. This shows the transaction amount and the proposed tip amount on the terminal display.\n\n\nMake a payment request, specifying:\n\n\nThe standard \n  SaleToPOIRequest.MessageHeader\n object, with MessageClass set to Service and MessageCategory set to Payment.\n\n\n\nParameter\nRequired\nDescription\n\n\n\n\nProtocolVersion\n\n3.0\n\n\nMessageClass\n\nService\n\n\nMessageCategory\n\nPayment\n\n\nMessageType\n\nRequest\n\n\nServiceID\n\nYour 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.\n\n\nSaleID\n\nYour unique ID for the POS system component to send this request from.\n\n\nPOIID\n\nThe unique ID of the terminal to send this request to. Format: [device model]-[serial number].\n\n\n\n\n\n\n\nThe  PaymentRequest object with:\n\n\n\nParameter\nRequired\nDescription\n\n\n\n\nSaleData.SaleTransactionID\n\nAn object with: TransactionID: your reference to identify a payment. We recommend using a unique value. In your Customer Area and Adyen reports, this will show as the merchant reference for the transaction. TimeStamp: date and time of the request in UTC format.\n\n\nPaymentTransaction.AmountsReq\n\nAn object with: Currency: the transaction currency.RequestedAmount: the transaction amount. TipAmount: the tip amount.\n\n\n\n\n\nThe example below shows how to initiate a payment of EUR&nbsp;142.50 with a 10% tip.\n\n\n\nThe payment request is routed to the payment terminal. The customer accepts, changes, or declines the tip and completes the payment. The terminal then collects the payment details and sends the request for the original transaction amount plus the tip amount to the Adyen payments platform.\nIf successful, the terminal shows the payment is approved.\n\n\nIn the  PaymentResponse note the following:\n\n\nPOIData.POITransactionID.TransactionID: Transaction identifier for the payment.\n\n\nPaymentReceipt: receipt data with the original transaction amount, the tip amount (not included if the customer didn't add a tip), and the total amount.\n\n\nPaymentResult.AmountsResp:\n\nTipAmount: the amount of the tip. If the customer didn't add a tip, this field is not included.\nAuthorizedAmount: the total amount of the payment, consisting of the original transaction amount plus the tip amount.\n\nCurrency: the currency of the payment.\n \n\n\n\n\nResponse.Result: Success\n\n\nResponse.AdditionalResponse: additional transaction data. Depending on the format you used in the request, you receive either a string of form-encoded key-value pairs or a Base64 string that you need to decode to get a JSON object. This includes:\n\nposadditionalamounts.originalAmountValue: the original transaction amount in minor units.\nposAmountGratuityValue: the tip amount in minor units.\nauthorisedAmountValue: the total authorized amount in minor units.\n\n\n\nThe example below shows the response for a EUR142.50 transaction with a 10% tip added.\n\n\n\n\n\nAdd tip amounts to reporting\nThe Settlement details report is an overview of payments details that have been settled and paid out to you by Adyen, and the cost of each transaction. When you generate a Settlement details report, you can include an overview of tips by adding the gratuity amount column to your report in your Customer Area.\nFor more information on how to add the gratuity amount column to your report, see Configure report columns.\nSee also\n\n\n                    Make a payment\n                \n                    Settlement details report\n                \n","type":"page","locale":"en","boost":17,"hierarchy":{"lvl0":"Home","lvl1":"In-person payments","lvl2":"Tipping","lvl3":"Tipping from the POS app"},"hierarchy_url":{"lvl0":"https:\/\/docs.adyen.com\/","lvl1":"https:\/\/docs.adyen.com\/point-of-sale","lvl2":"https:\/\/docs.adyen.com\/point-of-sale\/tipping","lvl3":"\/point-of-sale\/tipping\/tipping-from-cash-register"},"levels":4,"category":"In-person payments","category_color":"green","tags":["Tipping"]}}
