Search

Are you looking for test card numbers?

Would you like to contact support?

Point-of-sale icon

Mail Order/Telephone Order (MOTO)

Pass a tender option to trigger a MOTO transaction and optionally add an AVS check.

A Mail Order/Telephone Order (MOTO) transaction is a card-not-present transaction where the shopper provides you with their order and payment details by regular mail (not email), fax, or telephone. By passing on these data to you, the cardholder gives you permission to process the transaction. When you do a MOTO transaction, the payment terminal prompts you to enter the shopper's card number and CVC code. The result of checking the CVC code is shown in your Customer Area > Transactions > Payments.

MOTO payments are considered insecure. There is no liability shift and you are fully liable for fraud chargebacks related to MOTO payments.

Delayed capture

If you want to accept MOTO transactions, you should configure a capture delay. This gives you time to cancel the authorisation before the payment is captured, in case you have second thoughts about the transaction.

Be aware that when you cancel the authorisation for a MOTO transaction, the transaction status changes to SentForRefund.

Address verification service

To reduce the risk of fraud, you have the option to add an address verification service (AVS) check to the MOTO payment flow. With an AVS check, the payment terminal prompts you to enter the shopper's postal code (zip code) and house number. The card issuer validates the data you entered against the cardholder's billing address, sends us the result, and declines or authorises the payment.

It is possible that issuers authorise a payment even though the entered data don't fully match. To enable you to verify this and decide whether to go ahead with the transaction, you receive the result of the AVS check in the payment response and in your Customer Area > Transactions > Payments. If you configured a capture delay, you can cancel the authorisation if necessary.

AVS is supported by American Express, Discover, Mastercard, and Visa. In the US, UK, and Canada, all other issuers also support it.

AVS checks are possible on current payment terminal models (not on the legacy devices).

AVS on standalone terminals

When you use MOTO with AVS on a standalone terminal, this is what happens:

  • The issuer declines or authorises the payment.
  • If the issuer didn't decline the payment, the terminal shows the result of the AVS check and prompts you to Approve or Decline the transaction.

If you have second thoughts about the transaction and select Decline, you still need to cancel the authorisation. Otherwise, the payment is captured automatically because the issuer already authorised it. To be able to cancel authorisations, you need to configure a capture delay.

Enable MOTO and AVS

  1. Contact our POS Support Team to enable MOTO for the account that you want to use for processing MOTO payments.
    If you want to add an AVS check to the flow, ask our POS Support team to enable that too.

  2. Configure the maximum amount that the terminal allows for a MOTO transaction:

    1. Log in to your Customer Area.
    2. Go to Point of sale > Terminal settings (or select a specific terminal) and select Payment features.
    3. Enter the MOTO max amount.
    4. Select Save.

  3. If you are adding an AVS check to the MOTO flow, make sure that you receive the AVS response:

    1. In your Customer Area go to Account > API URLs and response.
    2. On the Additional data settings tab, select Acquirer result and Raw acquirer result.
    3. Select Save configuration.

  4. Configure a capture delay.

Make a MOTO payment

