← Stripe
Guide

How to take payments with Tap to Pay on iPhone using Stripe Terminal

By Alastair Murdoch Last reviewed Tested on Stripe Terminal for React Native (beta) · React Native 0.78 · iOS and Android
In short

Tap to Pay turns a merchant's iPhone, or an NFC Android phone, into a contactless card reader through Stripe Terminal. Your app needs Apple's approval, each merchant needs their own Stripe location so payments land with the right business, and payments are created on your server with your fee. Most of the work is handling phones that can't tap.

£0.30
Minimum card payment
2
Platforms (iPhone and Android) from one app
Nov 2023
First shipped

Before you start

  • ✓Apple's approval to use Tap to Pay on iPhone in your app
  • ✓A Stripe Terminal location for each merchant
  • ✓A server that authorises each phone to act as a reader
  • ✓A supported iPhone (and NFC-capable Android phones if you target both)
  • ✓A Bluetooth card reader for fallback and testing

Getting the app approved and set up

We first shipped Tap to Pay in November 2023 on a payments platform we built, from one app for iPhone and Android.

  • Apple must grant your app permission (an entitlement) to use Tap to Pay on iPhone.
  • The app must explain why it needs location (Stripe Terminal requires it) and Bluetooth (for external readers).
  • Android needs NFC permission and NFC switched on.

Tying each phone to the right merchant

Every Stripe Terminal reader, phones included, belongs to a location. We create one per merchant and only authorise a phone for the user's own location, with a clear error rather than a default if there isn't one: the wrong location means the wrong merchant gets paid.

Connecting and taking payment

The phone connects as a reader on the merchant's behalf and reconnects if dropped. Your server creates each payment with the merchant as recipient and your fee, as in our Stripe Connect guide. We set a £0.30 minimum and handle amounts in pence.

Handling the device, not just the payment

  • Check NFC whenever the app resumes, not just at launch.
  • Offer a Bluetooth reader when the phone can't tap.
  • If a reader's update fails for low battery, tell the user to charge it.

What usually goes wrong

From our own projects, not the manual.

Only one reader search can run at a time

Searching for Bluetooth readers while the phone's own reader search was still running failed. Cancel the phone search first, and treat an 'already completed' response to the cancel as success.

Error codes differ between iOS and Android

The same cancel or decline comes back as different codes on each platform, for example Canceled on one and USER_ERROR.CANCELED on the other. Map both before acting on them.

Some phones can't do Tap to Pay

Unsupported phones and NFC switched off both fail at the point of connecting. Detect it, explain it, and offer a Bluetooth reader instead, checking NFC again when the app resumes.

Tap to Pay costs more to run

Stripe Terminal adds its own per-transaction cost, so the Tap to Pay channel needed a higher surcharge than online payments. Price each channel on its real cost.

The React Native upgrade broke the build

A newer React Native combined with the latest version of a navigation library failed to build. Pinning both to compatible versions fixed it. Upgrade the Stripe Terminal library, React Native and other native parts together, not one at a time.

Do it yourself, or get help?

If you already have a React Native app and a Stripe Connect back end, adding Tap to Pay is mostly configuration plus careful device handling. If you're starting from scratch, need platform fees on in-person payments, or have to support both Tap to Pay and external readers, get help: most of the work is in the edge cases, not the happy path.

Get a developer on it
FAQ

Common questions

Do I need a card reader for Tap to Pay on iPhone?

No. The iPhone itself becomes a contactless reader through Stripe Terminal. Apple still has to approve your app for it, and a Bluetooth reader is a useful fallback.

Does Tap to Pay work with Stripe Connect?

Yes. The phone connects on behalf of the merchant's account, and your server creates each payment with the merchant as recipient and your platform fee added.

Can one app do Tap to Pay on iPhone and Android?

Yes. With Stripe Terminal's React Native library, the same code turns the phone into a reader on both. Only the platform set-up and some error codes differ.

What's the minimum Tap to Pay payment?

Card minimums apply. We enforce £0.30 in the app and handle every amount in pence.

Want Tap to Pay in your app?

Tell us about your app and your merchants. We'll add in-person payments on Stripe Terminal, fees and all.