# 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, 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 cart, 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 "<>:" \ -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). Authorization 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 "<>:" \ -d payment_intent=pi_xxx ``` 1. [Confirm the payment was collected and authorized](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 "<>:" ``` ## 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 [activating your Stripe account](https://docs.stripe.com/get-started/account/activate.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.