Configuration
Install Stripe Terminal and synchronize the native Capacitor projects.
npm install @capacitor-community/stripe-terminal
npx cap sync
The plugin is @capacitor-community/stripe-terminal v8.2.0. Official demos:
| Requirement | Minimum |
|---|---|
| Capacitor | 8 |
| iOS | 15.0 |
Android minSdkVersion |
26 |
Platform and connection types
discoverReaders takes a TerminalConnectTypes value. Support is not the same on every platform.
TerminalConnectTypes |
Web | iOS | Android |
|---|---|---|---|
Internet |
Yes — the only supported type | Yes | Yes |
Bluetooth |
No | Yes | Yes |
TapToPay |
No | Yes | Yes |
Usb |
No | Unimplemented | Yes |
HandOff |
No | Unimplemented | Yes (Apps on Devices) |
Simulated |
No | Unimplemented as a discover type | Treated as Bluetooth discovery |
On every platform, pass isTest: true to initialize when you want simulated readers for a supported connection type. Do not rely on TerminalConnectTypes.Simulated on iOS or web; use Internet, Bluetooth, or TapToPay with isTest: true instead.
Web discoverReaders rejects with an unavailable error for any type other than Internet.
Platform-only APIs
| API | Web | iOS | Android |
|---|---|---|---|
setTapToPayUxConfiguration |
No-op (logs only) | Unimplemented | Yes — call after initialize, before connectReader |
isTapToPayAccountLinked |
Unavailable (throws) | Yes — iOS 16.4+, after initialize |
Unimplemented |
See Tap to Pay for the setup sequence and limitations.
Web no-op and unsupported lifecycle methods
These methods exist on the plugin interface but do not drive the Stripe Terminal JS SDK on web:
cancelDiscoverReaders— no-opsetSimulatorConfiguration— no-opinstallAvailableUpdate— no-opcancelInstallUpdate— no-oprebootReader— no-opcancelReaderReconnection— no-opsetTapToPayUxConfiguration— no-op
isTapToPayAccountLinked throws unavailable on web.
Internet readers on web still support initialize, discoverReaders, connectReader, getConnectedReader, disconnectReader, collectPaymentMethod, cancelCollectPaymentMethod, confirmPaymentIntent, setReaderDisplay, clearReaderDisplay, setConnectionToken, and the connection / payment status listeners.
Web configuration
No additional steps are necessary. Only Internet readers are available.
iOS configuration
No additional steps are necessary for the plugin. USB, HandOff, and setTapToPayUxConfiguration are unimplemented on iOS.
Android configuration
Add permissions to your android/app/src/main/AndroidManifest.xml file:
+ <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
+ <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
+ <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
+ <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
+ <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
+ <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
discoverReaders rejects when ACCESS_FINE_LOCATION has not been granted at runtime.
And update minSdkVersion to 26 in your android/variables.gradle file:
ext {
- minSdkVersion = 24
+ minSdkVersion = 26
If you are developing apps for Stripe Android devices (for example Stripe Reader S700) and using TerminalConnectTypes.HandOff, follow Stripe's client-side setup guide.