For most extensions a hosted service is worth paying for. The check inside the extension is a few lines, but behind it sit a checkout, webhooks, a server that records who paid, an answer the extension can trust offline, trials that survive a reinstall, refunds, failed renewals and a way to sign in on a second device. Building it yourself makes sense when you already run a backend with accounts and Stripe, or when a service's fees cost more than your server and your time.
This guide lists what you would build, what each route costs, and when each one fits. For the services side by side, see Chrome extension payment tools compared.
What you would build
The Chrome Web Store stopped charging money for extensions in February 2021 (the dates, from Google), so every paid extension now needs these parts from somewhere:
| Part | What it involves |
|---|---|
| Checkout | A Stripe Checkout session for each plan, with the device or account it is for. |
| Webhooks | Payments, renewals, cancellations, failed payments, refunds and disputes, each changing who has access. |
| A server and a database | Who paid, for which plan, on which devices. It has to stay up: when it is down, paying users are locked out. |
| An answer the extension trusts | Not a paid: true flag in chrome.storage, which anyone can set. A signed answer the extension verifies, that still works offline for a while. |
| Sign-in on another device | An email link or Google, so a buyer's second computer gets what they paid for. |
| Device limits | So one licence is not shared across a whole office. |
| A free trial or free uses | Counted somewhere a reinstall does not reset. |
| Cancel, switch and change card | Stripe's billing portal, set up per product. |
| Refunds and disputes | Taking access away when money comes back, and giving it back when a dispute is won. |
| A test mode | Making purchases with test cards without touching live data. |
How long it takes
With a hosted service, the extension side is the same few calls whatever you build: wire the client, check before the paid action, show the paywall. With Toolaby that is one command, npx -y toolaby@latest wire <tool-id>, and a gate() call before the paid action (Check if a user has paid).
Building it yourself, the licence check in the extension is the smallest part. The time goes into the server side in the table above, and into the cases that only show up once people pay: a renewal that fails, a refund, a reinstall, a second device.
What each route costs
| Build it yourself | ExtensionPay | Toolaby | |
|---|---|---|---|
| Per sale | Stripe's fee | 5% of each charge, and Stripe's fee | 0.5% of a sale on Hobby, or nothing on Pro, and Stripe's fee |
| Each month | Your server and database | Nothing | Nothing on Hobby, or $25 a month per workspace on Pro |
| Your time | The parts above, and keeping them running | Wiring and the paid checks | Wiring and the paid checks |
Stripe's fee is the same on every route, at the rate Stripe publishes for your country (stripe.com/pricing). ExtensionPay's fee is from extensionpay.com, read on 16 October 2026. On Toolaby, Pro costs less than Hobby's 0.5% from $5,000 of sales a month. See Plans.
When building fits
- You already run a backend with user accounts, and Stripe is wired to it.
- You need something no service does, such as a licence tied to your own hardware or a payment method Stripe does not offer.
- You have the time to keep a server up for paying users, including when you are away.
When a service fits
- It is your first paid extension, or you have no backend.
- You want trials, device limits, refunds and failed renewals handled from day one.
- You sell several extensions and want one place for buyers, plans and payouts.
If you build it yourself
- Keep your Stripe secret key and webhook secret on the server. Nothing secret goes in the extension.
- Verify the signature of every webhook before acting on it.
- Have the server sign what it tells the extension, and verify that signature in the extension.
- Give paying users a grace period offline, so a dropped connection does not lock them out.
- Do the paid work after the check, in the background, not only in what the popup draws.
Common questions
Can I use Stripe Payment Links without a backend?
A Payment Link takes the money, but it does not tell your extension who paid. You still need a webhook and somewhere to record the payment against a user or a device, which is the server this guide describes.
Do I lose my buyers if I switch later?
With Toolaby, payments, subscriptions, customers and their cards are on your own Stripe account, and stay there if you leave. Configure → Export downloads everything else. See Export. Coming in, buyers and subscriptions can be brought over from another Stripe account or from ExtensionPay: see Move subscriptions from another Stripe account and Move from ExtensionPay.