react-stripe-js

Official React components and hooks for embedding Stripe.js and Stripe Elements in a React app.

SDK
npm
v7.0.0
2,045 stars
MIT License

Repository Health

Pre-computed score based on development activity, maintenance, community, maturity, and trend momentum. How we score it →
93 /100 Excellent
Development Activity 92
Maintenance 96
Community 84
Maturity 60
Momentum 40

Technical Analysis

AI-assessed by reading the actual repository — architecture, code quality, innovation, and documentation. How we score it →
81 /100 Excellent
Architecture 85
Code Quality 88
Innovation 72
Learning Curve 80

@stripe/react-stripe-js is Stripe’s official React binding for Stripe.js and Stripe Elements. It provides an <Elements> context provider plus a set of prebuilt, pre-styled Element components (PaymentElement, CardElement, AddressElement, ExpressCheckoutElement, and more) that mount Stripe-hosted iframes for collecting and tokenizing payment details without the app ever touching raw card data.

Beyond individual Elements, the package also ships EmbeddedCheckoutProvider/EmbeddedCheckout for embedding Stripe’s hosted Checkout flow directly inside a page, and a separate /checkout subpath exporting a Checkout Sessions-based Elements API (CheckoutElementsProvider, useCheckoutElements) for building fully custom checkout UIs. It is maintained directly by Stripe, ships first-class TypeScript types, and is the recommended way to integrate Stripe payments into any React application.

What You Get

  • An <Elements> provider that instantiates Stripe.js/Elements once and exposes it via useStripe()/useElements() to any nested component
  • Prebuilt Element components for every Stripe Elements type: PaymentElement, CardElement, CardNumberElement, AddressElement, IbanElement, ExpressCheckoutElement, and more
  • EmbeddedCheckoutProvider/EmbeddedCheckout components for embedding Stripe’s hosted Checkout flow inline instead of redirecting off-site
  • A /checkout subpath exposing a Checkout Sessions Elements API (CheckoutElementsProvider, useCheckoutElements) for fully custom checkout UIs
  • Automatic diffing of Element options between renders so only Stripe-supported updates are pushed to the live element, avoiding unnecessary remounts
  • SSR-safe rendering via server/client element variants so the library doesn’t crash when rendered during Next.js or static-site server rendering

Common Use Cases

  • Custom checkout pages that mount PaymentElement inside the app’s own layout and styling instead of redirecting to a hosted page
  • SaaS billing/account settings pages that collect card, IBAN, or bank-account details via CardElement/IbanElement/AuBankAccountElement
  • Embedded, no-redirect checkout flows built with EmbeddedCheckoutProvider/EmbeddedCheckout
  • One-tap wallet checkout buttons (Apple Pay, Google Pay, Link) added via ExpressCheckoutElement to reduce checkout friction

Under The Hood

Architecture

The library is organized around React Context: Elements.tsx creates an ElementsContext that lazily resolves the stripe prop (which may be a Promise) via parseStripeProp/registerWithStripeJs, storing the resolved Stripe/StripeElements pair for consumers. Individual Element components are all generated by a single factory, createElementComponent (src/components/createElementComponent.tsx), which reads either the classic Elements context or, when running under the newer Checkout Sessions surface, the parallel CheckoutContext (src/checkout/components/CheckoutContext.tsx) via useElementsOrCheckoutContextWithUseCase. This dual-context design lets one component factory serve both the legacy Elements API and the newer Checkout Elements API without duplicating the create/mount/update/destroy lifecycle. EmbeddedCheckoutProvider/EmbeddedCheckout are a separate, parallel context+component pair for the fully hosted embedded-checkout iframe. If the context-resolution or lifecycle logic in createElementComponent changes, every exported Element component breaks at once, since none of them contain independent mounting logic.

Tech Stack

Written in TypeScript targeting esnext/strict mode, transpiled with Babel and bundled with Rollup into CJS, ESM, and UMD outputs (rollup.config.js) plus a minified UMD build for <script> tag consumption. The only runtime dependency is prop-types; @stripe/stripe-js, react, and react-dom are peer dependencies (React 16.8+ through 19, @stripe/stripe-js 9.x). Storybook is used for interactive component development, and the build pipeline includes an @arethetypeswrong/cli check (test:package-types) to catch broken package.json exports/types configuration before publish.

