Monetize a Chrome extension
The ways to charge for a Chrome extension, from a lifetime licence or a subscription to free uses, trials, seats and bundles, set up with Toolaby.
This guide covers seven ways to charge for a Chrome extension. For each, it says what the model suits and how to set it up with Toolaby, with a link to the docs page. Models combine, so one tool can sell several of them. A checklist ends the guide.
Before you begin
- An extension wired to a tool on Test. See the Quickstart.
- Every model below is set under the tool's Pricing in the dashboard. A change there needs no new release of the extension.
- Payments run on your own Stripe account, and the buyer sees your name on their statement. Toolaby costs 0.5% of a sale, or $25 a month per workspace. Stripe's own fee comes off each sale as well. See Money.
A lifetime licence
A lifetime licence is one payment for lasting access. It suits an extension that does a finished job and costs you little to run for each buyer.
Under the tool's Pricing, select New plan and set Billing to once.
- Devices sets how many devices one buyer may use at once, from 1 to 10. Licences already sold keep the number they were sold with.
- With Access on Nothing free and no account required, a buyer can pay without an account and claim the licence later.
- A refund of the whole payment revokes the licence, and the extension stops at its next check.
- Prices cannot be edited. To change one, add a plan and retire the old one: licences already sold stay valid.
See Pricing.
A subscription
A subscription bills the buyer every month or every year. It suits an extension you keep improving, or one that costs you money each month, such as a server or a paid API.
Select New plan, set Billing to subscription, and choose monthly or yearly. Stripe bills the buyer's card on file.
- The buyer signs in before subscribing, so a subscription always belongs to an account.
- The tool unlocks while Stripe's status is
activeortrialing. A failed payment leaves itpast_due, which unlocks nothing. - Buyers cancel, switch plans and change their card in Stripe's billing portal, from their account page.
- With a monthly and a yearly plan, the checkout page marks the yearly plan's saving against twelve months of the monthly one.
- Your code reads the state from
getUser():user.subscriptionholdsstatus,periodEnd,cancelAtPeriodEndandcancelAt.
See Subscriptions.
Freemium with free uses
Free uses let people use the extension a set number of times, then ask for a plan. This suits an extension whose value shows in its first few uses.
In the Access card under Pricing, choose Free uses. Set the number and the period: in total, a day, a week or a month. From the command line:
npx -y toolaby@latest access <tool-id> --access free_uses --free-uses 3 --free-uses-per dayCount the uses at the action, with the number it spends:
const permit = await toolaby.gate(invoices.length);
if (!permit.allowed) return toolaby.showPaywall(permit);gate()spends the uses only when it allows. When they are spent, the paywall offers your plans.- Toolaby counts the uses per device, or per account when the tool requires one.
- Without an account, removing the extension and adding it again makes a new device, with new uses. To stop that, turn on Require an account.
See Access and features.
Freemium with paid features
Paid features keep the extension free and sell what goes beyond it. This suits an extension whose free part is useful alone, with a few features worth paying for.
Keep Access on Everything free, the setting a new tool starts with. Under Features, select Add feature. Give the feature a name buyers read and a key your code asks for. Tick the plans that hold it, and select Save. The card takes entries once the tool has a paid plan.
const permit = await toolaby.gate({ feature: 'export' });
if (!permit.allowed) return toolaby.showPaywall(permit);- The paywall then offers only the plans that hold
export. has('export')answers from the device, for a lock or a badge. The action still callsgate().- For an allowance of items, such as two saved sessions, count them in your code. Past the allowance, gate a feature such as
unlimited-sessions.
See Access and features and Gate your extension.
A free trial
A free trial gives a subscription's features for a set number of days before the first charge. It suits a subscription whose value shows over days of use.
On a subscription plan, set Free trial from 0 to 365 days. Stripe takes the card at checkout and charges it when the trial ends. The buyer can cancel before that.
- Each inbox gets one trial per tool. A buyer whose address is unverified or disposable pays from the first day.
- During the trial,
gate()allows anduser.subscription.statusistrialing. - Your website can also start a trial with no card, as long as the longest a plan offers. See Website components.
- To let people try without a card inside the extension, use free uses instead.
See Pricing.
Seats for teams
Seats let one buyer pay for several people. They suit an extension used at work, where one person buys for a team.
Switch on Sold per seat on the plan. The checkout page then asks For me or For a team, and a team buys 2 to 100 seats. A lifetime plan starts with it on, and a subscription with it off.
- The buyer receives a team licence. It has no key and unlocks nothing by itself.
- On their account page, the buyer gives each seat to an email address, and can take it back.
- To the extension, a seat is a licence.
- On a team subscription, the buyer changes the seat count from Manage in Stripe. More seats are prorated and invoiced at once.
- Team licences past 100 seats are part of Enterprise, on request. See Plans.
See Seats.
Bundles of several extensions
A bundle sells several of your tools in one purchase. It suits a developer with two or more extensions that the same buyers use.
Register the bundle like a tool: New, kind Bundle, a name, and the tools it holds. The kind is offered once the workspace has two tools. A bundle has its own checkout page, prices and customers.
- A licence or subscription on the bundle unlocks each tool in it whole.
- The extensions do not change. Each asks with its own tool id, and Toolaby resolves the bundle.
- A free trial of the bundle is a trial of each tool in it. Each inbox has one trial of a tool, however it comes.
- A bundle cannot hold another bundle, or a tool from another workspace.
See Bundles.
Checklist
- Choose what is free under Access: Everything free, Free uses or Nothing free.
- Add your plans under Pricing: once, monthly or yearly, with their trials, devices and seats.
- If you sell features, add them and tick the plans that hold them.
- Gate each action you charge for with
gate(), and answer a refusal withshowPaywall(). - Produce each refusal on Test, then buy with the card
4242 4242 4242 4242. See Gate your extension. - If basic functionality needs payment, say so in your store description. See the Chrome Web Store's Accepting Payment From Users policy.
- Copy the tool to Live, connect Stripe, and publish the store build. See Ship to the Chrome Web Store.
Next steps
Payments for WXT, Plasmo and CRXJS extensions
Wire a WXT, Plasmo or CRXJS extension to Toolaby, gate the paid action, show the paywall, then build, check and pack it.
Chrome Web Store payments are gone
Each date of the end of Chrome Web Store payments and its licensing API, from Google, and what your extension needs to take payment now.