# Accept in-person payments for a direct retail business

Learn how to accept card payments for your in-person business.

This guide describes how to set up your Stripe integration to accept payments with an in-person point of sale (POS) system.

For general in-person payments, we recommend [Stripe Reader S700/S710](https://docs.stripe.com/terminal/payments/setup-reader/stripe-reader-s700-s710.md) using a [server-driven integration](https://docs.stripe.com/terminal/payments/setup-integration.md?terminal-sdk-platform=server-driven). The steps in this guide use this reader and integration combination.

## Before you begin

A server-driven integration uses the Stripe API to communicate directly with smart readers. Your back-end server makes API calls to create payments and control the reader.

To integrate, you need:

- A Stripe account
- A back-end server that can make requests to the Stripe API
- A Stripe S700/S710 reader
- (Optional) A test card for testing
![Smart reader integration architecture](https://b.stripecdn.com/docs-statics-srv/assets/smart-reader-architecture.9adb3e895895b6513b9188ed74a9315e.png)

## Create a Stripe account

Before integrating with Stripe, you must create a Stripe account.

1. [Create an account](https://dashboard.stripe.com/register) by entering your email address, full name and country, and creating a password.
1. Fill out your business profile.
1. In the Dashboard, click **Verify your email**. Stripe sends a verification email to your email address.
1. Verify your email address.

After creating your account, get your [API keys](https://docs.stripe.com/keys.md) from the Stripe Dashboard under **Developers** > [API Keys](https://dashboard.stripe.com/apikeys). You need your API key to authenticate requests from your back-end server.

## Order your reader

Order a card reader from the Stripe Dashboard. You can also order a [physical test card](https://docs.stripe.com/get-started/use-cases/in-person-payments.md#testing) to test your integration.

1. In the Dashboard, go to **Terminal** > [Overview](https://dashboard.stripe.com/terminal).
1. In the Hardware orders section, click **Shop**.
1. Select **I want to build a new integration using Stripe APIs** and click **Continue**.
1. Select **Stripe Reader S700** or **Stripe Reader S710** and add it to your cart.
1. Select your basket, then click **Check out** to complete your order.

## Set up your reader

After you receive your card reader, you need to register it at a location. Registering a reader using its serial number lets you use the reader immediately after you unbox it. This method also allows you to re-register the reader without having the physical reader to generate a pairing code.

After unboxing your reader, you also need to [connect the reader to the internet](https://docs.stripe.com/terminal/payments/setup-reader/stripe-reader-s700-s710.md#connect-the-reader-to-the-internet) using either Ethernet (dock required) or WiFi. Make sure you meet the [connectivity requirements](https://docs.stripe.com/terminal/network-requirements.md#smart-readers).

### Register your reader

After you find the serial number, register the reader in the Dashboard.

1. In the Dashboard, go to the [Hardware orders](https://dashboard.stripe.com/terminal/hardware_orders) page and select your reader to find the reader’s serial number.
1. On the [Readers](https://dashboard.stripe.com/terminal/readers) page, click **Register reader**.
1. Enter the serial number and click **Next**. To register multiple devices at one time, you can enter multiple serial numbers, separated by commas.
1. Optionally, choose a name for the reader.
1. If you already created a location, select the reader’s new location. Otherwise, create a [location](https://docs.stripe.com/terminal/fleet/locations-and-zones.md) that represents your physical operating location by clicking **+ Add new**.
1. Click **Register** to finish registering your reader.

After you register your reader, it’s ready to use with the server-driven integration. You can later retrieve reader IDs using the [list readers](https://docs.stripe.com/api/terminal/readers/list.md?api-version=2025-09-30.preview&rds=1) endpoint and then filtering on the location or by the reader’s serial ID. Doing so tells you which reader to send transactions to from your point of sale.

## Create the payment flow

Collecting payments with Stripe Terminal requires you to create a payment flow in your application. Use the Stripe Terminal SDK to create and update a [PaymentIntent](https://docs.stripe.com/api/payment_intents.md?api-version=2025-09-30.preview&rds=1), an object representing a single payment session.

1. [Create a PaymentIntent](https://docs.stripe.com/terminal/payments/collect-card-payment.md?terminal-sdk-platform=server-driven#create-payment). You can define whether to [automatically](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-capture_method) or [manually](https://docs.stripe.com/payments/place-a-hold-on-a-payment-method.md) capture your payments.

   ```curl
   curl https://api.stripe.com/v1/payment_intents \
     -u "<<YOUR_SECRET_KEY>>:" \
     -d currency=usd \
     -d "payment_method_types[]=card_present" \
     -d capture_method=manual \
     -d amount=1000
   ```

1. [Process the payment](https://docs.stripe.com/terminal/payments/collect-card-payment.md?terminal-sdk-platform=server-driven#process-payment). Authorisation on the customer’s card takes place when the reader processes the payment.

   ```curl
   curl https://api.stripe.com/v1/terminal/readers/tmr_xxx/process_payment_intent \
     -u "<<YOUR_SECRET_KEY>>:" \
     -d payment_intent=pi_xxx
   ```

1. [Confirm the payment was collected and authorised](https://docs.stripe.com/webhooks.md) by inspecting the webhook events `terminal.reader.action_succeeded` and `terminal.reader.action_failed`.

1. (Optional) [Capture the PaymentIntent](https://docs.stripe.com/terminal/payments/collect-card-payment.md?terminal-sdk-platform=server-driven#capture-payment).

```curl
curl -X POST https://api.stripe.com/v1/payment_intents/pi_xxx/capture \
  -u "<<YOUR_SECRET_KEY>>:"
```

## Test your integration

## Physical test cards

Test payments with your Stripe Terminal reader using a physical test card. You can purchase readers and physical test cards from the Terminal tab in the [Stripe Dashboard](https://dashboard.stripe.com/terminal/shop). We also support physical test cards from providers, such as [B2](https://b2ps.com/product-category/b2-payment-testing-products/).

This physical test card supports both chip entry and contactless payments. It only works with Stripe’s pre-certified readers and only against the Stripe API in a [sandbox](https://docs.stripe.com/sandboxes.md). If you attempt to use your physical test card in live mode, the Stripe API returns an error. Unless stated otherwise, use the PIN `1234` when prompted.

When creating payments using a physical test card, use amounts ending in the following decimal values to produce specific responses:

| Decimal | Result                                                                                                                                                                                                                                                                                  |
| ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **00**  | Payment is approved.                                                                                                                                                                                                                                                                    |
| **01**  | Payment is declined with a `call_issuer` code.                                                                                                                                                                                                                                          |
| **02**  | When using readers featuring a cardholder-facing screen, insert (or tap, if supported) the test card. If the card requires a PIN, the payment declines with `offline_pin_required` and requests PIN entry if the reader supports chip entry. Enter `1234` to complete the test payment. |
| **03**  | When using readers featuring a cardholder-facing screen, insert (or tap, if supported) the test card. If the card requires a PIN, the payment declines with `online_or_offline_pin_required` and requests PIN entry. Enter any 4-digit PIN to complete the test payment.                |
| **05**  | Payment is declined with an `generic_decline` code.                                                                                                                                                                                                                                     |
| **55**  | Payment is declined with an `incorrect_pin` code.                                                                                                                                                                                                                                       |
| **65**  | Payment is declined with an `withdrawal_count_limit_exceeded` code.                                                                                                                                                                                                                     |
| **75**  | Payment is declined with an `pin_try_exceeded` code.                                                                                                                                                                                                                                    |

For example, a payment processed using a physical test card for the amount *25.00 USD* succeeds; a payment processed for the amount *10.05 USD* is declined.

> Some currencies have [zero decimal](https://docs.stripe.com/currencies.md#zero-decimal). For those currencies, use the two decimal digits in the table above as the rightmost two digits.
> 
> For example, to get your payment declined with `generic_decline` code, you need an amount of *105 JPY*.

### Interac test cards (Canada only)

To test your Interac integration, you can use the simulated `interac` test card or an *Interac physical test card*. You can order it from the [Terminal hardware shop](https://dashboard.stripe.com/terminal/shop) in the Dashboard. You can’t use the Stripe-branded physical test card as an Interac card.

The Interac test card works for both `interac_present` payments and `interac_present` refunds. You can use the same [test amounts](https://docs.stripe.com/terminal/references/testing.md#physical-test-cards) you use for testing `card_present` payments. Unless stated otherwise, use the PIN `1234` when prompted. To test a declined refund, create a partial refund with an amount ending with the following decimal values: `01`, `05`, `55`, `65`, or `75`.

> The Interac test card doesn’t support contactless payments.

### eftpos test cards (Australia only)

To test your eftpos integration, you can use the simulated `eftpos` test card or an *eftpos physical test card*. You can order it from the [Terminal hardware shop](https://dashboard.stripe.com/terminal/shop) in the Dashboard. You can’t use the Stripe-branded physical test card as an `eftpos` card.

You can use the same [test amounts](https://docs.stripe.com/terminal/references/testing.md#physical-test-cards) you use for testing `card_present` payments. Unless stated otherwise, use the PIN `1234` when prompted.

## Go live

1. In the Dashboard, open your [Account settings](https://dashboard.stripe.com/account/onboarding).
1. Enter your business type, tax details, business details, personal verification information and customer-facing information (for example, a statement descriptor).
1. Add bank details to confirm where to pay out your money.
1. Set up two-step authentication to secure your account.
1. You can optionally add automatic tax collection or revenue-based climate donations.
1. Review the information you entered and click **Agree and submit**.
1. After you activate your profile, Stripe updates you from sandbox mode to live mode.

Learn more about [setting up your Stripe account](https://docs.stripe.com/get-started/account/set-up.md).

Before accepting real payments, you must also:

1. Create a location in live mode.
1. Re-register your reader with the live mode location.

## Next steps

After setting up your integration, we recommend you implement the following features:

- [Create physical or digital receipts](https://docs.stripe.com/terminal/features/receipts.md) for your customers.
- [Collect tips](https://docs.stripe.com/terminal/features/collecting-tips/overview.md) on the reader or on a receipt.
