Recognise members at checkout
Look up the member from the card before the payment, give the discount, then pay with a single tap.
Read the card with a CardAcquisition request before the payment. If the card belongs to a member, the response has the member number. The Payment then reuses the card, so the customer taps only once.
Requirements
| Requirement | Description |
|---|---|
| Set-up | ID lookup is turned on for your terminals. See Set up ID lookup |
| Before you start | Your ECR is connected and logged in. See Connect your ECR |
| Messages | CardAcquisition · Payment · EnableService |
The flow
sequenceDiagram
participant P as Your POS
participant T as Terminal
participant L as Your loyalty program
P->>T: CardAcquisition request (with amount)
Note over T: Customer taps card, terminal looks it up
T-->>P: CardAcquisition response
alt Member found
P->>L: Get benefits for the member number
L-->>P: Discount or points
P->>T: Payment with CardAcquisitionReference
else No member
P->>P: Offer sign-up or continue without
P->>T: Payment, or EnableService (AbortTransaction)
end
1. Read the card
Send CardAcquisition. Include TotalAmount and PaymentType = Normal when a payment follows. To only identify the customer, leave out the amount and PaymentType.
Example CardAcquisition request
{
"SaleToPOIRequest": {
"MessageHeader": {
"ProtocolVersion": "3.1",
"MessageClass": "Service",
"MessageCategory": "CardAcquisition",
"MessageType": "Request",
"ServiceID": "2",
"SaleID": "ECR123",
"POIID": "AT12345"
},
"CardAcquisitionRequest": {
"SaleData": {
"SaleTransactionID": {
"TransactionID": "12345678",
"TimeStamp": "2026-10-13T13:30:00+02:00"
}
},
"CardAcquisitionTransaction": {
"TotalAmount": 125.00,
"PaymentType": "Normal"
}
}
}
}2. Read the result
Check that Result is Success, then look for LoyaltyAccount:
| What you get | What it means | What the POS does |
|---|---|---|
LoyaltyAccount with your program | The card belongs to a member | Read LoyaltyBrand and LoyaltyID, get the benefits |
LoyaltyAccount with a partner's program | The customer is a member of a partner's program (cross loyalty) | Apply the partner benefit, if you have one |
| Temporary identity | The customer signed up on the terminal but hasn't finished in your loyalty program | Remind the customer to finish signing up |
No LoyaltyAccount | The card isn't linked to a member. The customer may still be a member with another card | Offer sign-up, link the card, or continue without. See Enrol members at the terminal |
Example CardAcquisition response with a member
{
"SaleToPOIResponse": {
"MessageHeader": {
"ProtocolVersion": "3.1",
"MessageClass": "Service",
"MessageCategory": "CardAcquisition",
"MessageType": "Response",
"ServiceID": "2",
"SaleID": "ECR123",
"POIID": "AT12345"
},
"CardAcquisitionResponse": {
"Response": {
"Result": "Success",
"AeResponseCode": "000"
},
"POIData": {
"POITransactionID": {
"TransactionID": "87654321",
"TimeStamp": "2026-10-13T13:30:03+02:00"
}
},
"PaymentInstrumentData": {
"PaymentInstrumentType": "Card",
"CardData": {
"PaymentBrand": "MASTERCARD",
"MaskedPAN": "540481******1761"
}
},
"LoyaltyAccount": [
{
"LoyaltyBrand": "PARTNER_REWARDS",
"LoyaltyAccountID": {
"LoyaltyID": "MEMBER123456"
}
}
]
}
}
}3. Pay with a single tap
- Get the benefits from your loyalty program and work out the final amount.
- Send Payment. Copy
POITransactionIDfrom the CardAcquisition response intoCardAcquisitionReference. - The amount must not be higher than in the CardAcquisition request, and
PaymentTypemust be the same.
Don't pay after an abortIf the card acquisition was aborted before the card was read (STOP pressed, timeout or Abort from the ECR), the response has
ErrorCondition=Aborted. Don't send the payment automatically: the cashier or customer wanted to stop.
4. Always finish or abort
If no Payment or BalanceInquiry follows, send EnableService with TransactionAction = AbortTransaction. Otherwise the terminal keeps the card session open.
Next
Offer sign-up when no member is found: Enrol members at the terminal.
Updated 5 days ago