{"title":"Buy online, pick up in store","category":"default","creationDate":1788778638,"content":"<p>In this click-and-collect retail use case, items are paid online. When the items are picked up at a brick-and-mortar store, last minute changes can be made: purchased but unwanted items can be refunded, and additional items can be bought at pickup.<\/p>\n<h2>Requirements<\/h2>\n<p>Before you begin, take into account the following information.<\/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;\">You must have both an ecommerce integration and a point-of-sale integration with Adyen.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong>Your systems<\/strong><\/td>\n<td style=\"text-align: left;\">It is essential to have (or create) a consolidated order\/inventory management or ERP system. Or alternatively, you must have an orchestration layer that communicates with your various sub-systems and can consume webhook messages. This is because your POS system needs to be able to update the online inventory in case of a pickup, sale, or return.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong>Preparation<\/strong><\/td>\n<td style=\"text-align: left;\">We recommend familiarizing yourself with specific concepts so that you can make informed decisions about integration choices. See <a href=\"#considerations\">Considerations<\/a> for details.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Shopper journey<\/h2>\n<p>From the shopper's perspective, this click-and-collect use case is as follows.<\/p>\n<p>On the ecommerce site, the shopper logs in to their profile (if they have one), selects some items, and pays. The shopper indicates they want to pick up the items in-person at a store location. The shopper selects a location, and indicates how they want to identify themselves when they pick up the items: using the same card that was used for the online payment, or using their customer profile. If necessary, the shopper enters the details to create a profile.<\/p>\n<p>At the store, the shopper identifies themselves using the chosen method, either:<\/p>\n<ul>\n<li>At the terminal in the store, the shopper presents (taps) the same card that was used for the online payment.<\/li>\n<li>The shopper answers questions about identifying data that are included in the shopper's profile, such as name and telephone number.<\/li>\n<\/ul>\n<p>Store personnel retrieves the purchased items. The shopper can then decide they do not want one or more of the items and get a refund, or buy additional items from the store.<\/p>\n<p>The following diagram illustrates this shopper journey.<\/p>\n<div id=\"mermaid-6a9e9a6a3d9bf-wrapper\"><div id=\"mermaid-6a9e9a6a3d9bf\" class=\"mermaid-shortcode loading\">CmdyYXBoIExSCiAgICBBKChCdXkgb25saW5lKSk6OjpzdGVwU3R5bGUgLS0+IEJ7Q2hvb3NlPGJyPnBpY2t1cDxicj5vcHRpb259Ojo6c3RlcFN0eWxlCiAgICBCIC0tIENhcmQgLS0+IEMxW0F0IHBpY2t1cDogSWRlbnRpZnkgPGJyPnRocm91Z2ggcGF5bWVudCBjYXJkXTo6OnN0ZXBTdHlsZQogICAgQiAtLSBQcm9maWxlIC0tPiBDMltBdCBwaWNrdXA6IElkZW50aWZ5IDxicj50aHJvdWdoIHByb2ZpbGVdOjo6c3RlcFN0eWxlCiAgICBDMSAtLT4gRHtEcm9wIG9yPGJyPmFkZCBpdGVtcz99Ojo6c3RlcFN0eWxlCiAgICBDMiAtLT4gRHtEcm9wIG9yPGJyPmFkZCBpdGVtcz99Ojo6c3RlcFN0eWxlCiAgICBEIC0tIFllcyAtLT4gRSgoUmVmdW5kL1BheTxicj5hdCB0ZXJtaW5hbCkpOjo6c3RlcFN0eWxlCiAgICBEIC0tIE5vIC0tPiBGKChFbmQpKTo6OmZpbmFsU3R5bGUKICAgIEUgLS0+IEYoKFJlY2VpdmUgaXRlbXM8YnI+YXQgcGlja3VwKSk6OjpmaW5hbFN0eWxlCgolJSBTdHlsZXMKICAgIGNsYXNzRGVmIHRvcFN0eWxlIGZpbGw6IzAwMCxzdHJva2U6IzAwMCxjb2xvcjojZmZmCiAgICBjbGFzc0RlZiBjYXRlZ29yeVN0eWxlIGZpbGw6IzQ0NCxzdHJva2U6IzMzMyxjb2xvcjojZmZmCiAgICBjbGFzc0RlZiBzdGVwU3R5bGUgZmlsbDojZmZmLHN0cm9rZTojMGFiZjUzLHN0cm9rZS13aWR0aDoycHgsY29sb3I6IzAwMAogICAgY2xhc3NEZWYgZmluYWxTdHlsZSBmaWxsOiMwYWJmNTMsc3Ryb2tlOiMwNzhkM2UsY29sb3I6IzAwMAo=<\/div><\/div>\n<h2 id=\"considerations\">Considerations<\/h2>\n<p>Before you set up a flow for this use case, there are a couple of points that you must be aware of or make a decision on.<\/p>\n<h3>Capture settings<\/h3>\n<p>You can capture the online payment immediately, or delay capture until the shopper picks up the items. We recommend capturing immediately. If you delay capture, the authorization can expire before pickup. Authorization validity periods vary per card scheme.<br \/>\n<div data-component-wrapper=\"tag\">\n    <tag :variant=&quot;success&quot;>\n        Reference:\n    <\/tag>\n<\/div>\n <a href=\"\/online-payments\/capture\" target=\"_blank\">Capture<\/a>, <a href=\"\/online-payments\/adjust-authorisation#authorization-validity\" target=\"_blank\">Authorization validity periods<\/a><\/p>\n<h3>Shopper attribution<\/h3>\n<p>You need to decide beforehand on how you will attribute the sale: If an item is purchased online and picked up in-store, is this an in-store sale or an ecommerce sale?<\/p>\n<h3>Shopper identification<\/h3>\n<p>In general, to be able to identify the shopper at pickup based on data that you saved at the time of payment, you must consider data privacy. Always ask for explicit permission when you save the shopper's details for the first time.<br \/>\n<div data-component-wrapper=\"tag\">\n    <tag :variant=&quot;success&quot;>\n        Reference:\n    <\/tag>\n<\/div>\n <a href=\"\/point-of-sale\/card-acquisition\/identifiers#privacy\" target=\"_blank\">Customer data and privacy<\/a><\/p>\n<p>In this use case, you identify shoppers using card recognition, or using customer profile details. Be aware that you need to implement both methods. The reason for this is that card recognition is only possible if a card or NFC wallet was used to make the ecommerce payment. Card recognition is not possible when the ecommerce payment is made with a QR code wallet (like PayPal), Buy Now Pay Later payment method (like Klarna), or other alternative payment method (like iDEAL\/Wero).<\/p>\n<p>We strongly recommend storing the card alias and the Payment Account Reference (PAR) in the shopper's profile. This lets you offer both recognition methods for the same shopper.<\/p>\n<p><div data-component-wrapper=\"tag\">\n    <tag :variant=&quot;success&quot;>\n        Reference:\n    <\/tag>\n<\/div>\n <a href=\"\/point-of-sale\/shopper-recognition\" target=\"_blank\">Card recognition<\/a><\/p>\n<p>To use card recognition as a way to identify the shopper at pickup, you must enable receiving shopper identifying data in API responses and webhook messages.<br \/>\n<div data-component-wrapper=\"tag\">\n    <tag :variant=&quot;success&quot;>\n        Reference:\n    <\/tag>\n<\/div>\n <a href=\"\/point-of-sale\/card-acquisition\/identifiers#receiving-identifiers-in-webhooks\" target=\"_blank\">Receive identifiers in webhooks<\/a> and <a href=\"\/point-of-sale\/card-acquisition\/identifiers#receiving-identifiers-in-responses\" target=\"_blank\">Receive identifiers in Terminal API responses<\/a><\/p>\n<h3>Card acquisition<\/h3>\n<p>Card recognition is based on a \"card acquisition\" request: the shopper presents their card or other payment instrument to the payment terminal, and the response returns details that you can use to look up the shopper in your system. Make sure you are familiar with card acquisition and the shopper identifiers that this operation returns.<br \/>\n<div data-component-wrapper=\"tag\">\n    <tag :variant=&quot;success&quot;>\n        Reference:\n    <\/tag>\n<\/div>\n <a href=\"\/point-of-sale\/card-acquisition\" target=\"_blank\">Card acquisition<\/a><\/p>\n<h3>Refund type<\/h3>\n<p>If at pickup the shopper does not want an item, you need to issue a (partial) referenced refund. A referenced refund uses the PSP reference to link to the original authorization. You need to decide which API you prefer to use:<\/p>\n<ul>\n<li><strong>Terminal API<\/strong>: You send a reversal request to the terminal. The terminal prints a receipt. You can refund from a different terminal or even a different merchant account.<\/li>\n<li><strong>Checkout API<\/strong>: You send a refund request to the Checkout API. The terminal does not print a receipt.<\/li>\n<\/ul>\n<p><div data-component-wrapper=\"tag\">\n    <tag :variant=&quot;success&quot;>\n        Reference:\n    <\/tag>\n<\/div>\n <a href=\"\/point-of-sale\/basic-tapi-integration\/refund-payment\/referenced#refund-ecommerce-payment\" target=\"_blank\">Terminal API refund of an ecommerce payment<\/a> or <a href=\"\/online-payments\/refund\" target=\"_blank\">Checkout API refund<\/a><\/p>\n<h2>API flow<\/h2>\n<p>There are several Adyen API requests involved in the described shopper journey, as shown in the following diagram.<\/p>\n<div id=\"mermaid-6a9e9a6a3d9c3-wrapper\"><div id=\"mermaid-6a9e9a6a3d9c3\" class=\"mermaid-shortcode loading\">CnNlcXVlbmNlRGlhZ3JhbQogICAgcGFydGljaXBhbnQgU2hvcHBlcgogICAgcGFydGljaXBhbnQgRWNvbQogICAgcGFydGljaXBhbnQgRVJQCiAgICBwYXJ0aWNpcGFudCBQT1MKICAgIHBhcnRpY2lwYW50IEFkeWVuCgogICAgU2hvcHBlci0+PkVjb206IEJ1eSBvbmxpbmUKICAgIEVjb20tPj5BZHllbjogQ2hlY2tvdXQgQVBJIHBheW1lbnQgcmVxdWVzdAogICAgQWR5ZW4tPj5FY29tOiBQYXltZW50IHJlc3BvbnNlCiAgICBub3RlIG92ZXIgQWR5ZW4sIEVjb206IEF1dG9tYXRpYyBvciBtYW51YWwgY2FwdHVyZQogICAgU2hvcHBlci0+PkVjb206IENob29zZSBwaWNrdXAgb3B0aW9uOiBjYXJkIG9yIHByb2ZpbGUKICAgIEVjb20tPj5FUlA6IFNhdmUgc2hvcHBlciBkYXRhIGZyb20gY2FyZCBvciBwcm9maWxlCiAgICBTaG9wcGVyLT4+UE9TOiBJZGVudGlmeSBhdCBwaWNrdXAKICAgIG9wdCBJZGVudGlmeSB1c2luZyBjYXJkIHJlY29nbml0aW9uCiAgICAgICAgUE9TLT4+QWR5ZW46IFRlcm1pbmFsIEFQSSBjYXJkIGFjcXVpc2l0aW9uIHJlcXVlc3QKICAgICAgICBBZHllbi0+PlBPUzogQ2FyZCBhY3F1aXNpdGlvbiByZXNwb25zZQogICAgZW5kCiAgICBQT1MtPj5FUlA6IEZpbmQgc2hvcHBlcgogICAgb3B0IFJlZnVuZCBpdGVtcwogICAgICAgIFNob3BwZXItLT4+UE9TOiBEcm9wIGl0ZW1zCiAgICAgICAgYWx0IFJlZmVyZW5jZWQgcmVmdW5kIHZpYSBUZXJtaW5hbCBBUEkKICAgICAgICAgICAgUE9TLT4+QWR5ZW46IFRlcm1pbmFsIEFQSSByZWZ1bmQgcmVxdWVzdAogICAgICAgICAgICBBZHllbi0+PlBPUzogUmVmdW5kIHJlc3BvbnNlCiAgICAgICAgZWxzZSBSZWZlcmVuY2VkIHJlZnVuZCB2aWEgQ2hlY2tvdXQgQVBJCiAgICAgICAgICAgIFBPUy0+PkVjb206IFJlcXVlc3QgcmVmdW5kCiAgICAgICAgICAgIEVjb20tPj5BZHllbjogQ2hlY2tvdXQgQVBJIHJlZnVuZCByZXF1ZXN0CiAgICAgICAgICAgIEFkeWVuLT4+RWNvbTogUmVmdW5kIHJlc3BvbnNlCiAgICAgICAgZW5kCiAgICBlbmQKICAgIG9wdCBTZWxsIGFkZGl0aW9uYWwgaXRlbXMKICAgICAgICBTaG9wcGVyLS0+PlBPUzogQWRkIGl0ZW1zCiAgICAgICAgUE9TLS0+PkFkeWVuOiBUZXJtaW5hbCBBUEkgcGF5bWVudAogICAgICAgIEFkeWVuLS0+PlBPUzogUGF5bWVudCByZXNwb25zZQogICAgICAgIG5vdGUgb3ZlciBBZHllbiwgUE9TOiBBdXRvbWF0aWMgKGRlbGF5ZWQpIGNhcHR1cmUKICAgIGVuZAo=<\/div><\/div>\n<p>The next section, \"Instructions\", provides more details about the API flow.<\/p>\n<h2>Instructions<\/h2>\n<p>This section provides high-level instructions focusing on how to use the Adyen APIs and webhooks in the described shopper journey.<\/p>\n<div class=\"notices green\">\n<p>The code samples show the minimally required parameters. You can add more parameters.<\/p>\n<\/div>\n<h4>Online purchase<\/h4>\n<p>If the shopper selected an option on your checkout to pick up their purchase at a (specific) physical location:<\/p>\n<ol>\n<li>\n<p>Make a Checkout API payment request and handle any additional action to complete the authorization.<br \/>\n<div data-component-wrapper=\"tag\">\n    <tag :variant=&quot;success&quot;>\n        Reference:\n    <\/tag>\n<\/div>\n <a href=\"\/online-payments\/build-your-integration\" target=\"_blank\">Online payments &gt; Build your integration<\/a>.<\/p>\n\n<div id=\"tabpb8By\">\n    <div data-component-wrapper=\"tabs\">\n        <tabs\n                        :items=\"[{&quot;title&quot;:&quot;Sessions flow payment request&quot;,&quot;content&quot;:&quot;\\n&lt;pre&gt;&lt;code class=\\&quot;language-json\\&quot;&gt;curl https:\\\/\\\/checkout-test.adyen.com\\\/v72\\\/sessions \\\\\\n-H &#039;x-api-key: ADYEN_API_KEY&#039; \\\\\\n-H \\&quot;idempotency-key: YOUR_IDEMPOTENCY_KEY\\&quot; \\\\\\n-H &#039;content-type: application\\\/json&#039; \\\\\\n-d &#039;{\\n  \\&quot;merchantAccount\\&quot;: \\&quot;ADYEN_MERCHANT_ACCOUNT\\&quot;,\\n  \\&quot;amount\\&quot;: {\\n     \\&quot;value\\&quot;: 12050,\\n     \\&quot;currency\\&quot;: \\&quot;USD\\&quot;\\n  },\\n  \\&quot;returnUrl\\&quot;: \\&quot;https:\\\/\\\/your-company.example.com\\\/checkout?shopperOrder=12xy..\\&quot;,\\n  \\&quot;reference\\&quot;: \\&quot;YOUR_PAYMENT_REFERENCE\\&quot;,\\n  \\&quot;countryCode\\&quot;: \\&quot;US\\&quot;\\n}&#039;&lt;\\\/code&gt;&lt;\\\/pre&gt;\\n&quot;,&quot;altTitle&quot;:null,&quot;oldTabId&quot;:1,&quot;relation&quot;:&quot;&quot;},{&quot;title&quot;:&quot;Advanced flow payment request&quot;,&quot;content&quot;:&quot;\\n&lt;pre&gt;&lt;code class=\\&quot;language-json\\&quot;&gt;curl https:\\\/\\\/checkout-test.adyen.com\\\/v72\\\/payments \\\\\\n-H &#039;x-api-key: ADYEN_API_KEY&#039; \\\\\\n-H &#039;content-type: application\\\/json&#039; \\\\\\n-d &#039;{\\n  \\&quot;amount\\&quot;: {\\n     \\&quot;currency\\&quot;: \\&quot;USD\\&quot;,\\n     \\&quot;value\\&quot;: 12050\\n  },\\n  \\&quot;reference\\&quot;: \\&quot;YOUR_ORDER_NUMBER\\&quot;,\\n  \\&quot;paymentMethod\\&quot;:{\\n     \\&quot;type\\&quot;: \\&quot;scheme\\&quot;,\\n     \\&quot;encryptedCardNumber\\&quot;: \\&quot;test_4111111111111111\\&quot;,\\n     \\&quot;encryptedExpiryMonth\\&quot;: \\&quot;test_03\\&quot;,\\n     \\&quot;encryptedExpiryYear\\&quot;: \\&quot;test_2030\\&quot;,\\n     \\&quot;encryptedSecurityCode\\&quot;: \\&quot;test_737\\&quot;\\n  },\\n  \\&quot;returnUrl\\&quot;: \\&quot;https:\\\/\\\/your-company.example.com\\\/checkout?shopperOrder=12xy..\\&quot;,\\n  \\&quot;merchantAccount\\&quot;: \\&quot;ADYEN_MERCHANT_ACCOUNT\\&quot;\\n}&#039;&lt;\\\/code&gt;&lt;\\\/pre&gt;\\n&quot;,&quot;altTitle&quot;:null,&quot;oldTabId&quot;:1,&quot;relation&quot;:&quot;&quot;}]\"\n            :should-update-when-url-changes='false'>\n        <\/tabs>\n    <\/div>\n<\/div>\n\n<\/li>\n<li>\n<p>If the <code>resultCode<\/code> from the API response shows the payment is authorized, present an option on your checkout to let the shopper choose an identification method at the pickup location: through the card they used for the purchase, or through personal details.<\/p>\n<\/li>\n<li>\n<p>If the shopper selected personal details as identification method, present a form to let the shopper enter identifying details such as name, phone number, and address. Securely save the entered details in your system.<\/p>\n<\/li>\n<li>\n<p>If the shopper selected card as identification method, securely save the following details when you get the outcome of the payment in the  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Webhooks\/latest\/post\/AUTHORISATION\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">AUTHORISATION<\/a> webhook message:<\/p>\n<ul>\n<li><code>additionalData.alias<\/code>: The card alias uniquely represents the shopper's card number (PAN). This enables you to recognize the card that a shopper is using. You cannot use the card alias for making payments. For NFC wallet transactions, the card alias is not available.<\/li>\n<li><code>additionalData.PaymentAccountReference<\/code>: The payment account reference (PAR) represents the payment account that the card and\/or NFC wallet is linked to. It solves the issue with the PAN and alias not being available for NFC wallet transactions. Using the PAR, you can recognize the shopper.<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>Regardless of identification method, from the <strong>AUTHORISATION<\/strong> webhook message also save the following details. You will need these details to find the order in your system. You also need these details in case you want to make a referenced refund request when the shopper returns items at pickup.<\/p>\n<ul>\n<li><code>pspReference<\/code>: The Adyen-generated unique reference for the transaction.<\/li>\n<li><code>amount<\/code>: The <code>currency<\/code> and <code>value<\/code> of the transaction.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h4>In-store pickup<\/h4>\n<p>When the shopper comes to the pickup location:<\/p>\n<ol>\n<li>\n<p>If you need to identify the shopper based on the card that was used to pay for the online purchase:<\/p>\n<ol>\n<li>\n<p>Make a Terminal API  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/terminal-api\/latest\/post\/cardacquisition\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">CardAcquisitionRequest<\/a> with an empty <code>CardAcquisitionTransaction<\/code> object.<br \/>\n<div data-component-wrapper=\"tag\">\n    <tag :variant=&quot;success&quot;>\n        Reference:\n    <\/tag>\n<\/div>\n<a href=\"\/point-of-sale\/card-acquisition\" target=\"_blank\">Card acquisition<\/a><\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Card acquisition to recognize the card'\" :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\\\": \\\"282\\\",\\n            \\\"SaleID\\\": \\\"POSSystemID12345\\\",\\n            \\\"POIID\\\": \\\"AMS1-324688179\\\"\\n        },\\n        \\\"CardAcquisitionRequest\\\": {\\n            \\\"SaleData\\\": {\\n                \\\"SaleTransactionID\\\": {\\n                    \\\"TransactionID\\\": \\\"869\\\",\\n                    \\\"TimeStamp\\\": \\\"2026-02-10T12:30:00.134-06:00\\\"\\n                }\\n            },\\n            \\\"CardAcquisitionTransaction\\\": {}\\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  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/terminal-api\/latest\/post\/cardacquisition#responses-200-Response\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">CardAcquisitionResponse<\/a>, get the following information from the <code>response.AdditionalResponse<\/code>:<\/p>\n<ul>\n<li><code>PaymentAccountReference<\/code>: the PAR, if present.<\/li>\n<li><code>alias<\/code>: the card alias<\/li>\n<\/ul>\n<p>The following example shows the <code>AdditionalResponse<\/code> as a string of key-value pairs concatenated with an ampersand (<strong>&amp;<\/strong>). It is possible you receive a Base64-encoded string instead, which you need to Base64 decode first.<\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Card acquisition response'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n    \\\"SaleToPOIResponse\\\": {\\n        \\\"CardAcquisitionResponse\\\": {\\n            \\\"POIData\\\": {\\n                \\\"POIReconciliationID\\\": \\\"1000\\\",\\n                \\\"POITransactionID\\\": {\\n                    \\\"TimeStamp\\\": \\\"2026-02-10T12:30:01.399-06:00\\\",\\n                    \\\"TransactionID\\\": \\\"BV0q001770726600000\\\"\\n                }\\n            },\\n            \\\"PaymentInstrumentData\\\": {\\n                \\\"CardData\\\": {\\n                    \\\"CardCountryCode\\\": \\\"840\\\",\\n                    \\\"MaskedPan\\\": \\\"510006 **** 0002\\\",\\n                    \\\"PaymentBrand\\\": \\\"mc\\\",\\n                    \\\"SensitiveCardData\\\": {\\n                        \\\"ExpiryDate\\\": \\\"1229\\\"\\n                    }\\n                },\\n                \\\"PaymentInstrumentType\\\": \\\"Card\\\"\\n            },\\n            \\\"Response\\\": {\\n                \\\"AdditionalResponse\\\": \\\"PaymentAccountReference=nmHL7QIKrz2cae0gjLTByTxIk76OX&amp;alias=P692729067643981&amp;...message=CARD_ACQ_COMPLETED...\\\",\\n                \\\"Result\\\": \\\"Success\\\"\\n            },\\n            \\\"SaleData\\\": {\\n                \\\"SaleTransactionID\\\": {\\n                    \\\"TimeStamp\\\": \\\"2026-02-10T12:29:58.765-06:00\\\",\\n                    \\\"TransactionID\\\": \\\"869\\\"\\n                }\\n            }\\n        },\\n        \\\"MessageHeader\\\": {\\n            \\\"MessageCategory\\\": \\\"CardAcquisition\\\",\\n            \\\"MessageClass\\\": \\\"Service\\\",\\n            \\\"MessageType\\\": \\\"Response\\\",\\n            \\\"POIID\\\": \\\"AMS1-324688179\\\",\\n            \\\"ProtocolVersion\\\": \\\"3.0\\\",\\n            \\\"SaleID\\\": \\\"POSSystemID12345\\\",\\n            \\\"ServiceID\\\": \\\"981\\\"\\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>Finish the card acquisition by making an  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/terminal-api\/latest\/post\/enableservice\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">EnableServiceRequest<\/a> to stop the flow.<br \/>\nConsider including a <code>DisplayOutput<\/code> object with an explanatory message for the shopper, as shown in the following example.<br \/>\n<div data-component-wrapper=\"tag\">\n    <tag :variant=&quot;success&quot;>\n        Reference:\n    <\/tag>\n<\/div>\n<a href=\"\/point-of-sale\/card-acquisition#cancel-completed\" target=\"_blank\">Finish with a cancellation<\/a><\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Stop the card acquisition flow'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n   \\\"SaleToPOIRequest\\\": {\\n      \\\"MessageHeader\\\": {\\n         \\\"ProtocolVersion\\\": \\\"3.0\\\",\\n         \\\"MessageClass\\\": \\\"Service\\\",\\n         \\\"MessageCategory\\\": \\\"EnableService\\\",\\n         \\\"MessageType\\\": \\\"Request\\\",\\n         \\\"ServiceID\\\":\\\"3020711110\\\",\\n         \\\"SaleID\\\":\\\"POSSystemID12345\\\",\\n         \\\"POIID\\\":\\\"AMS1-324688179\\\"\\n      },\\n      \\\"EnableServiceRequest\\\": {\\n         \\\"TransactionAction\\\": \\\"AbortTransaction\\\",\\n         \\\"DisplayOutput\\\": {\\n            \\\"Device\\\": \\\"CustomerDisplay\\\",\\n            \\\"InfoQualify\\\": \\\"Display\\\",\\n            \\\"OutputContent\\\": {\\n               \\\"PredefinedContent\\\": {\\n                  \\\"ReferenceID\\\": \\\"AcceptedAnimated\\\"\\n               },\\n               \\\"OutputFormat\\\": \\\"Text\\\",\\n               \\\"OutputText\\\": [\\n                  {\\n                     \\\"Text\\\": \\\"Thank you!\\\"\\n                  },\\n                  {\\n                     \\\"Text\\\": \\\"We will get your order.\\\"\\n                  }\\n               ]\\n            }\\n         }\\n      }\\n   }\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>If you need to identify the shopper based on profile data, collect certain details like name and phone number. You can do this in the various ways, for example:<\/p>\n<ul>\n<li>The shop assistant asks the shopper for the details.<\/li>\n<li>You collect the shopper's details on a secondary screen, for instance a tablet.<\/li>\n<li>\n<p>You use <a href=\"\/point-of-sale\/shopper-engagement\/shopper-input\/\" target=\"_blank\">input requests<\/a>  to collect the shopper's details on the payment terminal.<\/p>\n<!-- list-separator -->\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>Ensure your store staff is able to look up the shopper and the purchased items in your system using either the PAR or card alias from the card acquisition response, or the profile data that the shopper provided. Store staff then hands over the items to the shopper.<\/p>\n<\/li>\n<li>\n<p>If the shopper does not want one or more of the purchased items, issue a referenced refund using the Terminal API or the Checkout API.<\/p>\n \n<div id=\"tabdnZuC\">\n    <div data-component-wrapper=\"tabs\">\n        <tabs\n                        :items=\"[{&quot;title&quot;:&quot;Terminal API&quot;,&quot;content&quot;:&quot;\\n&lt;p&gt;Send a Terminal API  &lt;a href=\\&quot;https:\\\/\\\/docs.adyen.com\\\/api-explorer\\\/terminal-api\\\/latest\\\/post\\\/reversal\\&quot; class=\\&quot;codeLabel  external-link no-image\\&quot; target=\\&quot;_blank\\&quot; rel=\\&quot;nofollow noopener noreferrer\\&quot;&gt;ReversalRequest&lt;\\\/a&gt; specifying the following details. You can get these details from the  &lt;a href=\\&quot;https:\\\/\\\/docs.adyen.com\\\/api-explorer\\\/Webhooks\\\/latest\\\/post\\\/AUTHORISATION\\&quot; class=\\&quot;codeLabel  external-link no-image\\&quot; target=\\&quot;_blank\\&quot; rel=\\&quot;nofollow noopener noreferrer\\&quot;&gt;AUTHORISATION&lt;\\\/a&gt; webhook message that you received for the ecommerce payment:&lt;\\\/p&gt;\\n&lt;table&gt;\\n&lt;thead&gt;\\n&lt;tr&gt;\\n&lt;th style=\\&quot;text-align: left;\\&quot;&gt;Parameter&lt;\\\/th&gt;\\n&lt;th style=\\&quot;text-align: center;\\&quot;&gt;Required&lt;\\\/th&gt;\\n&lt;th style=\\&quot;text-align: left;\\&quot;&gt;Description&lt;\\\/th&gt;\\n&lt;\\\/tr&gt;\\n&lt;\\\/thead&gt;\\n&lt;tbody&gt;\\n&lt;tr&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt;&lt;code&gt;OriginalPOITransaction.POITransactionID.TransactionID&lt;\\\/code&gt;&lt;\\\/td&gt;\\n&lt;td style=\\&quot;text-align: center;\\&quot;&gt;&lt;span class=\\&quot;hint--bottom\\&quot; data-hint=\\&quot;Required\\&quot; markdown=\\&quot;1\\&quot;&gt;&lt;img style=\\&quot;width: 25px;\\&quot; alt=\\&quot;Required\\&quot; src=\\&quot;\\\/user\\\/pages\\\/reuse\\\/image-library\\\/01.icons\\\/required\\\/required.svg?decoding=auto&amp;amp;fetchpriority=auto\\&quot; \\\/&gt;&lt;\\\/span&gt;&lt;\\\/td&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt;The PSP reference of the ecommerce payment, in the format &lt;code&gt;.pspReference&lt;\\\/code&gt;. Do not forget the leading dot (.). Without it, you will receive the error message &lt;code&gt;unreachable host&lt;\\\/code&gt;.&lt;\\\/td&gt;\\n&lt;\\\/tr&gt;\\n&lt;tr&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt;&lt;code&gt;OriginalPOITransaction.POITransactionID.TimeStamp&lt;\\\/code&gt;&lt;\\\/td&gt;\\n&lt;td style=\\&quot;text-align: center;\\&quot;&gt;&lt;span class=\\&quot;hint--bottom\\&quot; data-hint=\\&quot;Required\\&quot; markdown=\\&quot;1\\&quot;&gt;&lt;img style=\\&quot;width: 25px;\\&quot; alt=\\&quot;Required\\&quot; src=\\&quot;\\\/user\\\/pages\\\/reuse\\\/image-library\\\/01.icons\\\/required\\\/required.svg?decoding=auto&amp;amp;fetchpriority=auto\\&quot; \\\/&gt;&lt;\\\/span&gt;&lt;\\\/td&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt;The date and time in &lt;a href=\\&quot;https:\\\/\\\/en.wikipedia.org\\\/wiki\\\/ISO_8601#Coordinated_Universal_Time_(UTC)\\&quot; target=\\&quot;_blank\\&quot; rel=\\&quot;nofollow noopener noreferrer\\&quot; class=\\&quot;external-link no-image\\&quot;&gt;UTC format&lt;\\\/a&gt; of the ecommerce payment.&lt;\\\/td&gt;\\n&lt;\\\/tr&gt;\\n&lt;tr&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt;&lt;code&gt;SaleData.SaleToAcquirerData&lt;\\\/code&gt;&lt;\\\/td&gt;\\n&lt;td style=\\&quot;text-align: center;\\&quot;&gt;&lt;img title=\\&quot;-white_check_mark-\\&quot; alt=\\&quot;-white_check_mark-\\&quot; class=\\&quot;smileys\\&quot; src=\\&quot;\\\/user\\\/data\\\/smileys\\\/emoji\\\/white_check_mark.png\\&quot; \\\/&gt;&lt;\\\/td&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt;The currency of the refund, in the format &lt;code&gt;currency=ABC&lt;\\\/code&gt; where &lt;code&gt;ABC&lt;\\\/code&gt; is the three-letter &lt;a href=\\&quot;\\\/development-resources\\\/currency-codes\\&quot; target=\\&quot;_blank\\&quot;&gt;currency code&lt;\\\/a&gt; of the original payment.&lt;\\\/td&gt;\\n&lt;\\\/tr&gt;\\n&lt;tr&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt;&lt;code&gt;ReversedAmount&lt;\\\/code&gt;&lt;\\\/td&gt;\\n&lt;td style=\\&quot;text-align: center;\\&quot;&gt;&lt;span class=\\&quot;hint--bottom\\&quot; data-hint=\\&quot;Conditionally required\\&quot; markdown=\\&quot;1\\&quot;&gt;&lt;img style=\\&quot;width: 25px;\\&quot; alt=\\&quot;Conditionally required\\&quot; src=\\&quot;\\\/user\\\/pages\\\/reuse\\\/image-library\\\/01.icons\\\/conditionally-required\\\/conditionally-required.svg?decoding=auto&amp;amp;fetchpriority=auto\\&quot; \\\/&gt;&lt;\\\/span&gt;&lt;\\\/td&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt;Required for partial refunds. &lt;br&gt; Specify an amount, making sure to &lt;strong&gt;not&lt;\\\/strong&gt; use minor units. Without this parameter, the whole purchase is refunded.&lt;\\\/td&gt;\\n&lt;\\\/tr&gt;\\n&lt;\\\/tbody&gt;\\n&lt;\\\/table&gt;\\n&lt;div data-component-wrapper=\\&quot;code-sample\\&quot;&gt;\\n&lt;code-sample :title=\\&quot;&#039;Terminal API - Partial referenced refund of USD 12.50&#039;\\&quot; :id=\\&quot;&#039;&#039;\\&quot; :code-data=&#039;[{\\&quot;language\\&quot;:\\&quot;json\\&quot;,\\&quot;tabTitle\\&quot;:\\&quot;\\&quot;,\\&quot;content\\&quot;:\\&quot;{\\\\n   \\\\\\&quot;SaleToPOIRequest\\\\\\&quot;: {\\\\n      \\\\\\&quot;MessageHeader\\\\\\&quot;: {\\\\n         \\\\\\&quot;ProtocolVersion\\\\\\&quot;: \\\\\\&quot;3.0\\\\\\&quot;,\\\\n         \\\\\\&quot;MessageClass\\\\\\&quot;: \\\\\\&quot;Service\\\\\\&quot;,\\\\n         \\\\\\&quot;MessageCategory\\\\\\&quot;: \\\\\\&quot;Reversal\\\\\\&quot;,\\\\n         \\\\\\&quot;MessageType\\\\\\&quot;: \\\\\\&quot;Request\\\\\\&quot;,\\\\n         \\\\\\&quot;SaleID\\\\\\&quot;: \\\\\\&quot;POSSystemID12345\\\\\\&quot;,\\\\n         \\\\\\&quot;ServiceID\\\\\\&quot;: \\\\\\&quot;207111108\\\\\\&quot;,\\\\n         \\\\\\&quot;POIID\\\\\\&quot;: \\\\\\&quot;AMS1-324688179\\\\\\&quot;\\\\n      },\\\\n      \\\\\\&quot;ReversalRequest\\\\\\&quot;: {\\\\n         \\\\\\&quot;OriginalPOITransaction\\\\\\&quot;: {\\\\n            \\\\\\&quot;POITransactionID\\\\\\&quot;: {\\\\n               \\\\\\&quot;TransactionID\\\\\\&quot;: \\\\\\&quot;.VK9DRSLLRCQ2WN82\\\\\\&quot;,\\\\n               \\\\\\&quot;TimeStamp\\\\\\&quot;: \\\\\\&quot;2026-02-06T15:58:00.004-06:00\\\\\\&quot;\\\\n            }\\\\n         },\\\\n         \\\\\\&quot;ReversalReason\\\\\\&quot;: \\\\\\&quot;MerchantCancel\\\\\\&quot;,\\\\n         \\\\\\&quot;ReversedAmount\\\\\\&quot;: 12.50,\\\\n         \\\\\\&quot;SaleData\\\\\\&quot;: {\\\\n            \\\\\\&quot;SaleToAcquirerData\\\\\\&quot;: \\\\\\&quot;currency=USD\\\\\\&quot;,\\\\n            \\\\\\&quot;SaleTransactionID\\\\\\&quot;: {\\\\n               \\\\\\&quot;TimeStamp\\\\\\&quot;: \\\\\\&quot;2026-02-10T12:34:12.199-06:00\\\\\\&quot;,\\\\n               \\\\\\&quot;TransactionID\\\\\\&quot;: \\\\\\&quot;rev-708\\\\\\&quot;\\\\n            }\\\\n         }\\\\n      }\\\\n   }\\\\n}\\&quot;}]&#039; :enable-copy-link-to-code-block=\\&quot;true\\&quot; :code-sample-card-size=\\&quot;&#039;fullsize&#039;\\&quot;&gt;&lt;\\\/code-sample&gt;\\n&lt;\\\/div&gt;\\n&lt;p&gt;&lt;div data-component-wrapper=\\&quot;tag\\&quot;&gt;\\n    &lt;tag :variant=&amp;quot;success&amp;quot;&gt;\\n        Reference:\\n    &lt;\\\/tag&gt;\\n&lt;\\\/div&gt;\\n&lt;a href=\\&quot;\\\/point-of-sale\\\/basic-tapi-integration\\\/refund-payment\\\/referenced#refund-ecommerce-payment\\&quot; target=\\&quot;_blank\\&quot;&gt;Refund an ecommerce payment&lt;\\\/a&gt;&lt;\\\/p&gt;\\n &quot;,&quot;altTitle&quot;:null,&quot;oldTabId&quot;:1,&quot;relation&quot;:&quot;&quot;},{&quot;title&quot;:&quot;Checkout API&quot;,&quot;content&quot;:&quot;\\n&lt;p&gt;Send a POST request to the  &lt;a href=\\&quot;https:\\\/\\\/docs.adyen.com\\\/api-explorer\\\/Checkout\\\/latest\\\/post\\\/payments\\\/(paymentPspReference)\\\/refunds\\&quot; class=\\&quot;codeLabel  external-link no-image\\&quot; target=\\&quot;_blank\\&quot; rel=\\&quot;nofollow noopener noreferrer\\&quot;&gt;\\\/payments\\\/{paymentPspReference}\\\/refunds&lt;\\\/a&gt; endpoint, specifying the PSP reference of the ecommerce payment in the path.&lt;\\\/p&gt;\\n&lt;table&gt;\\n&lt;thead&gt;\\n&lt;tr&gt;\\n&lt;th style=\\&quot;text-align: left;\\&quot;&gt;Parameter&lt;\\\/th&gt;\\n&lt;th style=\\&quot;text-align: center;\\&quot;&gt;Required&lt;\\\/th&gt;\\n&lt;th style=\\&quot;text-align: left;\\&quot;&gt;Description&lt;\\\/th&gt;\\n&lt;\\\/tr&gt;\\n&lt;\\\/thead&gt;\\n&lt;tbody&gt;\\n&lt;tr&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt;&lt;code&gt;merchantAccount&lt;\\\/code&gt;&lt;\\\/td&gt;\\n&lt;td style=\\&quot;text-align: center;\\&quot;&gt;&lt;span class=\\&quot;hint--bottom\\&quot; data-hint=\\&quot;Required\\&quot; markdown=\\&quot;1\\&quot;&gt;&lt;img style=\\&quot;width: 25px;\\&quot; alt=\\&quot;Required\\&quot; src=\\&quot;\\\/user\\\/pages\\\/reuse\\\/image-library\\\/01.icons\\\/required\\\/required.svg?decoding=auto&amp;amp;fetchpriority=auto\\&quot; \\\/&gt;&lt;\\\/span&gt;&lt;\\\/td&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt;The name of your merchant account that is used to process the payment.&lt;\\\/td&gt;\\n&lt;\\\/tr&gt;\\n&lt;tr&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt;&lt;code&gt;amount&lt;\\\/code&gt;&lt;\\\/td&gt;\\n&lt;td style=\\&quot;text-align: center;\\&quot;&gt;&lt;span class=\\&quot;hint--bottom\\&quot; data-hint=\\&quot;Required\\&quot; markdown=\\&quot;1\\&quot;&gt;&lt;img style=\\&quot;width: 25px;\\&quot; alt=\\&quot;Required\\&quot; src=\\&quot;\\\/user\\\/pages\\\/reuse\\\/image-library\\\/01.icons\\\/required\\\/required.svg?decoding=auto&amp;amp;fetchpriority=auto\\&quot; \\\/&gt;&lt;\\\/span&gt;&lt;\\\/td&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt;The amount that you want to refund. The &lt;code&gt;value&lt;\\\/code&gt; must be the same or less than the captured amount. The &lt;code&gt;currency&lt;\\\/code&gt; must match the currency used in the authorization.&lt;\\\/td&gt;\\n&lt;\\\/tr&gt;\\n&lt;tr&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt;&lt;code&gt;reference&lt;\\\/code&gt;&lt;\\\/td&gt;\\n&lt;td style=\\&quot;text-align: center;\\&quot;&gt;&lt;\\\/td&gt;\\n&lt;td style=\\&quot;text-align: left;\\&quot;&gt;Your reference for the refund, for example to tag a partial refund for future reconciliation.&lt;\\\/td&gt;\\n&lt;\\\/tr&gt;\\n&lt;\\\/tbody&gt;\\n&lt;\\\/table&gt;\\n&lt;div data-component-wrapper=\\&quot;code-sample\\&quot;&gt;\\n&lt;code-sample :title=\\&quot;&#039;Checkout API - Partial referenced refund of USD 12.50&#039;\\&quot; :id=\\&quot;&#039;&#039;\\&quot; :code-data=\\&quot;[{&amp;quot;language&amp;quot;:&amp;quot;bash&amp;quot;,&amp;quot;tabTitle&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;content&amp;quot;:&amp;quot;curl https:\\\\\\\/\\\\\\\/checkout-test.adyen.com\\\\\\\/v72\\\\\\\/payments\\\\\\\/VK9DRSLLRCQ2WN82\\\\\\\/refunds \\\\\\\\\\\\n-H &#039;x-api-key: ADYEN_API_KEY&#039; \\\\\\\\\\\\n-H &#039;content-type: application\\\\\\\/json&#039; \\\\\\\\\\\\n-d &#039;{\\\\n      \\\\&amp;quot;merchantAccount\\\\&amp;quot;: \\\\&amp;quot;ADYEN_MERCHANT_ACCOUNT\\\\&amp;quot;,\\\\n      \\\\&amp;quot;amount\\\\&amp;quot;: {\\\\n         \\\\&amp;quot;currency\\\\&amp;quot;: \\\\&amp;quot;USD\\\\&amp;quot;,\\\\n         \\\\&amp;quot;value\\\\&amp;quot;: 1250\\\\n      },\\\\n      \\\\&amp;quot;reference\\\\&amp;quot;: \\\\&amp;quot;YOUR_UNIQUE_REFERENCE\\\\&amp;quot;\\\\n}&#039;&amp;quot;}]\\&quot; :enable-copy-link-to-code-block=\\&quot;true\\&quot; :code-sample-card-size=\\&quot;&#039;fullsize&#039;\\&quot;&gt;&lt;\\\/code-sample&gt;\\n&lt;\\\/div&gt;\\n&lt;p&gt;&lt;div data-component-wrapper=\\&quot;tag\\&quot;&gt;\\n    &lt;tag :variant=&amp;quot;success&amp;quot;&gt;\\n        Reference:\\n    &lt;\\\/tag&gt;\\n&lt;\\\/div&gt;\\n&lt;a href=\\&quot;\\\/online-payments\\\/refund\\&quot; target=\\&quot;_blank\\&quot;&gt;Refund a payment&lt;\\\/a&gt;&lt;\\\/p&gt;\\n &quot;,&quot;altTitle&quot;:null,&quot;oldTabId&quot;:1,&quot;relation&quot;:&quot;&quot;}]\"\n            :should-update-when-url-changes='false'>\n        <\/tabs>\n    <\/div>\n<\/div>\n\n<\/li>\n<li>\n<p>If the shopper has added some items from the store to their basket, make a Terminal API  <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>.<br \/>\n<div data-component-wrapper=\"tag\">\n    <tag :variant=&quot;success&quot;>\n        Reference:\n    <\/tag>\n<\/div>\n<a href=\"\/point-of-sale\/basic-tapi-integration\/make-a-payment\" target=\"_blank\">Make a payment<\/a><\/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=\"\/industries\/feature-packs?industry=retail&amp;channel=omni&amp;target=_blank\"\n                        target=\"_self\"\n                        >\n                    Features per industry: Retail omnichannel\n                <\/a><\/li><li><a href=\"\/unified-commerce\/retail-use-cases\"\n                        target=\"_self\"\n                        >\n                    Other retail omnichannel use cases\n                <\/a><\/li><\/ul><\/div>\n","url":"https:\/\/docs.adyen.com\/unified-commerce\/retail-use-cases\/click-and-collect\/c-and-c-add-return","articleFields":{"description":"Click and collect: Buy online and pick up in a store, and purchase less or more items.","type":"page","_expandable":{"operations":""}},"algolia":{"url":"https:\/\/docs.adyen.com\/unified-commerce\/retail-use-cases\/click-and-collect\/c-and-c-add-return","title":"Buy online, pick up in store","content":"In this click-and-collect retail use case, items are paid online. When the items are picked up at a brick-and-mortar store, last minute changes can be made: purchased but unwanted items can be refunded, and additional items can be bought at pickup.\nRequirements\nBefore you begin, take into account the following information.\n\n\n\nRequirement\nDescription\n\n\n\n\nIntegration type\nYou must have both an ecommerce integration and a point-of-sale integration with Adyen.\n\n\nYour systems\nIt is essential to have (or create) a consolidated order\/inventory management or ERP system. Or alternatively, you must have an orchestration layer that communicates with your various sub-systems and can consume webhook messages. This is because your POS system needs to be able to update the online inventory in case of a pickup, sale, or return.\n\n\nPreparation\nWe recommend familiarizing yourself with specific concepts so that you can make informed decisions about integration choices. See Considerations for details.\n\n\n\nShopper journey\nFrom the shopper's perspective, this click-and-collect use case is as follows.\nOn the ecommerce site, the shopper logs in to their profile (if they have one), selects some items, and pays. The shopper indicates they want to pick up the items in-person at a store location. The shopper selects a location, and indicates how they want to identify themselves when they pick up the items: using the same card that was used for the online payment, or using their customer profile. If necessary, the shopper enters the details to create a profile.\nAt the store, the shopper identifies themselves using the chosen method, either:\n\nAt the terminal in the store, the shopper presents (taps) the same card that was used for the online payment.\nThe shopper answers questions about identifying data that are included in the shopper's profile, such as name and telephone number.\n\nStore personnel retrieves the purchased items. The shopper can then decide they do not want one or more of the items and get a refund, or buy additional items from the store.\nThe following diagram illustrates this shopper journey.\nCmdyYXBoIExSCiAgICBBKChCdXkgb25saW5lKSk6OjpzdGVwU3R5bGUgLS0+IEJ7Q2hvb3NlPGJyPnBpY2t1cDxicj5vcHRpb259Ojo6c3RlcFN0eWxlCiAgICBCIC0tIENhcmQgLS0+IEMxW0F0IHBpY2t1cDogSWRlbnRpZnkgPGJyPnRocm91Z2ggcGF5bWVudCBjYXJkXTo6OnN0ZXBTdHlsZQogICAgQiAtLSBQcm9maWxlIC0tPiBDMltBdCBwaWNrdXA6IElkZW50aWZ5IDxicj50aHJvdWdoIHByb2ZpbGVdOjo6c3RlcFN0eWxlCiAgICBDMSAtLT4gRHtEcm9wIG9yPGJyPmFkZCBpdGVtcz99Ojo6c3RlcFN0eWxlCiAgICBDMiAtLT4gRHtEcm9wIG9yPGJyPmFkZCBpdGVtcz99Ojo6c3RlcFN0eWxlCiAgICBEIC0tIFllcyAtLT4gRSgoUmVmdW5kL1BheTxicj5hdCB0ZXJtaW5hbCkpOjo6c3RlcFN0eWxlCiAgICBEIC0tIE5vIC0tPiBGKChFbmQpKTo6OmZpbmFsU3R5bGUKICAgIEUgLS0+IEYoKFJlY2VpdmUgaXRlbXM8YnI+YXQgcGlja3VwKSk6OjpmaW5hbFN0eWxlCgolJSBTdHlsZXMKICAgIGNsYXNzRGVmIHRvcFN0eWxlIGZpbGw6IzAwMCxzdHJva2U6IzAwMCxjb2xvcjojZmZmCiAgICBjbGFzc0RlZiBjYXRlZ29yeVN0eWxlIGZpbGw6IzQ0NCxzdHJva2U6IzMzMyxjb2xvcjojZmZmCiAgICBjbGFzc0RlZiBzdGVwU3R5bGUgZmlsbDojZmZmLHN0cm9rZTojMGFiZjUzLHN0cm9rZS13aWR0aDoycHgsY29sb3I6IzAwMAogICAgY2xhc3NEZWYgZmluYWxTdHlsZSBmaWxsOiMwYWJmNTMsc3Ryb2tlOiMwNzhkM2UsY29sb3I6IzAwMAo=\nConsiderations\nBefore you set up a flow for this use case, there are a couple of points that you must be aware of or make a decision on.\nCapture settings\nYou can capture the online payment immediately, or delay capture until the shopper picks up the items. We recommend capturing immediately. If you delay capture, the authorization can expire before pickup. Authorization validity periods vary per card scheme.\n\n    \n        Reference:\n    \n\n Capture, Authorization validity periods\nShopper attribution\nYou need to decide beforehand on how you will attribute the sale: If an item is purchased online and picked up in-store, is this an in-store sale or an ecommerce sale?\nShopper identification\nIn general, to be able to identify the shopper at pickup based on data that you saved at the time of payment, you must consider data privacy. Always ask for explicit permission when you save the shopper's details for the first time.\n\n    \n        Reference:\n    \n\n Customer data and privacy\nIn this use case, you identify shoppers using card recognition, or using customer profile details. Be aware that you need to implement both methods. The reason for this is that card recognition is only possible if a card or NFC wallet was used to make the ecommerce payment. Card recognition is not possible when the ecommerce payment is made with a QR code wallet (like PayPal), Buy Now Pay Later payment method (like Klarna), or other alternative payment method (like iDEAL\/Wero).\nWe strongly recommend storing the card alias and the Payment Account Reference (PAR) in the shopper's profile. This lets you offer both recognition methods for the same shopper.\n\n    \n        Reference:\n    \n\n Card recognition\nTo use card recognition as a way to identify the shopper at pickup, you must enable receiving shopper identifying data in API responses and webhook messages.\n\n    \n        Reference:\n    \n\n Receive identifiers in webhooks and Receive identifiers in Terminal API responses\nCard acquisition\nCard recognition is based on a \"card acquisition\" request: the shopper presents their card or other payment instrument to the payment terminal, and the response returns details that you can use to look up the shopper in your system. Make sure you are familiar with card acquisition and the shopper identifiers that this operation returns.\n\n    \n        Reference:\n    \n\n Card acquisition\nRefund type\nIf at pickup the shopper does not want an item, you need to issue a (partial) referenced refund. A referenced refund uses the PSP reference to link to the original authorization. You need to decide which API you prefer to use:\n\nTerminal API: You send a reversal request to the terminal. The terminal prints a receipt. You can refund from a different terminal or even a different merchant account.\nCheckout API: You send a refund request to the Checkout API. The terminal does not print a receipt.\n\n\n    \n        Reference:\n    \n\n Terminal API refund of an ecommerce payment or Checkout API refund\nAPI flow\nThere are several Adyen API requests involved in the described shopper journey, as shown in the following diagram.\nCnNlcXVlbmNlRGlhZ3JhbQogICAgcGFydGljaXBhbnQgU2hvcHBlcgogICAgcGFydGljaXBhbnQgRWNvbQogICAgcGFydGljaXBhbnQgRVJQCiAgICBwYXJ0aWNpcGFudCBQT1MKICAgIHBhcnRpY2lwYW50IEFkeWVuCgogICAgU2hvcHBlci0+PkVjb206IEJ1eSBvbmxpbmUKICAgIEVjb20tPj5BZHllbjogQ2hlY2tvdXQgQVBJIHBheW1lbnQgcmVxdWVzdAogICAgQWR5ZW4tPj5FY29tOiBQYXltZW50IHJlc3BvbnNlCiAgICBub3RlIG92ZXIgQWR5ZW4sIEVjb206IEF1dG9tYXRpYyBvciBtYW51YWwgY2FwdHVyZQogICAgU2hvcHBlci0+PkVjb206IENob29zZSBwaWNrdXAgb3B0aW9uOiBjYXJkIG9yIHByb2ZpbGUKICAgIEVjb20tPj5FUlA6IFNhdmUgc2hvcHBlciBkYXRhIGZyb20gY2FyZCBvciBwcm9maWxlCiAgICBTaG9wcGVyLT4+UE9TOiBJZGVudGlmeSBhdCBwaWNrdXAKICAgIG9wdCBJZGVudGlmeSB1c2luZyBjYXJkIHJlY29nbml0aW9uCiAgICAgICAgUE9TLT4+QWR5ZW46IFRlcm1pbmFsIEFQSSBjYXJkIGFjcXVpc2l0aW9uIHJlcXVlc3QKICAgICAgICBBZHllbi0+PlBPUzogQ2FyZCBhY3F1aXNpdGlvbiByZXNwb25zZQogICAgZW5kCiAgICBQT1MtPj5FUlA6IEZpbmQgc2hvcHBlcgogICAgb3B0IFJlZnVuZCBpdGVtcwogICAgICAgIFNob3BwZXItLT4+UE9TOiBEcm9wIGl0ZW1zCiAgICAgICAgYWx0IFJlZmVyZW5jZWQgcmVmdW5kIHZpYSBUZXJtaW5hbCBBUEkKICAgICAgICAgICAgUE9TLT4+QWR5ZW46IFRlcm1pbmFsIEFQSSByZWZ1bmQgcmVxdWVzdAogICAgICAgICAgICBBZHllbi0+PlBPUzogUmVmdW5kIHJlc3BvbnNlCiAgICAgICAgZWxzZSBSZWZlcmVuY2VkIHJlZnVuZCB2aWEgQ2hlY2tvdXQgQVBJCiAgICAgICAgICAgIFBPUy0+PkVjb206IFJlcXVlc3QgcmVmdW5kCiAgICAgICAgICAgIEVjb20tPj5BZHllbjogQ2hlY2tvdXQgQVBJIHJlZnVuZCByZXF1ZXN0CiAgICAgICAgICAgIEFkeWVuLT4+RWNvbTogUmVmdW5kIHJlc3BvbnNlCiAgICAgICAgZW5kCiAgICBlbmQKICAgIG9wdCBTZWxsIGFkZGl0aW9uYWwgaXRlbXMKICAgICAgICBTaG9wcGVyLS0+PlBPUzogQWRkIGl0ZW1zCiAgICAgICAgUE9TLS0+PkFkeWVuOiBUZXJtaW5hbCBBUEkgcGF5bWVudAogICAgICAgIEFkeWVuLS0+PlBPUzogUGF5bWVudCByZXNwb25zZQogICAgICAgIG5vdGUgb3ZlciBBZHllbiwgUE9TOiBBdXRvbWF0aWMgKGRlbGF5ZWQpIGNhcHR1cmUKICAgIGVuZAo=\nThe next section, \"Instructions\", provides more details about the API flow.\nInstructions\nThis section provides high-level instructions focusing on how to use the Adyen APIs and webhooks in the described shopper journey.\n\nThe code samples show the minimally required parameters. You can add more parameters.\n\nOnline purchase\nIf the shopper selected an option on your checkout to pick up their purchase at a (specific) physical location:\n\n\nMake a Checkout API payment request and handle any additional action to complete the authorization.\n\n    \n        Reference:\n    \n\n Online payments &gt; Build your integration.\n\n\n    \n        \n        \n    \n\n\n\n\nIf the resultCode from the API response shows the payment is authorized, present an option on your checkout to let the shopper choose an identification method at the pickup location: through the card they used for the purchase, or through personal details.\n\n\nIf the shopper selected personal details as identification method, present a form to let the shopper enter identifying details such as name, phone number, and address. Securely save the entered details in your system.\n\n\nIf the shopper selected card as identification method, securely save the following details when you get the outcome of the payment in the  AUTHORISATION webhook message:\n\nadditionalData.alias: The card alias uniquely represents the shopper's card number (PAN). This enables you to recognize the card that a shopper is using. You cannot use the card alias for making payments. For NFC wallet transactions, the card alias is not available.\nadditionalData.PaymentAccountReference: The payment account reference (PAR) represents the payment account that the card and\/or NFC wallet is linked to. It solves the issue with the PAN and alias not being available for NFC wallet transactions. Using the PAR, you can recognize the shopper.\n\n\n\nRegardless of identification method, from the AUTHORISATION webhook message also save the following details. You will need these details to find the order in your system. You also need these details in case you want to make a referenced refund request when the shopper returns items at pickup.\n\npspReference: The Adyen-generated unique reference for the transaction.\namount: The currency and value of the transaction.\n\n\n\nIn-store pickup\nWhen the shopper comes to the pickup location:\n\n\nIf you need to identify the shopper based on the card that was used to pay for the online purchase:\n\n\nMake a Terminal API  CardAcquisitionRequest with an empty CardAcquisitionTransaction object.\n\n    \n        Reference:\n    \n\nCard acquisition\n\n\n\n\n\nWhen you receive the  CardAcquisitionResponse, get the following information from the response.AdditionalResponse:\n\nPaymentAccountReference: the PAR, if present.\nalias: the card alias\n\nThe following example shows the AdditionalResponse as a string of key-value pairs concatenated with an ampersand (&amp;). It is possible you receive a Base64-encoded string instead, which you need to Base64 decode first.\n\n\n\n\n\nFinish the card acquisition by making an  EnableServiceRequest to stop the flow.\nConsider including a DisplayOutput object with an explanatory message for the shopper, as shown in the following example.\n\n    \n        Reference:\n    \n\nFinish with a cancellation\n\n\n\n\n\n\n\nIf you need to identify the shopper based on profile data, collect certain details like name and phone number. You can do this in the various ways, for example:\n\nThe shop assistant asks the shopper for the details.\nYou collect the shopper's details on a secondary screen, for instance a tablet.\n\nYou use input requests  to collect the shopper's details on the payment terminal.\n\n\n\n\n\nEnsure your store staff is able to look up the shopper and the purchased items in your system using either the PAR or card alias from the card acquisition response, or the profile data that the shopper provided. Store staff then hands over the items to the shopper.\n\n\nIf the shopper does not want one or more of the purchased items, issue a referenced refund using the Terminal API or the Checkout API.\n \n\n    \n        \n        \n    \n\n\n\n\nIf the shopper has added some items from the store to their basket, make a Terminal API  PaymentRequest.\n\n    \n        Reference:\n    \n\nMake a payment\n\n\nSee also\n\n\n                    Features per industry: Retail omnichannel\n                \n                    Other retail omnichannel use cases\n                \n","type":"page","locale":"en","boost":16,"hierarchy":{"lvl0":"Home","lvl1":"Omnichannel","lvl2":"Retail use cases","lvl3":"Click and collect","lvl4":"Buy online, pick up in store"},"hierarchy_url":{"lvl0":"https:\/\/docs.adyen.com\/","lvl1":"https:\/\/docs.adyen.com\/unified-commerce","lvl2":"https:\/\/docs.adyen.com\/unified-commerce\/retail-use-cases","lvl3":"https:\/\/docs.adyen.com\/unified-commerce\/retail-use-cases\/click-and-collect","lvl4":"\/unified-commerce\/retail-use-cases\/click-and-collect\/c-and-c-add-return"},"levels":5,"category":"Omnichannel","category_color":"green","tags":["online,","store"]}}
