Accept in-person payments for a direct retail business
Learn how to accept card payments for your in-person business.
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 the related setting/the related setting using a server-driven integration. The steps in this guide use this reader and integration combination.
To accept in-person payments without building a server-driven integration, use Terminal ready-made apps: standalone mode Public preview on a Stripe reader, or the Stripe Terminal app Private preview on a supported iPhone or Android device. The rest of this guide covers building a custom server-driven integration.
Note
If you don’t have a reader yet, you can build and test your server-driven integration in a sandbox using a simulated reader. You only need a physical reader when you’re ready to test hardware connectivity and accept live payments.
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 the related setting/the related setting reader
- (Optional) A test card for testing
Create a Stripe account
Before integrating with Stripe, you must create a Stripe account.
- Create an account by entering your email address, full name and country, and creating a password.
- Fill out your business profile.
- In the Dashboard, click Verify your email . Stripe sends a verification email to your email address.
- Verify your email address.
After creating your account, get your API keys from the Stripe Dashboard under Developers > API Keys. 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 to test your integration.
- In the Dashboard, go to Terminal > Overview .
- In the Hardware orders section, click Shop .
- Select I want to build a new integration using Stripe APIs and click Continue .
- Select Stripe Reader the related setting or Stripe Reader the related setting and add it to your cart.
- 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 using either Ethernet (dock required) or WiFi. Make sure you meet the connectivity requirements.
Register your reader
After you find the serial number, register the reader in the Dashboard.
- In the Dashboard, go to the Hardware orders page and select your reader to find the reader’s serial number.
- On the Readers page, click Register reader .
- Enter the serial number and click Next . To register multiple devices at one time, you can enter multiple serial numbers, separated by commas.
- Optionally, choose a name for the reader.
- If you already created a location, select the reader’s new location. Otherwise, create a location that represents your physical operating location by clicking + Add new .
- 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 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, an object representing a single payment session.
- Create a PaymentIntent. You can define whether to automatically or manually capture your payments. Command Line Select a language cURL Stripe CLI Ruby Python PHP Java Node.js Go.NET No results
curl https://api.stripe.com/v1/payment_intents \ -u "sk_test_Ou1w6LVt3zmVipDVJsvMeQsc:" \ -d currency=usd \ -d "payment_method_types[]=card_present" \ -d capture_method=manual \ -d amount=1000 - Process the payment. Authorisation on the customer’s card takes place when the reader processes the payment. Command Line Select a language cURL Stripe CLI Ruby Python PHP Java Node.js Go.NET No results
curl https://api.stripe.com/v1/terminal/readers/tmr_xxx/process_payment_intent \ -u "sk_test_Ou1w6LVt3zmVipDVJsvMeQsc:" \ -d payment_intent=pi_xxx - Confirm the payment was collected and authorised by inspecting the webhook events
terminal.reader.action_succeededandterminal.reader.action_failed. - (Optional) Capture the PaymentIntent.
Command Line
Select a language
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
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. We also support physical test cards from providers, such as B2.
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. 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 the related setting succeeds; a payment processed for the amount _10.05 the related setting is declined.
Note
Some currencies have 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 the related setting.
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 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 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.
Note
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 in the Dashboard. You can’t use the Stripe-branded physical test card as an eftpos card.
You can use the same test amounts you use for testing card_present payments. Unless stated otherwise, use the PIN 1234 when prompted.
Go live
- In the Dashboard, open your Account settings .
- Enter your business type, tax details, business details, personal verification information and customer-facing information (for example, a statement descriptor).
- Add bank details to confirm where to pay out your money.
- Set up two-step authentication to secure your account.
- You can optionally add automatic tax collection or revenue-based climate donations.
- Review the information you entered and click Agree and submit .
- After you activate your profile, Stripe updates you from sandbox mode to live mode.
Learn more about setting up your Stripe account.
Before accepting real payments, you must also:
- Create a location in live mode.
- Re-register your reader with the live mode location.
Next steps
- Create physical or digital receipts for your customers
- Collect tips on the reader or on a receipt.