crxpay

Paywall components

A paywall that ships today, not next sprint.

Three ready-to-use layouts from @crxpay/react-paywall. Pick one, feed it your offering, it reads the price and the checkout URL from your dashboard. Brand colors match, checkout works.

3
layouts
Theme
via tokens
A/B
ready
<Paywall layout="cards" />
Go Pro
Pick a plan that fits
Monthly
$9
per month
Yearly
$86
save 20%
Start 7-day trial
Live preview · layouts cycle every few seconds

Try them right here

Click around. Real components, no install.

Every button below is the same React component you'll ship in your extension. Swap the brand colour, flip subscription state, click Upgrade — it all just renders. (We stub out Stripe so nothing real fires.)

Component

Subscription state

Brand colour

<PricingTable />

Paywall components

Ship a paywall that looks yours.

Themeable, data-driven, tested across plans. You bring the offering, we bring the pixels.

cards
hero
compact
1

Three layouts, one prop

Cards, hero, and compact. Switch layout="cards" to layout="hero" and the same offering renders a new shape. A/B test layouts without rewriting copy.

Themed with two tokens

Set --crxpay-ink and --crxpay-accent on the wrapper. Buttons, headings, badges, and hover states all pick them up. No class overrides, no CSS patching.

2
crxpay
--ink: #1F1F47 · --accent: #F25A5A
Preview
blueprint
--ink: #0F172A · --accent: #3B82F6
Preview
forest
--ink: #064E3B · --accent: #10B981
Preview
// Paywall.tsx
<Paywall
offeringId="main"
layout="cards"
/>
// prices fetched from dashboard · USD, EUR, INR
3

Prices from your dashboard

The component reads the offering ID you pass and pulls live prices, currency, and trial length from the dashboard. Change the price, ship nothing.

Checkout baked in

The upgrade button opens hosted Stripe checkout with the right plan, the right mode, and the right customer ID. No handler to wire, no webhook to parse.

4
Upgrade
Click → Stripe Checkout
Payment complete
Pro entitlement active · cache pushed to SDK

Same component, every brand

Two CSS vars. Whole new look.

Theming is a single theme prop on <CrxPayProvider>. Override an accent, override the whole palette — the components don't care.

Indigo · Default

Out of the box. Looks at home in popups, options pages, and standalone web apps.

Coral · Editorial

Warmer, friendlier — the colour we ship the dashboard with. Great for consumer extensions.

Emerald · SaaS

Trust-signal greens. Fits productivity tools, finance extensions, anything serious.

Slate · Dark

Paste it on a dark surface. Works because every visual value is a CSS var; no globals needed.

Why designers approve this

Looks yours, works ours.

0
Layouts in the box
cards, hero, compact
0
Theme tokens
ink and accent, pick your colors
0 prop
To swap layout
A/B test without a redesign
0 CSS
To override
tokens cover every surface

Build vs buy

Two weeks. Or one afternoon.

We've seen the rabbit-holes. Modal a11y, savings %, theming, Stripe nuances — every one of them is a mini-project you'll regret in three weeks.

Area
Roll your own
@crxpay/react-paywall
Plan picker UI
Build cards, radio states, "save 33%" math
<PricingTable />
Stripe Checkout redirect
POST /v1/sdk/checkout, parse, navigate
<UpgradeButton priceId={…} />
Trial countdown badge
Hand-roll Date math, urgency colour, hide rules
<TrialBadge />
Feature gating
Read sub.entitlements, fallback render, upgrade CTA
<EntitlementGate entitlement="pro" />
Billing portal link
POST /v1/sdk/portal, hide if not paying
<ManageSubscriptionLink />
Modal w/ focus trap + Esc
react-aria-dialog, AnimatePresence, body lock
<PaywallModal />
Brand colour theming
Decide tokens, plumb across every component
theme={{ accent: "#10B981" }}
Bundle size
"Just framer-motion alone is 30kB…"
7 kB gzip · whole package
~1 hour
Time to first paywall
7 kB gz
Bundle size
0 lines
Hand-rolled

FAQ

The questions we always get.

Still on the fence? Email hi@crxpay.io — we read every one.

  • No. The package ships its own scoped stylesheet (@crxpay/react-paywall/styles.css) under a single [data-crxpay-root]root selector. We deliberately avoid Tailwind so we don't collide with whatever CSS framework lives in your extension.

Ready to grow?

Our entire suite of features comes standard — and your first $2,500 in tracked revenue is free.