The $0/month stack for paid browser extensions.
A complete, production-tested launch kit: MV3 extension with offline-verifiable licensing, a Cloudflare Worker that turns Paddle payments into signed license keys, and a static checkout site. No servers. No database bill. No sales-tax filings.
One-time purchase · lifetime updates · unlimited products · 14-day refund
# from clone to a rebranded, fully tested paid extension
git clone <your copy> my-extension && cd my-extension
npm run init # name, company, prices, seats, trial length
npm run install:all
npm run check # lint, types, 120+ tests, builds — all green
Three things no other extension kit gives you together
Every other boilerplate is "connect Stripe, add a Firebase project, host a backend". You are then on the hook for hosting bills, uptime and VAT.
$0/month, honestly
GitHub Pages hosts the site. Cloudflare Workers + KV run licensing on the free tier (100k requests/day — tens of thousands of users). Paddle only takes a cut of sales. Your fixed cost is a domain.
Merchant of record built in
Paddle sells to your customer, collects VAT/GST/sales tax worldwide, issues invoices and handles refunds and chargebacks. The kit turns Paddle webhooks into license keys — you never touch a tax form.
Pro works when your server doesn't
License keys are ES256-signed JWTs verified inside the extension with an embedded public key. No "ask the server if the user is Pro" — and no one-star reviews when a backend hiccups.
What's inside
One private repository, five packages, one config file. Everything reads from paidextension.config.json.
TypeScript MV3 extension
- Popup, settings, upgrade flow, sample content script
licensing/module: offline key verification, device seats, trials, checkout polling, offline grace- Config-driven feature gates —
isEnabled('export') - Firefox manifest variant, Edge-ready packaging
- Vitest suite, ESLint, strict TypeScript, webpack
Cloudflare Worker licensing backend
- Verifies Paddle webhooks, issues signed keys for monthly, yearly and lifetime plans
- Seat registry in KV, short-lived install-bound entitlement tokens
- Revokes on refund, chargeback and cancellation
- Abuse-limited free trials, per-route rate limits
- License-key emails via Resend, idempotent on retries
- 65 tests, no framework, deploys with
wrangler deploy
Static checkout & customer site
- Landing, Paddle overlay checkout, license-key page, device management
- Privacy, terms, support pages with refund policy
- Strict per-page CSP, HTML validation, link and CSP checkers
- Deploys to GitHub Pages on push
Rebrand, validate, generate
npm run initrewrites the entire repo for your product from a few answersvalidate:configkeeps manifests, Worker and site consistentgenerate:listingdrafts store copy, permission justifications and a privacy policy
Agent-native
- Step-by-step skills for Devin, Claude Code, Cursor and Codex: setup, publish, test
AGENTS.mdwith the invariants an agent must not break- Hand the repo to your agent: "rename to X, set prices, deploy, submit"
CI and releases
- CI for every package on every PR
- Tag-triggered release: version check, production build, store zips, GitHub release
- Pages deploy for the site, Wrangler deploy for the Worker
How licensing works
Keys are portable, offline-verifiable and revocable — the three things that are hard to get at once.
1. Checkout
POST /checkout {plan} creates a Paddle transaction; the extension opens your checkout page with the overlay.
2. Webhook
transaction.completed is signature-checked, the Worker signs an ES256 key {sub, plan, exp} and emails it.
3. Activate
Polls GET /license?txn=, then POST /activate claims a seat and gets an install-bound entitlement token.
4. Verify
Key and token verify locally with the embedded public key. Tokens renew every 3 days, so refunds reach the device within days.
Plans
Monthly and yearly subscriptions key off the Paddle subscription id; lifetime purchases key off the transaction id. Unknown prices are rejected, never silently mapped to a plan.
Seats
A key activates on up to maxSeats browsers. Users release devices from the extension settings or the devices page, using the key itself as the credential.
Trials
POST /trial issues a time-boxed key per visitor id with per-IP limits. Set trialDays: 0 to turn trials off entirely.
Extracted from a real product, not a demo
PaidExtension is the exact stack behind Manila Mail Manager, a paid Gmail extension live on the Chrome Web Store — Paddle checkout, Cloudflare licensing, seat limits, trials and refunds have all been exercised by paying customers. The kit is the generic version, with lifetime plans, Edge/Firefox packaging and the agent skills added.
How it compares
Against the popular extension boilerplates and the hosted "payments SDK" services.
| PaidExtension | Typical boilerplate (ExtensionFast, extFast, TurboStarter…) |
Hosted payment SDKs (ExtensionPay, crxpay…) |
|
|---|---|---|---|
| Price | $99 once | $99–$499 once | 3–5% of every sale, forever |
| Monthly infra at 0 customers | $0 | Firebase / Supabase / hosting tiers | $0 |
| Sales tax / VAT handled | Yes — Paddle MoR | No — Stripe, you file | No — Stripe, you file |
| Works when backend is down | Yes — offline ES256 keys | No | No |
| Device seat limits | Yes, self-serve release | No | No |
| Lifetime + subscription plans | Both | Usually subscription | Both |
| User accounts required | No — key-based | Google / email auth | No |
| Refund / chargeback revocation | Automatic | DIY | Yes |
| Own the code, no vendor | Yes | Yes | No — hosted dependency |
| AI-agent setup/publish/test skills | Yes | No | No |
| Firefox + Edge packaging | Yes | Sometimes | Chrome-first |
Competitor details as published on their sites at the time of writing; check current terms before deciding.
Pricing
Pay once. Build as many extensions as you like.
PaidExtension Kit
$149$99
one-time, per developer
- Private GitHub repo access, instantly
- Unlimited end products, commercial use
- Lifetime updates
- Setup, licensing and publishing guides
- Agent skills: setup, publish, test
- Support via GitHub Issues and email
14-day refund if it's not what you expected. Payments handled by Polar (merchant of record); you'll get a proper invoice.
Questions
What exactly do I receive?
Access to a private GitHub repository containing the full source: extension/, worker/, site/, scripts/, docs/, .agents/skills/ and the GitHub Actions workflows. Polar grants the repo access to your GitHub account right after purchase; updates arrive as commits.
Do I need to know Cloudflare or Paddle already?
No. The setup guide (and the setup agent skill) walks through creating the Paddle prices and webhook, deploying the Worker and pointing your domain at GitHub Pages. Budget about an hour for a first run.
Why Paddle rather than Stripe?
Paddle is a merchant of record: it is legally the seller, so it collects and remits sales tax in every jurisdiction and handles invoices, refunds and chargebacks. With Stripe those obligations are yours. For a solo developer selling globally that difference is the whole ballgame.
Is it really $0/month?
Until you outgrow the free tiers, yes: GitHub Pages is free, Cloudflare Workers gives 100,000 requests/day and KV 1,000 writes/day, Resend gives 3,000 emails/month. Paddle charges 5% + 50¢ per sale and nothing otherwise. You pay for a domain (~$12/year).
Can I use React / WXT / Plasmo?
The extension scaffold is plain TypeScript + webpack so there's nothing to fight. The licensing/ module has no UI dependencies and drops into any MV3 project; the Worker and site are independent of the extension framework.
What does the license allow?
One developer, unlimited commercial end products, forever, including all updates. You may not redistribute the kit itself or use it to build a competing kit. Each developer who edits the kit's files needs their own license. Full text on the license page.
How is this "agent-native"?
The repo ships an AGENTS.md plus three skills in .agents/skills/ — setup, publish and test — written as checklists an AI coding agent can execute. They encode the things that usually go wrong: service-worker constraints, CSP rules, Paddle sandbox quirks, store-review requirements.
Refunds?
14 days, no questions asked — email hello@paidextension.dev. We'll revoke repo access and refund through Polar.