Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/stripe/stripe-terminal-react-native/llms.txt

Use this file to discover all available pages before exploring further.

Stripe Terminal enables you to build your own in-person checkout to accept payments in the physical world. Built on Stripe’s payments network, Terminal helps you unify your online and offline payment channels. With the Stripe Terminal React Native SDK, you can connect to pre-certified card readers from your React Native app and drive a customized in-store checkout flow.

Quickstart

Get up and running with a working integration in minutes.

Requirements

Review platform requirements before you integrate.

GitHub

Browse the open-source SDK and example application.

API Reference

Explore the full SDK reference documentation.

What is Stripe Terminal React Native?

Stripe Terminal is a programmable point-of-sale solution that lets you accept card-present payments — where a physical card is tapped, swiped, or inserted at the point of sale. The React Native SDK is the bridge between your React Native application and Stripe’s Terminal hardware and payment infrastructure. The SDK supports a range of pre-certified card readers including Bluetooth readers (such as the BBPOS Chipper and Stripe Reader M2), internet-connected smart readers (such as the Stripe Reader S700 and BBPOS WisePOS E), and USB-connected devices. On supported devices, Tap to Pay lets you accept contactless payments directly on a mobile device without any additional hardware.

How the SDK fits into Stripe Terminal

A Terminal integration connects three parts:
  1. Your backend server — Creates connection tokens via the Stripe Terminal API. The SDK fetches these tokens when it needs to authenticate with Stripe. Your server never exposes secret keys to your app.
  2. Reader hardware — Pre-certified card readers that capture payment method data and communicate with Stripe’s network.
  3. Your React Native app — Uses this SDK to discover readers, connect to them, and orchestrate the payment flow.
The connection token flow works like this: when the SDK needs a token, it calls your tokenProvider function, which fetches a short-lived secret from your backend. This keeps your Stripe secret key server-side.

Architecture overview

The SDK is built around two primitives: StripeTerminalProvider is a React context provider that wraps your application. It holds the shared SDK state — the connected reader, discovered readers, loading status — and manages the connection token lifecycle. Place it at the root of your component tree.
import { StripeTerminalProvider } from '@stripe/stripe-terminal-react-native';

function Root() {
  const fetchTokenProvider = async () => {
    const response = await fetch(`${API_URL}/connection_token`, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
    });
    const { secret } = await response.json();
    return secret;
  };

  return (
    <StripeTerminalProvider
      logLevel="verbose"
      tokenProvider={fetchTokenProvider}
    >
      <App />
    </StripeTerminalProvider>
  );
}
useStripeTerminal is a React hook that provides all SDK methods and reactive state to any component nested inside StripeTerminalProvider. Call initialize once on mount, then use methods like discoverReaders, connectReader, and createPaymentIntent throughout your app.
import { useStripeTerminal } from '@stripe/stripe-terminal-react-native';

function App() {
  const { initialize } = useStripeTerminal();

  useEffect(() => {
    initialize();
  }, [initialize]);

  return <View />;
}
initialize must be called from a component that is a child of StripeTerminalProvider, not from the same component that renders the provider.

Supported discovery methods

The SDK supports the following values for the discoveryMethod parameter of discoverReaders:
MethodDescription
bluetoothScanScans for Bluetooth LE readers nearby. Most common for mobile point-of-sale.
bluetoothProximityConnects to a specific Bluetooth reader by proximity without a full scan.
internetDiscovers smart readers registered to your Stripe account over the internet.
usbDiscovers readers connected via USB (Android only).
tapToPayUses the device’s built-in NFC to accept contactless payments without a reader.
appsOnDevicesFor apps running directly on Stripe smart readers (Android only, private preview).

Supported platforms

  • iOS 15.1 and above
  • Android API level 26 and above
See Requirements for full details including SDK versions and required permissions.

Build docs developers (and LLMs) love