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