For a MOTO payment, you need to trigger the payment terminal to prompt you to enter the card details:

  1. Make a PaymentRequest that contains a SaletoAcquirerData field with the MOTO tender option specified in one of the following formats:

    • Option 1: A JSON object converted to a Base64 encoded string.
      Encode {"tenderOption": "MOTO"} to Base64, and pass the resulting string:
      "SaleToAcquirerData": "eyJ0ZW5kZXJPcHRpb24iOiAiTU9UTyJ9"

    • Option 2: A key-value pair:
      "SaleToAcquirerData": "tenderOption=MOTO"

    The format that you use here, will also be the format of the AdditionalResponse that you receive.

    If there are more tender options or other data elements that you need to pass in the SaleToAcquirerData field, refer to Add information to a payment.

    {
      "SaleToPOIRequest": {
        "PaymentRequest": {
          "SaleData": {
            "SaleTransactionID": {
              "TransactionID": "5748",
              "TimeStamp": "2020-04-15T15:45:04.114Z"
            },
            "SaleToAcquirerData": "tenderOption=MOTO"
          },
          "PaymentTransaction": {
            "AmountsReq": {
              "Currency": "USD",
              "RequestedAmount": 17.50
            }
          }
        },
        "MessageHeader": {
          "ProtocolVersion": "3.0",
          "MessageClass": "Service",
          "MessageCategory": "Payment",
          "MessageType": "Request",
          "ServiceID": "0110123015",
          "SaleID": "POSSystemID12345",
          "POIID": "M400-260193322"
        }
      }
    }
    String serviceID = "YOUR_UNIQUE_ATTEMPT_ID";
    String saleID = "YOUR_CASH_REGISTER_ID";
    String POIID = "YOUR_TERMINAL_ID";
    String transactionID = "YOUR_UNIQUE_TRANSACTION_ID";
    
    SaleToPOIRequest saleToPOIRequest = new SaleToPOIRequest();
    MessageHeader messageHeader = new MessageHeader();
    messageHeader.setProtocolVersion("3.0");
    messageHeader.setMessageClass( MessageClassType.SERVICE );
    messageHeader.setMessageCategory( MessageCategoryType.PAYMENT );
    messageHeader.setMessageType( MessageType.REQUEST );
    messageHeader.setServiceID(serviceID);
    messageHeader.setSaleID(saleID);
    messageHeader.setPOIID(POIID);
    saleToPOIRequest.setMessageHeader(messageHeader);
    
    PaymentRequest paymentRequest = new PaymentRequest();
    SaleData saleData = new SaleData();
    TransactionIdentification saleTransactionID = new TransactionIdentification();
    saleTransactionID.setTransactionID(transactionID);
    saleTransactionID.setTimeStamp(DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar()));
    saleData.setSaleTransactionID(saleTransactionID);
    saleData.setSaleToAcquirerData("tenderOption=MOTO");
    paymentRequest.setSaleData(saleData);
    
    PaymentTransaction paymentTransaction = new PaymentTransaction();
    AmountsReq amountsReq = new AmountsReq();
    amountsReq.setCurrency("EUR");
    amountsReq.setRequestedAmount( BigDecimal.valueOf(17.50) );
    paymentTransaction.setAmountsReq(amountsReq);
    paymentRequest.setPaymentTransaction(paymentTransaction);
    saleToPOIRequest.setPaymentRequest(paymentRequest);
    terminalAPIRequest.setSaleToPOIRequest(saleToPOIRequest);
  2. When prompted, enter the shopper's card number and CVC code on the payment terminal.
  3. If you enabled AVS, enter the shopper's postal code (zip code) and house number on the payment terminal.
  4. Note that the payment response contains:

    • EntryMode: Keyed.
    • AdditionalResponse: Depending on the format that you used in the SaleToAcquirerData field, this is either a Base64-encoded string that you need to decode to get a JSON object, or a string of key-value pairs separated by &. This includes posEntryMode=MKE.
      If you enabled AVS, it also includes avsResult and avsResultRaw.
    {
       "SaleToPOIResponse":{
          "PaymentResponse":{...},
             "POIData":{...},
             "SaleData":{...},
             "PaymentReceipt":[...],
             "PaymentResult":{
                "OnlineFlag":true,
                "PaymentAcquirerData":{...},
                   "MerchantID":"YOUR_MERCHANT_ACCOUNT"
                },
                "PaymentInstrumentData":{
                   "CardData":{
                      "EntryMode":[
                         "Keyed"
                      ],
                      "PaymentBrand":"amex",
                      "MaskedPan":"374101 **** 0018",
                      "SensitiveCardData":{
                         "ExpiryDate":"0330"
                      }
                   },
                   "PaymentInstrumentType":"Card"
                },
                "AmountsResp":{
                   "AuthorizedAmount":17.5,
                   "Currency":"EUR"
                }
             },
             "Response":{
                "Result":"Success",
                "AdditionalResponse":"tid=46403161&...avsResult=1%20Address%20matches%2c%20postal%20code%20doesn%27t&...avsResultRaw=1&...posEntryMode=MKE&acquirerReference=7F66BQ5UHAH&issuerCountry=GB&cardScheme=amex&cardBin=374101&posAuthAmountValue=1750"
             }
          },
          "MessageHeader":{...}
       }
    }
  5. If you enabled AVS, check the avsResult and avsResultRaw against our list of AVS responses for point of sale. It is possible the issuer authorised the payment even though the AVS check was inconclusive.
  6. When the issuer authorised the payment, decide whether you trust the transaction. If not, cancel the authorisation. If you don't cancel the transaction, the payment will be captured.

Testing MOTO payments

To test a MOTO payment with an AVS check:

  1. Make a MOTO payment as described above.
  2. When prompted to enter card and address details on the payment terminal, use the details for one of the test cards listed under Test Address Verification System (AVS). These test cards can be used for both online and point-of-sale AVS tests.

See also