crxpaydocs

Stripe Connect setup

Connect Stripe in one click, then create products, prices, and entitlements.

crxpay never holds your money. Every cent your extension users pay flows directly into your own Stripe account — we just take a 2.5% application fee at the point of sale (and nothing for your first $2,500 in revenue). This page walks you through connecting Stripe and configuring what you sell.

The funds-flow at a glance

User pays $9.99/month
  ├─ ~$0.59  → Stripe processing fee (~2.9% + $0.30, standard rate)
  ├─ $0.25   → crxpay platform fee (2.5% — only after $2,500 lifetime revenue)
  └─ $9.15   → Your Stripe account → your bank on the next payout cycle

We never touch the money. Stripe holds it for ~2 days, then transfers
to the bank account you registered during Express onboarding.

1. Connect Stripe

  1. Open the Stripe settings page

    In the dashboard, click Settings → Stripe (or open the page directly from the project sidebar).

  2. Click "Connect with Stripe"

    We use Stripe Express Connect — the same flow ExtPay uses. Express is designed for marketplace platforms like ours: you sign in once, Stripe collects the verification data they need (bank account, ID), and we get scoped permission to create checkouts on your behalf.

  3. Complete Stripe onboarding

    Stripe's hosted page asks for:

    • Business profile — country, business type (most indie devs choose "Individual / Sole proprietor")
    • Personal verification — name, address, last 4 of SSN/SIN/equivalent (Stripe is a regulated financial entity; this is required by KYC laws, not us)
    • Bank account — where payouts land
    • Phone — for fraud protection

    Verification typically completes in under 24 hours. You can start accepting test mode payments immediately while you wait for live-mode verification.

  4. You'll be redirected back

    The Stripe Connect status card now shows:

    ✅ Stripe account connected · acct_xxxxxxxxxxxxx     Charges enabled · Payouts enabled

    We immediately register a webhook endpoint on your connected account so subscription events flow back into the crxpay dashboard.

2. Create your first product

Once Stripe is connected, you can create products from the Products page in the project sidebar. Either:

  • Use the dashboard — fill in name, description, image, and we create the product on your Stripe account in the background.
  • Or import an existing Stripe product — paste the prod_… ID and we'll mirror it locally.

Most developers use the dashboard. You'll never need to touch the Stripe Dashboard for normal CRUD.

Dashboard click          What we do behind the scenes
─────────────────────    ─────────────────────────────────────────────
"Create Product"     →   stripe.products.create({ name, ... },
                            { stripeAccount: acct_yours })
                     →   INSERT into crxpay.products linked to your ext

3. Add a price

Each product can have multiple prices. Three common shapes:

Recurring (monthly / yearly)

Product:  "Pro"
  ├─ Price 1:  $9.99 USD / month
  └─ Price 2:  $79.99 USD / year   (label as "Best value", -33% vs monthly)

One-time (lifetime)

Product:  "Lifetime Pro"
  └─ Price:    $149 USD (one-time, no interval)

Trials

Set Trial days when creating the price. Stripe enforces the trial period — the first charge happens automatically when the trial ends. Users on trial have full entitlement access.

4. Map products to entitlements

This is the step that decouples "what the user paid for" from "what features they can access".

Product "Pro"            ─┐
Product "Lifetime Pro"   ─┼─→ Entitlement "pro"
Product "Team"           ─┘

Product "AI add-on"      ──→ Entitlement "ai_features"

Now in your extension code:

const result = await CrxPay.getSubscription();
if (result.ok && result.data.hasEntitlement('pro')) {
  unlockProFeatures();
}
if (result.ok && result.data.hasEntitlement('ai_features')) {
  unlockAi();
}

You can change pricing structure (split Pro into Pro/Pro+, add lifetime, run a sale) without ever touching extension code — only the entitlement mapping.

5. Test mode

Toggle the topbar to Test mode. Everything — customers, subscriptions, webhooks, payouts — is isolated from live data. The crxpay API automatically uses your Stripe test key for any request flagged as test mode.

Use these Stripe test cards:

Card numberResult
4242 4242 4242 4242Successful payment
4000 0000 0000 9995Declined: insufficient funds
4000 0000 0000 0341Attaches but fails on first charge — great for testing dunning
4000 0027 6000 3184Requires 3D Secure authentication
4000 0000 0000 0259Triggers fraud-block by Stripe Radar

Any future expiry, any CVC, any ZIP.

6. Going live

When you're ready for real payments:

  1. Verify your Stripe account is fully approved

    Stripe Express dashboard → top banner is green ("Charges and payouts enabled"). If not, click the inline Continue verification prompt.

  2. Toggle the dashboard topbar to Live

    Test data and live data are completely separate — you'll create live products/prices the first time you switch.

  3. Recreate (or import) your products in live mode

    The dashboard has an Import from test mode button on the Products page so you don't have to re-enter everything.

  4. Update your extension's manifest

    If you were testing with an unpacked extension, package and upload it to the Chrome Web Store. The SDK's testMode: 'auto' setting will detect packed extensions and switch to live data automatically.

What we handle automatically

You don't have to write any of these handlers — they're built into the crxpay backend:

Stripe eventWhat we do
customer.subscription.createdCreate local subscription, grant entitlements
customer.subscription.updatedUpdate status (upgraded, paused, cancelled-but-valid)
customer.subscription.deletedMark expired, revoke entitlements
invoice.payment_failedMark past_due, keep entitlements during Stripe's Smart Retry window
invoice.payment_succeededRestore entitlements, log revenue, fire onPaid event
customer.subscription.trial_will_endNotify SDKs 3 days before trial expiry
customer.subscription.pausedRevoke entitlements until resumed
customer.subscription.resumedRe-grant entitlements
charge.refundedRevoke entitlements, decrement revenue analytics

You can also add outgoing webhooks in Settings → Outgoing webhooks (coming soon) to receive these events on your own server for custom CRM/analytics flows.

Next

Was this page helpful?

Your feedback shapes what we document next.