
How to monetize a Chrome extension in 2026 (without losing your weekends)
Step-by-step on shipping a paid tier in your Chrome extension this year. SDK choice, paywall design, Stripe Connect setup, common mistakes.
So you built a Chrome extension. People use it. You'd like to be paid for it.
Welcome to one of the more annoying corners of the developer experience. Chrome killed Web Store payments back in 2021, leaving every extension dev to roll their own billing stack. There are roughly four ways to do it in 2026, and only one of them is something you can ship in an afternoon.
The four options
1. Build it yourself. Your own backend, your own Stripe integration, your own paywall page, your own webhook handlers, your own offline cache so users keep their paid status when their network drops mid-flight. Realistic timeline: two to three months. We did this at a previous startup. It is not fun.
2. Use ExtPay. Battle-tested, reasonable docs, 5% flat fee. Their main weakness is that they predate Manifest V3 and you still see CORS quirks in service workers. Also: 5% adds up fast once you cross a few thousand a month in revenue.
3. Use Lemon Squeezy or Paddle as merchant of record. Easier on the tax side because they handle VAT and sales tax for you. Downside is the integration is generic, not extension-aware: no install attribution, no offline cache, you'll write your own glue.
4. Use crxpay. Disclosure: we wrote this post. crxpay is a drop-in SDK plus a hosted dashboard, built for MV3 from day one. 0% until your extension hits $2,500 in revenue, then 2.5% per transaction. About ten minutes to first paywall if you already have a Stripe account.
If you want to ship this week, options 2 or 4 are realistic. The rest of this post walks through option 4 because that's what we know best, but most of the advice transfers.
Step 1: Decide what you're charging for
This is where most extension teams stall for weeks. You don't need a perfect pricing strategy on day one, but you do need to answer one question: what does a paid user get that a free user doesn't?
Three patterns work:
- Usage cap. Free up to N actions per day, paid is unlimited. Works for AI extensions, summarizers, anything that costs you compute.
- Premium feature. Specific features behind a paywall (export to PDF, sync across devices, dark mode, third-party integrations).
- Power-user tier. Free version is fine forever; paid version is for the 5% who want more (more bookmarks, more rules, more history).
Pick one. You can change it later.
Step 2: Drop in the SDK
Install the package:
npm install @crxpay/sdk
In your background service worker:
// background.ts
import { CrxPay } from '@crxpay/sdk/background';
const client = CrxPay.configure({
apiKey: 'crxpay_pub_…', // copy from your dashboard
mode: 'test', // 'live' when you're ready
});
chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
if (msg?.type?.startsWith('CRXPAY_')) {
client.handleMessage(msg, sender).then(sendResponse);
return true;
}
});
In your popup or content script:
import { CrxPay } from '@crxpay/sdk/content';
const client = CrxPay.configure({ apiKey: 'crxpay_pub_…' });
const sub = await client.getSubscription();
if (sub.data?.hasEntitlement('pro')) {
// unlock the feature
}
That's the whole integration. The SDK manages the offline cache, message-passing between contexts, and state transitions. You never call our REST API directly.
Step 3: Bundle for MV3 (the silent killer)
Here is the most common reason extension devs think their billing is broken when it isn't: Chrome's MV3 service worker can't resolve bare ES module imports. If you ship background.js with import { CrxPay } from '@crxpay/sdk/background' unbundled, Chrome's service worker silently fails to load the module. The SDK never runs. Your dashboard stays empty. You assume the SDK is broken.
It isn't broken. You need a bundler. Pick one:
# esbuild (fastest)
esbuild background.ts --bundle --format=esm --target=chrome120 --outfile=dist/background.js
# rollup, webpack, vite — all fine, all need similar config
If you skip this step, nothing works and there is no error message. We added a "Verify SDK connection" button to the onboarding flow specifically because so many people hit this.
Step 4: Connect Stripe
crxpay uses Stripe Connect, which means money goes directly to your Stripe account, not ours. We collect our 2.5% fee via application_fee_percent on each transaction. You keep the rest.
In the dashboard, click "Connect Stripe." If you don't have a Stripe account, Stripe will set you up with an Express account in about three minutes (mostly identity verification). If you do, it links your existing one.
Once you're connected, you can create products and prices in either Stripe or crxpay's dashboard. Both stay in sync via webhooks.
Step 5: Build a paywall that actually converts
This is where most extensions lose money. They throw up a generic "subscribe for $9.99/month" modal and wonder why conversion is 1%.
Three things move the needle:
Show what they get, not what it costs. "Unlock annotation history" beats "$9/month."
Anchor with a yearly option. Default to monthly. Show yearly with the savings highlighted ("Save $24 per year"). Half the people who would have bought monthly upgrade to yearly when you do this.
Offer a trial. Seven days, card required. crxpay handles the trial-to-paid transition automatically. Conversion typically lifts 30–40% versus no trial.
We ship eight paywall templates that follow these patterns. You can also build your own with our React components or HTML.
Step 6: Track what's working
The point of a paywall isn't to ship it. The point is to keep improving conversion until it's 8–12%, which is where good extensions land. To do that you need to know:
- What percentage of installs see the paywall
- What percentage of paywall views start a checkout
- What percentage of trials convert to paid
- What percentage of paid users churn each month
The dashboard shows all of this. The interesting one is the trial-to-paid number. Anything above 25% is healthy. Below 15% means your trial length is wrong (try 14 days instead of 7) or your premium feature isn't compelling enough yet.
Common mistakes we see
After watching hundreds of extensions go through this:
Pricing too low out of fear. $2.99 sounds friendlier than $9.99 but it doesn't convert better. It just brings in customers who churn faster. If you're solving a real problem, charge a real price.
Hiding the price. Some teams gate the price behind "Talk to sales." Unless you're selling to enterprise teams of 50+, this kills conversion. Show the price.
Not testing the trial expiry email. You'd be amazed how many trials get killed because the "trial ending soon" email lands in spam. Send yourself one before you go live.
Forgetting about Brave and Edge. Both are Chromium, both run your extension, both need to be supported. Test the SDK in all three.
What's next
If you want to ship a paid tier this week, the playbook is roughly: pick what you're charging for (one hour), drop in the SDK and bundle (one afternoon), connect Stripe and build a paywall (one day), test in test mode and ship (half a day).
If you have specific questions about your extension, our Discord is where the team hangs out. We answer most questions within a few hours.
And if you've already shipped on ExtPay or rolled your own, our migration guide covers the compat layer that keeps existing customers signed in while you swap the SDK out.