{"title":"Wallet passes","category":"default","creationDate":1596005760,"content":"<p>Customers can link credit and debit cards to a wallet app on their phone or smartwatch to make in-person payments through Near Field Communication (NFC) with a payment terminal. Apart from cards, customers can also keep other digital passes in their wallet app, such as:<\/p>\n<ul>\n<li>Loyalty cards<\/li>\n<li>Vouchers<\/li>\n<li>Gift cards<\/li>\n<li>Boarding passes<\/li>\n<li>Tickets<\/li>\n<\/ul>\n<p>With these NFC-enabled passes, they can for example redeem a voucher or collect points on a loyalty card when they make a purchase.<\/p>\n<p>As a merchant, you can create your own wallet passes, and link the passes to your loyalty program. During a transaction, you then check if the customer has your pass in their NFC wallet, and use the pass for the transaction.<\/p>\n<h2>Requirements<\/h2>\n<p>Before you begin, take into account the following requirements and limitations.<\/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\/basic-tapi-integration\/\">Terminal API integration<\/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;\">The following payment terminal models are supported: <ul><li markdown=\"1\">Verifone Engage terminals using software version 1.64 or later.<\/li> <li markdown=\"1\">Castles Android terminals using software version 1.105 or later. The Verifone Android terminals (P630 and M450) are not supported yet.<\/li><\/ul><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong>Limitations<\/strong><\/td>\n<td style=\"text-align: left;\">Take into account the following limitations: <ul><li markdown=\"1\">Only Apple Wallet passes are supported.<\/li> <li markdown=\"1\"><a href=\"#enrollment\">On-the-spot shopper enrollment<\/a> is  available for all Verifone Engage terminals and for all Android terminals except the Verifone Android terminals (P630 and M450).<\/li><\/ul><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong>Setup steps<\/strong><\/td>\n<td style=\"text-align: left;\">Before you begin: <ul><li markdown=\"1\">To be allowed to present your own Apple wallet passes, you need to have an agreement with Apple.<\/li> <li markdown=\"1\">If you want to use the <a href=\"\/point-of-sale\/loyalty\/wallet-passes?tab=single-tap_redeem_flow_1_2\">single-tap redeem flow<\/a>, ask our <a href=\"https:\/\/ca-test.adyen.com\/ca\/ca\/contactUs\/support.shtml?form=other\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Support Team<\/a> to enable single tap.<\/li><\/ul><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Transaction flow options<\/h2>\n<p>There are various ways to implement NFC wallet passes with a payment, depending on what makes sense for your pass and loyalty program:<\/p>\n<ul>\n<li><strong>Payment flow<\/strong>: You check for the passes after the payment, and update the shopper's account later.<\/li>\n<li>\n<p><strong>Redeem flow<\/strong>: You check for the passes before the payment through a card acquisition request. If there are discounts or other advantages related to the pass, you can apply these to the payment beforehand. If the shopper does not have your pass yet, you can create one on the spot and add this information to your payment request. The shopper then receives a message that lets them add the pass to their wallet.<\/p>\n<p>There are two variations of the redeem flow: <strong>single-tap redeem flow<\/strong> and <strong>double-tap redeem flow<\/strong>. The implementation is very similar. The main difference is that in the double-tap flow the terminal asks the shopper a second time to present their card. This allows the shopper to redeem the NFC pass the first time that the terminal asks for their card, and then switch to another payment method the second time that the terminal asks for their card.<\/p>\n<\/li>\n<\/ul>\n<p>Select the tabs below to learn more. Before you <a href=\"#configure-in-ca\">configure your NFC pass in the Customer Area<\/a>, you need to understand how these flows work and which flow you want to implement.<\/p>\n\n<div id=\"tab0l9w5\">\n    <div data-component-wrapper=\"tabs\">\n        <tabs\n                        :items=\"[{&quot;title&quot;:&quot;Payment flow&quot;,&quot;content&quot;:&quot;\\n&lt;p&gt;You make a payment request. If the shopper pays with an NFC wallet, you are informed in the payment response whether the shopper has your pass in their mobile wallet. If they do, the payment response includes the unique ID of the shopper&#039;s pass so that you can update the shopper&#039;s account.&lt;\\\/p&gt;\\n&quot;,&quot;altTitle&quot;:null,&quot;oldTabId&quot;:&quot;payment_flow_0_1&quot;,&quot;relation&quot;:&quot;&quot;},{&quot;title&quot;:&quot;Single-tap redeem flow&quot;,&quot;content&quot;:&quot;\\n&lt;p&gt;You first make a card acquisition request with an amount. The terminal asks the shopper to present their card. When the shopper taps their device with the NFC wallet to the payment terminal, the terminal polls the mobile wallet on the device for:&lt;\\\/p&gt;\\n&lt;ul&gt;\\n&lt;li&gt;Your passes.&lt;\\\/li&gt;\\n&lt;li&gt;The details of the payment method (the credit or debit card that is linked to the wallet).&lt;\\\/li&gt;\\n&lt;\\\/ul&gt;\\n&lt;p&gt;If the shopper has your pass, the card acquisition response returns the &lt;code&gt;LoyaltyAccount&lt;\\\/code&gt; details. This includes the unique ID of the shopper&#039;s pass so that you can look up the shopper&#039;s account. You can then for example:&lt;\\\/p&gt;\\n&lt;ul&gt;\\n&lt;li&gt;Make an &lt;a href=\\&quot;\\\/point-of-sale\\\/shopper-engagement\\\/shopper-input\\&quot;&gt;input request&lt;\\\/a&gt; to ask the shopper whether they want to redeem loyalty points.&lt;\\\/li&gt;\\n&lt;li&gt;Add or recalculate loyalty points.&lt;\\\/li&gt;\\n&lt;li&gt;Apply a discount.&lt;\\\/li&gt;\\n&lt;\\\/ul&gt;\\n&lt;p&gt;If the shopper does not have your pass, you can check if they already have a loyalty account and issue a pass.&lt;\\\/p&gt;\\n&lt;p&gt;Then you make a payment request for the final amount. This must be equal to or lower than the card acquisition amount. To ensure the shopper does not need to tap again if the payment amount differs from the card acquisition amount, you need to ask our &lt;a href=\\&quot;https:\\\/\\\/ca-test.adyen.com\\\/ca\\\/ca\\\/contactUs\\\/support.shtml?form=other\\&quot; target=\\&quot;_blank\\&quot; rel=\\&quot;nofollow noopener noreferrer\\&quot; class=\\&quot;external-link no-image\\&quot;&gt;Support Team&lt;\\\/a&gt; to enable single tap.&lt;\\\/p&gt;\\n&lt;p&gt;In this flow, the shopper taps their mobile device to the terminal only once, because the card acquisition polls for the pass details and the payment method details at the same time. If the shopper already had your pass, the payment response does not include the &lt;code&gt;LoyaltyAccount&lt;\\\/code&gt; details again.&lt;\\\/p&gt;\\n&quot;,&quot;altTitle&quot;:null,&quot;oldTabId&quot;:&quot;single-tap_redeem_flow_1_2&quot;,&quot;relation&quot;:&quot;&quot;},{&quot;title&quot;:&quot;Double-tap redeem flow&quot;,&quot;content&quot;:&quot;\\n&lt;p&gt;You first make a card acquisition request with or without an amount. The terminal asks the shopper to present their card. When the shopper taps their device with the NFC wallet to the payment terminal, the terminal polls the mobile wallet on the device for your passes.&lt;\\\/p&gt;\\n&lt;p&gt;Contrary to the single-tap redeem flow, the terminal does not poll the wallet for the payment method details.&lt;\\\/p&gt;\\n&lt;p&gt;If the shopper has your pass, the card acquisition response includes the unique ID and other details of the shopper&#039;s pass so that you can look up the shopper&#039;s account. You can then for example:&lt;\\\/p&gt;\\n&lt;ul&gt;\\n&lt;li&gt;Make an &lt;a href=\\&quot;\\\/point-of-sale\\\/shopper-engagement\\\/shopper-input\\&quot;&gt;input request&lt;\\\/a&gt; to ask the shopper whether they want to redeem loyalty points.&lt;\\\/li&gt;\\n&lt;li&gt;Add or recalculate loyalty points.&lt;\\\/li&gt;\\n&lt;li&gt;Apply a discount.&lt;\\\/li&gt;\\n&lt;\\\/ul&gt;\\n&lt;p&gt;If the shopper does not have your pass, you can check if they already have a loyalty account and issue a pass.&lt;\\\/p&gt;\\n&lt;p&gt;Then you make a payment request for the final amount. The terminal asks the shopper again to present their card. The shopper can then choose to pay with their mobile wallet and tap their mobile device to the terminal a second time, or use a different payment method.&lt;\\\/p&gt;\\n&quot;,&quot;altTitle&quot;:null,&quot;oldTabId&quot;:&quot;double-tap_redeem_flow_2_3&quot;,&quot;relation&quot;:&quot;&quot;}]\"\n            :should-update-when-url-changes='false'>\n        <\/tabs>\n    <\/div>\n<\/div>\n\n<h2 id=\"enrollment\">Shopper enrollment<\/h2>\n<p>To enroll shoppers in your loyalty program and let them add your NFC wallet pass to their mobile wallet, you can inform them through email, social media, your web site, and so on.<\/p>\n<p>In the redeem flow, it is possible to enroll the shopper and\/or issue a pass on the spot, and add this information to your payment request. The shopper then receives a notification on their device that lets them add the pass to their wallet. This is possible with Verifone Engage terminals. See <a href=\"#redeem-pass-not-added\">Case 2: The shopper does not have your pass<\/a>.<\/p>\n<p>To send the notification to the shopper's device, we need to know the URL where people can add a pass to their wallet, and the pass number. You can provide this information in two ways:<\/p>\n<ul>\n<li><a href=\"#configure-in-ca\">Configure<\/a> the URL in your Customer Area. Then, in the <code>LoyaltyData.LoyaltyID<\/code> field of your payment request, specify only the pass number.<\/li>\n<li>Do not configure the URL in your Customer Area. In your payment request, in the <code>LoyaltyData.LoyaltyID<\/code> field, specify the URL appended with the pass number.<\/li>\n<\/ul>\n<h2>How it works<\/h2>\n<p>To implement transactions with digital NFC-enabled passes:<\/p>\n<ol>\n<li>Set up a pass server and <a href=\"#create-nfc-enabled-passes\">create your NFC wallet pass<\/a>.<\/li>\n<li><a href=\"#configure-in-ca\">Configure<\/a> your NFC wallet pass in your Customer Area.<\/li>\n<li>Implement either the <a href=\"#payment-flow\">payment flow<\/a> or the <a href=\"#redeem-flow\">redeem flow<\/a> to use NFC wallet passes in the transaction flow.<\/li>\n<\/ol>\n<h2 id=\"create-nfc-enabled-passes\">Create NFC wallet passes<\/h2>\n<ol>\n<li>\n<p>Set up a server for your NFC wallet passes. Note that there are third parties that offer this as a service.<br \/>\nOn this pass server, you need to make a URL available where shoppers can enroll with the loyalty program tied to your NFC wallet pass and add the pass to their mobile wallet.<\/p>\n<div class=\"notices red\">\n<p>The full URL including <code>https:\/\/<\/code> or <code>http:\/\/<\/code> cannot be more than 60 characters.<\/p>\n<\/div>\n<p>For easier <a href=\"#enrollment\">shopper enrollment<\/a>, specify this URL when you configure the pass in your Customer Area.<\/p>\n<\/li>\n<li>\n<p>Create one or more NFC wallet passes. See for example the <a href=\"https:\/\/developer.apple.com\/library\/archive\/documentation\/UserExperience\/Conceptual\/PassKit_PG\/index.html#\/\/apple_ref\/doc\/uid\/TP40012195\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Wallet Developer Guide<\/a>, which explains how to create an Apple Wallet pass for your loyalty program.<\/p>\n<div class=\"sc-notice info\"><div>\n<p>While creating your pass, a pass type ID and private key are generated. You will need these later, when you configure the pass in your Customer Area.<\/p>\n<\/div><\/div>\n<\/li>\n<li>\n<p>Tie in your loyalty program with your NFC wallet passes and your POS system. To learn more about how to link a customer in your loyalty program to a transaction, see <a href=\"\/point-of-sale\/shopper-recognition\">Shopper recognition and tokenization<\/a>.<\/p>\n<\/li>\n<\/ol>\n<h2 id=\"configure-in-ca\">Configure passes in your Customer Area<\/h2>\n<p>To inform us about your NFC-enabled pass and the flow you want to use:<\/p>\n<ol>\n<li>\n<p>Log in to your <a href=\"https:\/\/ca-test.adyen.com\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Customer Area<\/a> and select the account level where you want to use your NFC wallet pass.<\/p>\n<\/li>\n<li>\n<p>Go to <strong>In-person payments<\/strong> &gt; <strong>Terminal settings<\/strong> &gt; <strong>Payment features<\/strong>.<\/p>\n<\/li>\n<li>\n<p>Scroll to <strong>NFC wallet passes<\/strong>.<\/p>\n<\/li>\n<li>\n<p>At <strong>Choose a set up<\/strong>, select an option for the flow you want to use.<\/p>\n<ul>\n<li><a href=\"\/point-of-sale\/loyalty\/wallet-passes\/?tab=single-tap_redeem_flow_1_2\">Single-tap redeem flow<\/a>: collect both the NFC pass details and the NFC payment method details when you make a card acquisition request.<\/li>\n<li><a href=\"\/point-of-sale\/loyalty\/wallet-passes\/?tab=payment_flow_0_1\">Payment flow<\/a>: collect both the NFC pass details and the NFC payment method details when you make a payment request.<\/li>\n<li>\n<p><a href=\"\/point-of-sale\/loyalty\/wallet-passes\/?tab=double-tap_redeem_flow_2_3\">Double-tap redeem flow<\/a>: collect only the NFC pass details when you make a card acquisition request.<\/p>\n<!-- list separator -->\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>Enter the <strong>Name<\/strong> of your pass.<\/p>\n<\/li>\n<li>\n<p>Enter the <strong>Pass type ID<\/strong> that was generated when you created your NFC pass.<br \/>\nWe use this to poll only for your pass and not for passes from other organizations that the shopper may have in their mobile wallet. For an Apple Wallet pass, this has the format <em>pass.com.your-company.your-pass-name<\/em>.<\/p>\n<\/li>\n<li>\n<p>At <strong>Protocol<\/strong> select the company responsible for the protocol that your NFC pass is based on. For example, Apple.<\/p>\n<\/li>\n<li>\n<p>Optional. Enter the <strong>URL<\/strong> where people can add the pass to their mobile wallet.<br \/>\nWe use this for <a href=\"#enrollment\">shopper enrollment<\/a>, to send an NFC signal so that the shopper receives a message that lets them add the pass to their wallet.<\/p>\n<\/li>\n<li>\n<p>In the <strong>Private key<\/strong> box, select the slot where you will provide your private key. For example, <em>Private key 1<\/em>.<\/p>\n<\/li>\n<li>\n<p>Under <strong>Private key slots<\/strong>, select <strong>Decrypted<\/strong>, go to the slot that you selected in the previous step, and enter the private key for your NFC pass.<\/p>\n<div class=\"sc-notice info\"><div>\n<p>Include the begin and end lines <code>-----BEGIN EC PRIVATE KEY-----\\n<\/code> and <code>\\n-----END EC PRIVATE KEY-----<\/code>.<\/p>\n<\/div><\/div>\n<p>This key was generated when you created the pass. We will protect and encrypt it in our back end. The terminal uses this key to decrypt the NFC message and return the unique ID of the shopper's pass in the response.<\/p>\n<\/li>\n<li>\n<p>To add more NFC wallet passes, select <strong>Add another pass<\/strong> and repeat the steps to complete the settings.<\/p>\n<\/li>\n<li>\n<p>Select <strong>Save<\/strong>.<\/p>\n<\/li>\n<\/ol>\n<p>After you have finished the configuration, you are ready to accept your NFC wallet pass with a payment, using either the <a href=\"#payment-flow\">payment flow<\/a> or the <a href=\"#redeem-flow\">redeem flow<\/a>.<\/p>\n<h2 id=\"payment-flow\">Use the payment flow<\/h2>\n<p>To make a payment request and afterwards update the shopper's NFC pass account:<\/p>\n<ol>\n<li>\n<p><a href=\"\/point-of-sale\/basic-tapi-integration\/make-a-payment\">Make a payment request<\/a>. For example:<\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Payment request in the payment flow'\" :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            \\\"ServiceID\\\": \\\"s9wrxa\\\",\\n            \\\"SaleID\\\": \\\"POSSystemID12345\\\",\\n            \\\"POIID\\\": \\\"V400m-324689265\\\"\\n        },\\n        \\\"PaymentRequest\\\": {\\n            \\\"SaleData\\\": {\\n                \\\"SaleTransactionID\\\": {\\n                    \\\"TransactionID\\\": \\\"a1b2c3\\\",\\n                    \\\"TimeStamp\\\": \\\"2020-06-16T16:13:16\\\"\\n                }\\n            },\\n            \\\"PaymentTransaction\\\": {\\n                \\\"AmountsReq\\\": {\\n                    \\\"Currency\\\": \\\"EUR\\\",\\n                    \\\"RequestedAmount\\\": 10.99\\n                }\\n            }\\n        }\\n    }\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<li>\n<p>Check the payment response for the  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/terminal-api\/latest\/post\/payment#responses-200-LoyaltyResult\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">LoyaltyResult<\/a>.<br \/>\nThis is an array with your NFC enabled passes that are in the shopper's digital wallet. For each pass, there is a <code>LoyaltyAccount<\/code> object with:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Property<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>LoyaltyAccountID.EntryMode<\/code><\/td>\n<td style=\"text-align: left;\">Indicates how the NFC pass details were obtained.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>LoyaltyAccountID.IdentificationType<\/code><\/td>\n<td style=\"text-align: left;\"><span translate=\"no\"><strong>AccountNumber<\/strong><\/span>. The type of ID of the shopper's pass.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>LoyaltyAccountID.LoyaltyID<\/code><\/td>\n<td style=\"text-align: left;\">The unique ID of the shopper's pass.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>LoyaltyBrand<\/code><\/td>\n<td style=\"text-align: left;\">The vendor protocol that the NFC pass is based on.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>If the response does not include a <code>LoyaltyResult<\/code>, the shopper has not added your NFC wallet pass to their mobile wallet yet.<\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Payment response including LoyaltyResult'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n    \\\"SaleToPOIResponse\\\": {\\n        \\\"PaymentResponse\\\": {\\n            \\\"LoyaltyResult\\\": [\\n                {\\n                    \\\"LoyaltyAccount\\\": {\\n                        \\\"LoyaltyAccountID\\\": {\\n                            \\\"EntryMode\\\": [\\n                                \\\"Contactless\\\"\\n                            ],\\n                            \\\"IdentificationType\\\": \\\"AccountNumber\\\",\\n                            \\\"LoyaltyID\\\": \\\"rEqQFLnckxJ3jCvmQoLmBh\\\"\\n                        },\\n                        \\\"LoyaltyBrand\\\": \\\"pass.com.your-company.your-pass-name\\\"\\n                    }\\n                }\\n            ],\\n            \\\"POIData\\\": {\\n                \\\"POIReconciliationID\\\": \\\"1000\\\",\\n                \\\"POITransactionID\\\": {\\n                    \\\"TimeStamp\\\": \\\"2020-06-15T16:13:16.000Z\\\",\\n                    \\\"TransactionID\\\": \\\"fanx001580400796015.NC6HT9CRT65ZGN82\\\"\\n                },\\n                \\\"POIReconciliationID\\\": \\\"1000\\\"\\n            },\\n            \\\"SaleData\\\": {\\n                \\\"SaleTransactionID\\\": {\\n                    \\\"TimeStamp\\\": \\\"2020-06-15T16:13:16.000Z\\\",\\n                    \\\"TransactionID\\\": \\\"a1b2c3\\\"\\n                }\\n            },\\n            \\\"PaymentReceipt\\\": [...],\\n            \\\"PaymentResult\\\": {\\n                \\\"AuthenticationMethod\\\": [\\n                    \\\"SecuredChannel\\\"\\n                ],\\n                \\\"OnlineFlag\\\": true,\\n                \\\"PaymentAcquirerData\\\": {...},\\n                    \\\"MerchantID\\\": \\\"ADYEN_MERCHANT_ACCOUNT\\\"\\n                },\\n                \\\"PaymentInstrumentData\\\": {\\n                    \\\"CardData\\\": {\\n                        \\\"EntryMode\\\": [\\n                            \\\"Contactless\\\"\\n                        ],\\n                        \\\"PaymentToken\\\": {\\n                            \\\"TokenRequestedType\\\": \\\"Customer\\\",\\n                            \\\"TokenValue\\\": \\\"G526627978654924\\\"\\n                        },\\n                        \\\"PaymentBrand\\\": \\\"visa\\\",\\n                        \\\"MaskedPan\\\": \\\"481749 **** 1108\\\",\\n                        \\\"CardCountryCode\\\": \\\"076\\\",\\n                        \\\"SensitiveCardData\\\": {\\n                            \\\"CardSeqNumb\\\": \\\"00\\\",\\n                            \\\"ExpiryDate\\\": \\\"1223\\\"\\n                        }\\n                    },\\n                    \\\"PaymentInstrumentType\\\": \\\"Card\\\"\\n                },\\n                \\\"AmountsResp\\\": {\\n                    \\\"AuthorizedAmount\\\": 10.99,\\n                    \\\"Currency\\\": \\\"EUR\\\"\\n                }\\n            },\\n            \\\"Response\\\": {\\n                \\\"Result\\\": \\\"Success\\\",\\n                \\\"AdditionalResponse\\\": \\\"...\\\"\\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<li>\n<p>Using the <code>LoyaltyID<\/code> and card alias returned in the response, look up the shopper in your pass server and loyalty program, and update the shopper's data. For example, the loyalty points accrued.<\/p>\n<\/li>\n<\/ol>\n<h2 id=\"redeem-flow\">Use the redeem flow<\/h2>\n<p>In this flow you <a href=\"#redeem-card-acquisition\">check<\/a> whether the shopper has your NFC wallet pass in their wallet app before you start a payment. If the <a href=\"#redeem-pass-added\">shopper already has your pass<\/a>, you can apply a discount or other advantages related to the pass. If the <a href=\"#redeem-pass-not-added\">shopper does not have your pass<\/a>, you can issue a pass and add this data to your payment request. The shopper will receive a message that lets them add the pass to their wallet.<\/p>\n<h3 id=\"redeem-card-acquisition\">Get the shopper's pass details<\/h3>\n<ol>\n<li>\n<p><a href=\"\/point-of-sale\/card-acquisition\">Make a card acquisition request<\/a>, including:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>CardAcquisitionTransaction<\/code><\/td>\n<td style=\"text-align: left;\">In the single-tap redeem flow, this object must contain: <ul><li markdown=\"1\"><code>TotalAmount<\/code>: The transaction amount.<\/li><\/ul> <p>In the double-tap redeem flow, you can omit <code>TotalAmount<\/code> when you do not know the amount yet. Or you can also change the transaction amount later, in the payment request.<\/p><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Card acquisition in the redeem flow'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n    \\\"SaleToPOIRequest\\\":{\\n        \\\"MessageHeader\\\":{\\n            \\\"ProtocolVersion\\\":\\\"3.0\\\",\\n            \\\"MessageClass\\\":\\\"Service\\\",\\n            \\\"MessageCategory\\\":\\\"CardAcquisition\\\",\\n            \\\"MessageType\\\":\\\"Request\\\",\\n            \\\"ServiceID\\\":\\\"0305Acq\\\",\\n            \\\"SaleID\\\":\\\"POSSystemID12345\\\",\\n            \\\"POIID\\\":\\\"V400m-346403161\\\"\\n        },\\n        \\\"CardAcquisitionRequest\\\":{\\n            \\\"SaleData\\\":{\\n                \\\"SaleTransactionID\\\":{\\n                    \\\"TransactionID\\\":\\\"422024\\\",\\n                    \\\"TimeStamp\\\":\\\"2020-06-19T12:18:04\\\"\\n                },\\n                \\\"TokenRequestedType\\\": \\\"Customer\\\"\\n            },\\n            \\\"CardAcquisitionTransaction\\\":{\\n                \\\"TotalAmount\\\": 14.98\\n            }\\n        }\\n    }\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<li>\n<p>When you receive the card acquisition response, keep the <code>TimeStamp<\/code> and <code>TransactionID<\/code> from the <code>POIData.POITransactionID<\/code>. You need these details later in your payment request.<\/p>\n<\/li>\n<li>\n<p>Check the card acquisition response for the  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/terminal-api\/latest\/post\/cardacquisition#responses-200-LoyaltyAccount\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">LoyaltyAccount<\/a>.<br \/>\nThis is an array with your NFC enabled passes that are in the shopper's digital wallet. For each pass, the following details are provided:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Property<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>LoyaltyAccountID.EntryMode<\/code><\/td>\n<td style=\"text-align: left;\">Indicates how the NFC pass details were obtained.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>LoyaltyAccountID.IdentificationType<\/code><\/td>\n<td style=\"text-align: left;\"><span translate=\"no\"><strong>AccountNumber<\/strong><\/span>. The type of ID of the shopper's pass.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>LoyaltyAccountID.LoyaltyID<\/code><\/td>\n<td style=\"text-align: left;\">The unique ID of the shopper's pass.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>LoyaltyBrand<\/code><\/td>\n<td style=\"text-align: left;\">The vendor protocol that the NFC pass is based on.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>If the response does not include a <code>LoyaltyAccount<\/code>, the shopper has not added your NFC wallet pass to their mobile wallet yet.<\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Card acquisition response including LoyaltyAccount'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n    \\\"SaleToPOIResponse\\\": {\\n        \\\"CardAcquisitionResponse\\\": {\\n            \\\"LoyaltyAccount\\\": [\\n                {\\n                    \\\"LoyaltyAccountID\\\": {\\n                        \\\"EntryMode\\\": [\\n                            \\\"Contactless\\\"\\n                        ],\\n                        \\\"IdentificationType\\\": \\\"AccountNumber\\\",\\n                        \\\"LoyaltyID\\\": \\\"rEqQFLnckxJ3jCvmQoLmBh\\\"\\n                    },\\n                    \\\"LoyaltyBrand\\\": \\\"pass.com.your-company.your-pass-name\\\"\\n                }\\n            ],\\n            \\\"POIData\\\": {\\n                \\\"POIReconciliationID\\\": \\\"1000\\\",\\n                \\\"POITransactionID\\\": {\\n                    \\\"TimeStamp\\\": \\\"2020-06-19T10:18:48.000Z\\\",\\n                    \\\"TransactionID\\\": \\\"8ha5001592561928000\\\"\\n                }\\n            },\\n            \\\"SaleData\\\": {\\n                \\\"SaleTransactionID\\\": {\\n                    \\\"TimeStamp\\\": \\\"2020-06-19T12:18:04.000Z\\\",\\n                    \\\"TransactionID\\\": \\\"422024\\\"\\n                }\\n            },\\n            \\\"PaymentInstrumentData\\\": {\\n                \\\"CardData\\\": {\\n                    \\\"PaymentBrand\\\": \\\"mc\\\",\\n                    \\\"MaskedPan\\\": \\\"541333 **** 9999\\\",\\n                    \\\"CardCountryCode\\\": \\\"528\\\",\\n                    \\\"SensitiveCardData\\\": {\\n                        \\\"ExpiryDate\\\": \\\"0228\\\"\\n                    }\\n                },\\n                \\\"PaymentInstrumentType\\\": \\\"Card\\\"\\n            },\\n            \\\"Response\\\": {\\n                \\\"Result\\\": \\\"Success\\\",\\n                \\\"AdditionalResponse\\\": \\\"...\\\"\\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<li>\n<p>Go to the next step, depending on the case:<\/p>\n<ul>\n<li><a href=\"#redeem-pass-added\">Case 1<\/a>: The shopper already added your pass to their wallet.<\/li>\n<li><a href=\"#redeem-pass-not-added\">Case 2<\/a>: The shopper does not have your pass in their wallet yet.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h3 id=\"redeem-pass-added\">Case 1: The shopper has your pass<\/h3>\n<ol>\n<li>\n<p>Using the <code>LoyaltyID<\/code> returned in the card acquisition response, look up the shopper in your pass server and loyalty program, and apply your business logic.<br \/>\nFor example:<\/p>\n<ul>\n<li>Make a <a href=\"\/point-of-sale\/shopper-engagement\/shopper-input\/confirmation\">confirmation input request<\/a> to ask the shopper whether they want to redeem loyalty points.<\/li>\n<li>Add or recalculate loyalty points.<\/li>\n<li>Apply a discount.<\/li>\n<li>\n<p>Recalculate the transaction amount.<\/p>\n<!-- list separator -->\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"\/point-of-sale\/basic-tapi-integration\/make-a-payment\">Make a payment request<\/a> with:<br \/>\n<a id=\"case-1-payment-request\"><\/a><\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>PaymentTransaction.AmountsReq<\/code><\/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 final transaction amount.<\/li><\/ul><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>PaymentData.CardAcquisitionReference<\/code><\/td>\n<td style=\"text-align: left;\">An object referencing the card acquisition: <ul><li markdown=\"1\"><code>TimeStamp<\/code>: The timestamp returned in the <code>POIData.POITransactionID<\/code> of the card acquisition response.<\/li> <li markdown=\"1\"><code>TransactionID<\/code>: The transaction ID returned in the <code>POIData.POITransactionID<\/code> of the card acquisition response.<\/li><\/ul><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Payment request in the redeem flow'\" :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            \\\"ServiceID\\\":\\\"0305p\\\",\\n            \\\"SaleID\\\":\\\"POSSystemID12345\\\",\\n            \\\"POIID\\\":\\\"V400m-346403161\\\"\\n        },\\n        \\\"PaymentRequest\\\":{\\n            \\\"SaleData\\\":{\\n                \\\"SaleTransactionID\\\":{\\n                    \\\"TimeStamp\\\": \\\"2020-06-19T12:23:04.000Z\\\",\\n                    \\\"TransactionID\\\": \\\"042208\\\"\\n                },\\n                \\\"TokenRequestedType\\\": \\\"Customer\\\"\\n            },\\n            \\\"PaymentTransaction\\\":{\\n                \\\"AmountsReq\\\":{\\n                    \\\"Currency\\\":\\\"EUR\\\",\\n                    \\\"RequestedAmount\\\":14.48\\n                }\\n            },\\n            \\\"PaymentData\\\":{\\n                \\\"CardAcquisitionReference\\\":{\\n                    \\\"TimeStamp\\\": \\\"2020-06-19T10:21:27.000Z\\\",\\n                    \\\"TransactionID\\\": \\\"8ha5001592562087001\\\"\\n                }\\n            }\\n        }\\n    }\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<li>\n<p>When you receive the payment response, note that:<\/p>\n<ul>\n<li>In the single-tap redeem flow, the payment response does not include the <code>LoyaltyResult<\/code> again.<\/li>\n<li>In the double-tap redeem flow, the payment response includes the <code>LoyaltyResult<\/code> with the same loyalty details as in the card acquisition response.<\/li>\n<\/ul>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Payment response - Double-tap redeem flow'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n    \\\"SaleToPOIResponse\\\": {\\n        \\\"PaymentResponse\\\": {\\n            \\\"LoyaltyResult\\\": [\\n                {\\n                    \\\"LoyaltyAccount\\\": {\\n                        \\\"LoyaltyAccountID\\\": {\\n                            \\\"IdentificationType\\\": \\\"AccountNumber\\\",\\n                            \\\"EntryMode\\\": [\\n                                \\\"Contactless\\\"\\n                            ],\\n                            \\\"LoyaltyID\\\": \\\"rEqQFLnckxJ3jCvmQoLmBh\\\"\\n                        },\\n                        \\\"LoyaltyBrand\\\": \\\"pass.com.your-company.your-pass-name\\\"\\n                    }\\n                }\\n            ],\\n            \\\"POIData\\\": {\\n                \\\"POITransactionID\\\": {\\n                    \\\"TimeStamp\\\": \\\"2020-06-19T10:24:03.000Z\\\",\\n                    \\\"TransactionID\\\": \\\"8ha5001592562087001.KHQC5N7G84BLNK43\\\"\\n                },\\n                \\\"POIReconciliationID\\\": \\\"1000\\\"\\n            },\\n            \\\"SaleData\\\": {\\n                \\\"SaleTransactionID\\\": {\\n                    \\\"TimeStamp\\\": \\\"2020-06-19T12:23:04.000Z\\\",\\n                    \\\"TransactionID\\\": \\\"042208\\\"\\n                }\\n            },\\n            \\\"PaymentReceipt\\\": [...],\\n            \\\"PaymentResult\\\": {\\n                \\\"OnlineFlag\\\": true,\\n                \\\"PaymentAcquirerData\\\": {...},\\n                    \\\"MerchantID\\\": \\\"ADYEN_MERCHANT_ACCOUNT\\\"\\n                },\\n                \\\"PaymentInstrumentData\\\": {\\n                    \\\"CardData\\\": {\\n                        \\\"EntryMode\\\": [\\n                            \\\"Contactless\\\"\\n                        ],\\n                        \\\"PaymentBrand\\\": \\\"mc\\\",\\n                        \\\"MaskedPan\\\": \\\"541333 **** 9999\\\",\\n                        \\\"CardCountryCode\\\": \\\"056\\\",\\n                        \\\"SensitiveCardData\\\": {\\n                            \\\"CardSeqNumb\\\": \\\"83\\\",\\n                            \\\"ExpiryDate\\\": \\\"0228\\\"\\n                        }\\n                    },\\n                    \\\"PaymentInstrumentType\\\": \\\"Card\\\"\\n                },\\n                \\\"AmountsResp\\\": {\\n                    \\\"AuthorizedAmount\\\": 14.48,\\n                    \\\"Currency\\\": \\\"EUR\\\"\\n                },\\n            },\\n            \\\"Response\\\": {\\n                \\\"Result\\\": \\\"Success\\\",\\n                \\\"AdditionalResponse\\\": \\\"...&amp;alias=M469509594859802&amp;...recurring.shopperReference=YOUR_UNIQUE_SHOPPER_ID&amp;...shopperReference=YOUR_UNIQUE_SHOPPER_ID&amp;shopperEmail=S.Hopper%40example.com&amp;...\\\"\\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<h3 id=\"redeem-pass-not-added\">Case 2: The shopper does not have your pass<\/h3>\n<p>If the card acquisition response indicates the shopper does not have your NFC wallet pass in their mobile wallet, you check whether they are enrolled in your loyalty program. If they are (or if you enroll them on the spot) you can issue a pass and add the pass details to your payment request. This will send a message to the shopper's device so that they can easily add your pass to their wallet.<\/p>\n<ol>\n<li>\n<p>Check whether the shopper is enrolled in your loyalty program. Depending on how you have set up your loyalty program, you can:<\/p>\n<ul>\n<li>Check the <code>AdditionalResponse<\/code> in the card acquisition response for a <code>shopperReference<\/code>. If this is present, you already have the shopper on record. (See the <a href=\"\/point-of-sale\/loyalty\">shopper loyalty use case<\/a>.)<\/li>\n<li>\n<p>Or ask the shopper whether they are enrolled. If yes, ask them for their membership number or similar. You can use <a href=\"\/point-of-sale\/shopper-engagement\/shopper-input\">input requests<\/a> to gather this information, or let your staff enter the information in your POS app.<\/p>\n<!-- list separator -->\n<\/li>\n<\/ul>\n<p>If the shopper is already enrolled, skip to <a href=\"#issue-pass\">issuing a pass (step 4)<\/a>.<\/p>\n<\/li>\n<li>\n<p>If the shopper is not enrolled in your loyalty program yet, ask the shopper whether they want to enroll.<\/p>\n<ul>\n<li>If the shopper does not want to enroll, make a payment request with a reference to the card acquisition. This is the same <a href=\"#case-1-payment-request\">payment request from Case 1<\/a>, only the response won't include a <code>LoyaltyResult<\/code>. The flow ends.<\/li>\n<li>\n<p>If the shopper wants to enroll, continue with the next step.<\/p>\n<!-- list separator -->\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>To enroll the shopper in your loyalty program on the spot:<\/p>\n<ul>\n<li>Collect shopper details like their email address. You can use <a href=\"\/point-of-sale\/shopper-engagement\/shopper-input\">input requests<\/a> to gather this information, or let your staff enter the information in your POS app.<\/li>\n<li>\n<p>Create a customer profile for the shopper in your loyalty program and pass server with the information you collected.<\/p>\n<!-- list separator -->\n<\/li>\n<\/ul>\n<p>You now have a customer profile for the shopper, either because it already existed or because you just created it.<\/p>\n<\/li>\n<li>\n<p><a id=\"issue-pass\"><\/a>Using the <code>shopperReference<\/code> from the card acquisition response or some other reference, find the shopper's customer profile in your pass server. Then generate a unique pass identifier for the shopper.<\/p>\n<\/li>\n<li>\n<p><a href=\"\/point-of-sale\/basic-tapi-integration\/make-a-payment\">Make a payment request<\/a> with:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>PaymentTransaction.AmountsReq<\/code><\/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 final transaction amount.<\/li><\/ul><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>PaymentData.CardAcquisitionReference<\/code><\/td>\n<td style=\"text-align: left;\">An object referencing the card acquisition: <ul><li markdown=\"1\"><code>TimeStamp<\/code>: The timestamp returned in the <code>POIData.POITransactionID<\/code> of the card acquisition response.<\/li> <li markdown=\"1\"><code>TransactionID<\/code>: The transaction ID returned in the <code>POIData.POITransactionID<\/code> of the card acquisition response.<\/li><\/ul><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>LoyaltyData<\/code><\/td>\n<td style=\"text-align: left;\">An array with a <code>LoyaltyAccountID<\/code> object for each of your NFC wallet passes. This lets the shopper add your NFC wallet pass to their digital wallet. Each <code>LoyaltyAccountID<\/code> object contains:<ul><li markdown=\"1\"><code>EntryMode<\/code>: <span translate=\"no\"><strong>Mobile<\/strong><\/span><\/li><li markdown=\"1\"><code>IdentificationType<\/code>: <span translate=\"no\"><strong>AccountNumber<\/strong><\/span>.<\/li><li markdown=\"1\"><code>LoyaltyID<\/code>: the unique identifier of the shopper's new pass. If in your Customer Area you <a href=\"#enrollment\">configured<\/a> the URL where people can get your pass, only specify the pass ID. For example: <span translate=\"no\"><strong>oGvXzNSwEeQgZYVfZPU4pu<\/strong><\/span> If you didn't configure the URL of your pass, specify the URL appended with the pass ID. For example: <span translate=\"no\"><strong><code>https:\/\/uc.seamless-checkout.net\/getWallet\/oGvXzNSwEeQgZYVfZPU4pu<\/code><\/strong><\/span><\/li><\/ul><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>SaleData.SaleToAcquirerData<\/code><\/td>\n<td style=\"text-align: left;\">Optional. When you are enrolling the shopper in your loyalty program on the spot, use this parameter to create shopper identifiers and receive them in card acquisition and payment responses. <p>See the <a href=\"#sale-to-acquirer-data\">instructions below<\/a>.<\/p><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>For a newly enrolled shopper, you can include the following in <code>SaleData.SaleToAcquirerData<\/code>:<br \/>\n<a id=\"sale-to-acquirer-data\"><\/a><\/p>\n<ul>\n<li><code>shopperEmail<\/code>: The shopper's email address, if you collected that.<\/li>\n<li>\n<p><code>shopperReference<\/code>: Your unique reference for this shopper. Minimum length: three characters. Note that the value is case-sensitive. Do not include personally identifiable information (PII), such as name or email address.<\/p>\n <!-- list separator -->\n<\/li>\n<\/ul>\n<p>Pass the <code>SaleToAcquirerData<\/code> value in one of the following formats:<\/p>\n<ul>\n<li>Option 1: a JSON object converted to a Base64 encoded string. Refer to <a href=\"\/point-of-sale\/add-data#base64-json\">Add information to a payment<\/a>.<\/li>\n<li>Option 2: form-encoded key-value pairs (using <strong>&amp;<\/strong> as a separator). For example:<br \/>\n<code>shopperEmail=S.Hopper@example.com&amp;shopperReference=12345<\/code><\/li>\n<\/ul>\n<p>The format that you use here, will also be the format of the <code>AdditionalResponse<\/code> that you receive.<\/p>\n<p>The following example shows how to make a payment for a shopper who is already enrolled in your loyalty program but does not have your NFC wallet pass yet.<\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Issue a pass through a payment request '\" :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            \\\"ServiceID\\\":\\\"0305p\\\",\\n            \\\"SaleID\\\":\\\"POSSystemID12345\\\",\\n            \\\"POIID\\\":\\\"V400m-346403161\\\"\\n        },\\n        \\\"PaymentRequest\\\":{\\n            \\\"LoyaltyData\\\": [\\n                {\\n                    \\\"LoyaltyAccountID\\\": {\\n                        \\\"EntryMode\\\" : [\\n                            \\\"Mobile\\\"\\n                        ],\\n                        \\\"IdentificationType\\\": \\\"AccountNumber\\\",\\n                        \\\"LoyaltyID\\\": \\\"oGvXzNSwEeQgZYVfZPU4pu\\\"\\n                    }\\n                }\\n            ],\\n            \\\"SaleData\\\":{\\n                \\\"SaleTransactionID\\\":{\\n                    \\\"TimeStamp\\\": \\\"2020-06-19T12:23:04.000Z\\\",\\n                    \\\"TransactionID\\\": \\\"042208\\\"\\n                },\\n            },\\n            \\\"PaymentTransaction\\\":{\\n                \\\"AmountsReq\\\":{\\n                    \\\"Currency\\\":\\\"EUR\\\",\\n                    \\\"RequestedAmount\\\":14.48\\n                }\\n            },\\n            \\\"PaymentData\\\":{\\n                \\\"CardAcquisitionReference\\\":{\\n                    \\\"TimeStamp\\\": \\\"2020-06-19T10:21:27.000Z\\\",\\n                    \\\"TransactionID\\\": \\\"8ha5001592562087001\\\"\\n                }\\n            }\\n        }\\n    }\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<li>\n<p>The shopper receives a message on their device that lets them add your pass to their wallet.<\/p>\n<\/li>\n<\/ol>\n<h2 id=\"override\">Overriding the configured flow<\/h2>\n<p>There can be situations when you want to use a different flow than the flow configured in your Customer Area.<\/p>\n<p>To specify the flow for an individual transaction:<\/p>\n<ol>\n<li>\n<p>Create a <code>VASModeOverride<\/code> JSON object and convert the JSON object to a Base64-encoded string.<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>VASModeOverride<\/code><\/td>\n<td style=\"text-align: left;\">An object that specifies the flow to use: <br> - <code>VASModeVASAndPayment<\/code>: collect both the NFC wallet pass details and the payment method details. <br>- <code>VASModeVASOrPayment<\/code>:  let the shopper collect the NFC wallet pass details. <br> - <code>VASModeVASOnly<\/code>: only collect the NFC wallet pass details. <br> - <code>VASModePaymentOnly<\/code>: only collect the payment method details.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>For example, create the JSON object <code>{\"VASModeOverride\": \"VASModePaymentOnly\"}<\/code>. When you encode that to Base64, the resulting string is <code>eyJWQVNNb2RlT3ZlcnJpZGUiOiAiVkFTTW9kZVBheW1lbnRPbmx5In0=<\/code>.<\/p>\n<\/li>\n<li>\n<p>Make a <a href=\"\/point-of-sale\/card-acquisition\">card acquisition request<\/a> or a <a href=\"\/point-of-sale\/basic-tapi-integration\/make-a-payment\">payment request<\/a> passing the Base64-encoded <code>VASModeOverride<\/code> JSON object inside <code>SaleData.SaleToPOIData<\/code>.<\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Card acquisition request'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n    \\\"SaleToPOIRequest\\\":{\\n        \\\"MessageHeader\\\":{\\n            \\\"ProtocolVersion\\\":\\\"3.0\\\",\\n            \\\"MessageClass\\\":\\\"Service\\\",\\n            \\\"MessageCategory\\\":\\\"CardAcquisition\\\",\\n            \\\"MessageType\\\":\\\"Request\\\",\\n            \\\"ServiceID\\\":\\\"0305Acq\\\",\\n            \\\"SaleID\\\":\\\"POSSystemID12345\\\",\\n            \\\"POIID\\\":\\\"V400m-346403161\\\"\\n        },\\n        \\\"CardAcquisitionRequest\\\":{\\n            \\\"SaleData\\\":{\\n                \\\"SaleTransactionID\\\":{\\n                    \\\"TransactionID\\\":\\\"422024\\\",\\n                    \\\"TimeStamp\\\":\\\"2021-05-07T12:12:34.000Z\\\"\\n                },\\n                \\\"SaleToPOIData\\\":\\\"eyJWQVNNb2RlT3ZlcnJpZGUiOiAiVkFTTW9kZVBheW1lbnRPbmx5In0=\\\",\\n                \\\"TokenRequestedType\\\":\\\"Customer\\\"\\n            },\\n            \\\"CardAcquisitionTransaction\\\":{\\n                \\\"TotalAmount\\\": 14.98\\n            }\\n        }\\n    }\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<p>Depending on the <code>VASModeOverride<\/code> option, the response includes NFC wallet pass details and\/or the payment method details.<\/p>\n<\/li>\n<\/ol>\n<h2>See also<\/h2>\n<div class=\"see-also-links output-inline\" id=\"see-also\">\n<ul><li><a href=\"\/point-of-sale\/loyalty\"\n                        target=\"_self\"\n                        >\n                    Shopper loyalty\n                <\/a><\/li><li><a href=\"\/point-of-sale\/card-acquisition\"\n                        target=\"_self\"\n                        >\n                    Card acquisition\n                <\/a><\/li><\/ul><\/div>\n","url":"https:\/\/docs.adyen.com\/point-of-sale\/loyalty\/wallet-passes","articleFields":{"description":"Learn how to process transactions with digital passes that shoppers keep in their NFC wallet.","last_edit_on":"04-11-2025 14:23","feedback_component":true,"filters_component":false,"decision_tree":"[]","page_id":"644ed3f5-7259-43b0-9b07-3b105853297f"},"algolia":{"url":"https:\/\/docs.adyen.com\/point-of-sale\/loyalty\/wallet-passes","title":"Wallet passes","content":"Customers can link credit and debit cards to a wallet app on their phone or smartwatch to make in-person payments through Near Field Communication (NFC) with a payment terminal. Apart from cards, customers can also keep other digital passes in their wallet app, such as:\n\nLoyalty cards\nVouchers\nGift cards\nBoarding passes\nTickets\n\nWith these NFC-enabled passes, they can for example redeem a voucher or collect points on a loyalty card when they make a purchase.\nAs a merchant, you can create your own wallet passes, and link the passes to your loyalty program. During a transaction, you then check if the customer has your pass in their NFC wallet, and use the pass for the transaction.\nRequirements\nBefore you begin, take into account the following requirements and limitations.\n\n\n\nRequirement\nDescription\n\n\n\n\nIntegration type\nA Terminal API integration with payment terminals.\n\n\nHardware\nThe following payment terminal models are supported: Verifone Engage terminals using software version 1.64 or later. Castles Android terminals using software version 1.105 or later. The Verifone Android terminals (P630 and M450) are not supported yet.\n\n\nLimitations\nTake into account the following limitations: Only Apple Wallet passes are supported. On-the-spot shopper enrollment is  available for all Verifone Engage terminals and for all Android terminals except the Verifone Android terminals (P630 and M450).\n\n\nSetup steps\nBefore you begin: To be allowed to present your own Apple wallet passes, you need to have an agreement with Apple. If you want to use the single-tap redeem flow, ask our Support Team to enable single tap.\n\n\n\nTransaction flow options\nThere are various ways to implement NFC wallet passes with a payment, depending on what makes sense for your pass and loyalty program:\n\nPayment flow: You check for the passes after the payment, and update the shopper's account later.\n\nRedeem flow: You check for the passes before the payment through a card acquisition request. If there are discounts or other advantages related to the pass, you can apply these to the payment beforehand. If the shopper does not have your pass yet, you can create one on the spot and add this information to your payment request. The shopper then receives a message that lets them add the pass to their wallet.\nThere are two variations of the redeem flow: single-tap redeem flow and double-tap redeem flow. The implementation is very similar. The main difference is that in the double-tap flow the terminal asks the shopper a second time to present their card. This allows the shopper to redeem the NFC pass the first time that the terminal asks for their card, and then switch to another payment method the second time that the terminal asks for their card.\n\n\nSelect the tabs below to learn more. Before you configure your NFC pass in the Customer Area, you need to understand how these flows work and which flow you want to implement.\n\n\n    \n        \n        \n    \n\n\nShopper enrollment\nTo enroll shoppers in your loyalty program and let them add your NFC wallet pass to their mobile wallet, you can inform them through email, social media, your web site, and so on.\nIn the redeem flow, it is possible to enroll the shopper and\/or issue a pass on the spot, and add this information to your payment request. The shopper then receives a notification on their device that lets them add the pass to their wallet. This is possible with Verifone Engage terminals. See Case 2: The shopper does not have your pass.\nTo send the notification to the shopper's device, we need to know the URL where people can add a pass to their wallet, and the pass number. You can provide this information in two ways:\n\nConfigure the URL in your Customer Area. Then, in the LoyaltyData.LoyaltyID field of your payment request, specify only the pass number.\nDo not configure the URL in your Customer Area. In your payment request, in the LoyaltyData.LoyaltyID field, specify the URL appended with the pass number.\n\nHow it works\nTo implement transactions with digital NFC-enabled passes:\n\nSet up a pass server and create your NFC wallet pass.\nConfigure your NFC wallet pass in your Customer Area.\nImplement either the payment flow or the redeem flow to use NFC wallet passes in the transaction flow.\n\nCreate NFC wallet passes\n\n\nSet up a server for your NFC wallet passes. Note that there are third parties that offer this as a service.\nOn this pass server, you need to make a URL available where shoppers can enroll with the loyalty program tied to your NFC wallet pass and add the pass to their mobile wallet.\n\nThe full URL including https:\/\/ or http:\/\/ cannot be more than 60 characters.\n\nFor easier shopper enrollment, specify this URL when you configure the pass in your Customer Area.\n\n\nCreate one or more NFC wallet passes. See for example the Wallet Developer Guide, which explains how to create an Apple Wallet pass for your loyalty program.\n\nWhile creating your pass, a pass type ID and private key are generated. You will need these later, when you configure the pass in your Customer Area.\n\n\n\nTie in your loyalty program with your NFC wallet passes and your POS system. To learn more about how to link a customer in your loyalty program to a transaction, see Shopper recognition and tokenization.\n\n\nConfigure passes in your Customer Area\nTo inform us about your NFC-enabled pass and the flow you want to use:\n\n\nLog in to your Customer Area and select the account level where you want to use your NFC wallet pass.\n\n\nGo to In-person payments &gt; Terminal settings &gt; Payment features.\n\n\nScroll to NFC wallet passes.\n\n\nAt Choose a set up, select an option for the flow you want to use.\n\nSingle-tap redeem flow: collect both the NFC pass details and the NFC payment method details when you make a card acquisition request.\nPayment flow: collect both the NFC pass details and the NFC payment method details when you make a payment request.\n\nDouble-tap redeem flow: collect only the NFC pass details when you make a card acquisition request.\n\n\n\n\n\nEnter the Name of your pass.\n\n\nEnter the Pass type ID that was generated when you created your NFC pass.\nWe use this to poll only for your pass and not for passes from other organizations that the shopper may have in their mobile wallet. For an Apple Wallet pass, this has the format pass.com.your-company.your-pass-name.\n\n\nAt Protocol select the company responsible for the protocol that your NFC pass is based on. For example, Apple.\n\n\nOptional. Enter the URL where people can add the pass to their mobile wallet.\nWe use this for shopper enrollment, to send an NFC signal so that the shopper receives a message that lets them add the pass to their wallet.\n\n\nIn the Private key box, select the slot where you will provide your private key. For example, Private key 1.\n\n\nUnder Private key slots, select Decrypted, go to the slot that you selected in the previous step, and enter the private key for your NFC pass.\n\nInclude the begin and end lines -----BEGIN EC PRIVATE KEY-----\\n and \\n-----END EC PRIVATE KEY-----.\n\nThis key was generated when you created the pass. We will protect and encrypt it in our back end. The terminal uses this key to decrypt the NFC message and return the unique ID of the shopper's pass in the response.\n\n\nTo add more NFC wallet passes, select Add another pass and repeat the steps to complete the settings.\n\n\nSelect Save.\n\n\nAfter you have finished the configuration, you are ready to accept your NFC wallet pass with a payment, using either the payment flow or the redeem flow.\nUse the payment flow\nTo make a payment request and afterwards update the shopper's NFC pass account:\n\n\nMake a payment request. For example:\n\n\n\n\n\nCheck the payment response for the  LoyaltyResult.\nThis is an array with your NFC enabled passes that are in the shopper's digital wallet. For each pass, there is a LoyaltyAccount object with:\n\n\n\nProperty\nDescription\n\n\n\n\nLoyaltyAccountID.EntryMode\nIndicates how the NFC pass details were obtained.\n\n\nLoyaltyAccountID.IdentificationType\nAccountNumber. The type of ID of the shopper's pass.\n\n\nLoyaltyAccountID.LoyaltyID\nThe unique ID of the shopper's pass.\n\n\nLoyaltyBrand\nThe vendor protocol that the NFC pass is based on.\n\n\n\nIf the response does not include a LoyaltyResult, the shopper has not added your NFC wallet pass to their mobile wallet yet.\n\n\n\n\n\nUsing the LoyaltyID and card alias returned in the response, look up the shopper in your pass server and loyalty program, and update the shopper's data. For example, the loyalty points accrued.\n\n\nUse the redeem flow\nIn this flow you check whether the shopper has your NFC wallet pass in their wallet app before you start a payment. If the shopper already has your pass, you can apply a discount or other advantages related to the pass. If the shopper does not have your pass, you can issue a pass and add this data to your payment request. The shopper will receive a message that lets them add the pass to their wallet.\nGet the shopper's pass details\n\n\nMake a card acquisition request, including:\n\n\n\nParameter\nDescription\n\n\n\n\nCardAcquisitionTransaction\nIn the single-tap redeem flow, this object must contain: TotalAmount: The transaction amount. In the double-tap redeem flow, you can omit TotalAmount when you do not know the amount yet. Or you can also change the transaction amount later, in the payment request.\n\n\n\n\n\n\n\n\nWhen you receive the card acquisition response, keep the TimeStamp and TransactionID from the POIData.POITransactionID. You need these details later in your payment request.\n\n\nCheck the card acquisition response for the  LoyaltyAccount.\nThis is an array with your NFC enabled passes that are in the shopper's digital wallet. For each pass, the following details are provided:\n\n\n\nProperty\nDescription\n\n\n\n\nLoyaltyAccountID.EntryMode\nIndicates how the NFC pass details were obtained.\n\n\nLoyaltyAccountID.IdentificationType\nAccountNumber. The type of ID of the shopper's pass.\n\n\nLoyaltyAccountID.LoyaltyID\nThe unique ID of the shopper's pass.\n\n\nLoyaltyBrand\nThe vendor protocol that the NFC pass is based on.\n\n\n\nIf the response does not include a LoyaltyAccount, the shopper has not added your NFC wallet pass to their mobile wallet yet.\n\n\n\n\n\nGo to the next step, depending on the case:\n\nCase 1: The shopper already added your pass to their wallet.\nCase 2: The shopper does not have your pass in their wallet yet.\n\n\n\nCase 1: The shopper has your pass\n\n\nUsing the LoyaltyID returned in the card acquisition response, look up the shopper in your pass server and loyalty program, and apply your business logic.\nFor example:\n\nMake a confirmation input request to ask the shopper whether they want to redeem loyalty points.\nAdd or recalculate loyalty points.\nApply a discount.\n\nRecalculate the transaction amount.\n\n\n\n\n\nMake a payment request with:\n\n\n\n\nParameter\nDescription\n\n\n\n\nPaymentTransaction.AmountsReq\nAn object with: Currency: The transaction currency.RequestedAmount: The final transaction amount.\n\n\nPaymentData.CardAcquisitionReference\nAn object referencing the card acquisition: TimeStamp: The timestamp returned in the POIData.POITransactionID of the card acquisition response. TransactionID: The transaction ID returned in the POIData.POITransactionID of the card acquisition response.\n\n\n\n\n\n\n\n\nWhen you receive the payment response, note that:\n\nIn the single-tap redeem flow, the payment response does not include the LoyaltyResult again.\nIn the double-tap redeem flow, the payment response includes the LoyaltyResult with the same loyalty details as in the card acquisition response.\n\n\n\n\n\n\nCase 2: The shopper does not have your pass\nIf the card acquisition response indicates the shopper does not have your NFC wallet pass in their mobile wallet, you check whether they are enrolled in your loyalty program. If they are (or if you enroll them on the spot) you can issue a pass and add the pass details to your payment request. This will send a message to the shopper's device so that they can easily add your pass to their wallet.\n\n\nCheck whether the shopper is enrolled in your loyalty program. Depending on how you have set up your loyalty program, you can:\n\nCheck the AdditionalResponse in the card acquisition response for a shopperReference. If this is present, you already have the shopper on record. (See the shopper loyalty use case.)\n\nOr ask the shopper whether they are enrolled. If yes, ask them for their membership number or similar. You can use input requests to gather this information, or let your staff enter the information in your POS app.\n\n\n\nIf the shopper is already enrolled, skip to issuing a pass (step 4).\n\n\nIf the shopper is not enrolled in your loyalty program yet, ask the shopper whether they want to enroll.\n\nIf the shopper does not want to enroll, make a payment request with a reference to the card acquisition. This is the same payment request from Case 1, only the response won't include a LoyaltyResult. The flow ends.\n\nIf the shopper wants to enroll, continue with the next step.\n\n\n\n\n\nTo enroll the shopper in your loyalty program on the spot:\n\nCollect shopper details like their email address. You can use input requests to gather this information, or let your staff enter the information in your POS app.\n\nCreate a customer profile for the shopper in your loyalty program and pass server with the information you collected.\n\n\n\nYou now have a customer profile for the shopper, either because it already existed or because you just created it.\n\n\nUsing the shopperReference from the card acquisition response or some other reference, find the shopper's customer profile in your pass server. Then generate a unique pass identifier for the shopper.\n\n\nMake a payment request with:\n\n\n\nParameter\nDescription\n\n\n\n\nPaymentTransaction.AmountsReq\nAn object with: Currency: The transaction currency.RequestedAmount: The final transaction amount.\n\n\nPaymentData.CardAcquisitionReference\nAn object referencing the card acquisition: TimeStamp: The timestamp returned in the POIData.POITransactionID of the card acquisition response. TransactionID: The transaction ID returned in the POIData.POITransactionID of the card acquisition response.\n\n\nLoyaltyData\nAn array with a LoyaltyAccountID object for each of your NFC wallet passes. This lets the shopper add your NFC wallet pass to their digital wallet. Each LoyaltyAccountID object contains:EntryMode: MobileIdentificationType: AccountNumber.LoyaltyID: the unique identifier of the shopper's new pass. If in your Customer Area you configured the URL where people can get your pass, only specify the pass ID. For example: oGvXzNSwEeQgZYVfZPU4pu If you didn't configure the URL of your pass, specify the URL appended with the pass ID. For example: https:\/\/uc.seamless-checkout.net\/getWallet\/oGvXzNSwEeQgZYVfZPU4pu\n\n\nSaleData.SaleToAcquirerData\nOptional. When you are enrolling the shopper in your loyalty program on the spot, use this parameter to create shopper identifiers and receive them in card acquisition and payment responses. See the instructions below.\n\n\n\nFor a newly enrolled shopper, you can include the following in SaleData.SaleToAcquirerData:\n\n\nshopperEmail: The shopper's email address, if you collected that.\n\nshopperReference: Your unique reference for this shopper. Minimum length: three characters. Note that the value is case-sensitive. Do not include personally identifiable information (PII), such as name or email address.\n \n\n\nPass the SaleToAcquirerData value in one of the following formats:\n\nOption 1: a JSON object converted to a Base64 encoded string. Refer to Add information to a payment.\nOption 2: form-encoded key-value pairs (using &amp; as a separator). For example:\nshopperEmail=S.Hopper@example.com&amp;shopperReference=12345\n\nThe format that you use here, will also be the format of the AdditionalResponse that you receive.\nThe following example shows how to make a payment for a shopper who is already enrolled in your loyalty program but does not have your NFC wallet pass yet.\n\n\n\n\n\nThe shopper receives a message on their device that lets them add your pass to their wallet.\n\n\nOverriding the configured flow\nThere can be situations when you want to use a different flow than the flow configured in your Customer Area.\nTo specify the flow for an individual transaction:\n\n\nCreate a VASModeOverride JSON object and convert the JSON object to a Base64-encoded string.\n\n\n\nParameter\nDescription\n\n\n\n\nVASModeOverride\nAn object that specifies the flow to use:  - VASModeVASAndPayment: collect both the NFC wallet pass details and the payment method details. - VASModeVASOrPayment:  let the shopper collect the NFC wallet pass details.  - VASModeVASOnly: only collect the NFC wallet pass details.  - VASModePaymentOnly: only collect the payment method details.\n\n\n\nFor example, create the JSON object {\"VASModeOverride\": \"VASModePaymentOnly\"}. When you encode that to Base64, the resulting string is eyJWQVNNb2RlT3ZlcnJpZGUiOiAiVkFTTW9kZVBheW1lbnRPbmx5In0=.\n\n\nMake a card acquisition request or a payment request passing the Base64-encoded VASModeOverride JSON object inside SaleData.SaleToPOIData.\n\n\n\nDepending on the VASModeOverride option, the response includes NFC wallet pass details and\/or the payment method details.\n\n\nSee also\n\n\n                    Shopper loyalty\n                \n                    Card acquisition\n                \n","type":"page","locale":"en","boost":17,"hierarchy":{"lvl0":"Home","lvl1":"In-person payments","lvl2":"Shopper loyalty","lvl3":"Wallet passes"},"hierarchy_url":{"lvl0":"https:\/\/docs.adyen.com\/","lvl1":"https:\/\/docs.adyen.com\/point-of-sale","lvl2":"https:\/\/docs.adyen.com\/point-of-sale\/loyalty","lvl3":"\/point-of-sale\/loyalty\/wallet-passes"},"levels":4,"category":"In-person payments","category_color":"green","tags":["Wallet","passes"]},"articleFiles":{"redeem-card-acquisition.request.json":"<p alt=\"\">redeem-card-acquisition.request.json<\/p>","redeem-card-acquisition.response.json":"<p alt=\"\">redeem-card-acquisition.response.json<\/p>","redeem-payment.request.json":"<p alt=\"\">redeem-payment.request.json<\/p>","redeem-payment.response.json":"<p alt=\"\">redeem-payment.response.json<\/p>","single-tap-payment.request.json":"<p alt=\"\">single-tap-payment.request.json<\/p>","single-tap-payment.response.json":"<p alt=\"\">single-tap-payment.response.json<\/p>"}}
