Skip to content

Testing

Test your in-person payments integration with a sandbox merchant account and amounts that simulate successful and declined payments.

Use a sandbox merchant account to test your in-person payments integration without moving real money. The scenarios below use a SumUp card reader with the Android SDK, iOS SDK, or Cloud API.

If you use the Cloud API, you can also test without a card reader using Virtual Solo.

For online payments, use the online payment testing guide.

  1. Create a sandbox merchant account.
  2. Authenticate with that sandbox merchant account in your integration. For Cloud API, use credentials for the sandbox merchant and pair the reader with that merchant.
  3. Connect a supported reader and make sure it has an internet connection through your phone or its own connection, depending on the integration.
  4. Start a payment and tap or insert a supported physical debit or credit card. Follow any instructions on the reader, including PIN entry when requested.

You do not need the test card numbers used for online payments. The payment amount determines the simulated result once the card has been read and the payment is submitted. Card-reading and device errors can still prevent the payment from reaching that point.

Start a payment for 10.00 EUR and complete the steps on the reader.

Verify that your integration receives a successful payment result and matches it to the correct order. For Cloud API, wait for the transaction result: the initial checkout response only confirms that the checkout was accepted.

Start a payment for 11.00 EUR to simulate a declined payment. To test a specific decline reason, use an amount from the table below. For example, 42.51 EUR simulates insufficient funds.

Only the listed 42.xx amounts trigger these declines. Other amounts starting with 42 do not necessarily fail.

Amount (EUR) Simulated reason
11.00 Payment declined
42.01 Refer to the card issuer
42.03 Invalid merchant
42.05 Payment declined
42.06 Processing error
42.12 Invalid transaction
42.13 Invalid amount
42.14 Invalid card number
42.41 Lost card
42.43 Stolen card
42.51 Insufficient funds
42.54 Expired card
42.55 Incorrect PIN
42.60 Retry PIN entry
42.61 Card usage limit exceeded
42.65 Card usage frequency limit exceeded
42.75 PIN attempt limit exceeded
42.76 Additional authentication required
42.78 Retry by inserting the card
42.82 Invalid card security code
42.91 Processing timeout
42.92 Unexpected processing response
42.96 System malfunction

These amounts simulate the payment result. For example, 42.55 EUR simulates an incorrect-PIN response without requiring you to enter an incorrect PIN, and 42.91 EUR simulates a timeout response without disconnecting the reader.

Your SDK, API, or reader may return a more general failure or show different wording. Handle the payment result returned by your integration rather than matching the message displayed on the reader. For Cloud API, see failure reasons.

The examples above use EUR, which has two decimal places. Use the amount format required by your integration. For example, a Cloud API checkout for 42.51 EUR uses this total_amount:

{
"total_amount": {
"currency": "EUR",
"minor_unit": 2,
"value": 4251
}
}
  • A declined payment leaves the order unpaid and does not trigger fulfilment.
  • Your app shows a clear failure message and lets the customer retry or choose another payment method.
  • Each retry uses a new transaction reference, and each result is matched to the correct payment attempt.
  • With Cloud API, your integration waits for the final transaction result before updating the order.

Also test customer cancellation, a disconnected reader, and loss of connectivity separately. The special amounts above do not reproduce these device or connection conditions.

For store-and-forward payments, follow the separate offline transaction testing guidance.