Code Quality

Tests live alongside source files as *.test.tsx/*.test.ts and run under Jest with ts-jest and React Testing Library (@testing-library/react, @testing-library/react-hooks), covering the Elements provider, individual Element wrapper behavior, the Checkout providers, and pure utility functions like extractAllowedOptionsUpdates and isEqual. Linting is enforced via ESLint (Airbnb config + eslint-plugin-react/react-hooks/jsx-a11y) with --max-warnings=0, Prettier formatting is checked in CI, and a GitHub Actions workflow (.github/workflows/build.yml) runs lint, unit tests, package-type checks, and tsc typechecking on every change. Error handling around element teardown is deliberately defensive — element.destroy() calls are wrapped in try/catch since Stripe.js can throw if an element was already destroyed.

What Makes It Unique

Rather than exposing a single generic “Element” component, the library generates a distinct, strongly-typed component per Stripe Elements type from one internal factory, giving consumers IDE autocomplete and type-checked props per element while keeping the create/update/destroy lifecycle implementation in exactly one place. Its dual support for both the original Elements API and the newer Checkout Sessions Elements API (via a shared context resolution layer) lets the same component set serve two different Stripe integration models without a breaking rewrite, and the built-in options-diffing (extractAllowedOptionsUpdates) avoids the common integration bug of accidentally remounting a payment iframe on every parent re-render.

Used by 25 apps in this directory

TypeScript
81%
AGPL 3.0

Postiz

Automation · Social Media

37,683

The agentic social media scheduler — AI-powered content creation, 33-platform posting, and team workflows, all self-hosted.

View details
92
Repo Health
70
Technical
63
Dependency
Built with
TypeScript 81%
JavaScript 11%
Updated 2 days ago
TypeScript
98%
AGPL 3.0

Rybbit

Analytics

13,155

Open-source, privacy-friendly web and product analytics with cookieless tracking, session replays, funnels, and real-time dashboards — a self-hostable alternative to Google Analytics.

View details
87
Repo Health
85
Technical
68
Dependency
Built with
TypeScript 98%
Updated yesterday
Python
57%
Other

Sentry

Analytics · Developer Tools · Monitoring

45,632

Developer-first error tracking and performance monitoring platform with AI-powered root-cause analysis across 20+ languages and frameworks.

View details
95
Repo Health
80
Technical
66
Dependency
Built with
Python 57%
TypeScript 42%
Updated yesterday
TypeScript
89%
Other

Hexclave

Authentication · Developer Tools

6,877

The open-source user infrastructure platform — authentication, teams, payments, emails, analytics, and more on a single unified user model.

View details
88
Repo Health
80
Technical
66
Dependency
Built with
TypeScript 89%
Updated yesterday
TypeScript
47%
Other

Stirling PDF

Digital Signiture · Productivity

94,824

The open-source PDF platform you can run anywhere — edit, convert, sign, and automate PDFs without sending files to external servers.

View details
92
Repo Health
86
Technical
68
Dependency
Built with
TypeScript 47%
Java 44%
Updated yesterday
TypeScript
72%
Apache 2.0

Supabase

Authentication · Databases · Developer Tools

113,827

The open-source Postgres development platform that replaces Firebase with authentication, real-time APIs, edge functions, storage, and vector embeddings — all built on PostgreSQL.

View details
90
Repo Health
91
Technical
62
Dependency
Built with
TypeScript 72%
MDX 26%
Updated yesterday
TypeScript
84%
Other

twenty

CRM

59,615

The open-source CRM you build, ship, and version like the rest of your stack — with customizable objects, AI agents, and a TypeScript SDK.

View details
92
Repo Health
82
Technical
64
Dependency
Built with
TypeScript 84%
MDX 14%
Updated 2 days ago

Join founders buildingwith open source

Opinionated takes, migration guides, cost-saving tips, and insights from the open source ecosystem.

Subscribe on Substack
Join 750+ subscribers