RS256-signed premium status
Pin the public key: a forged token has no valid signature.
Your extension is worth more than $0.
A few lines is all it takes to integrate the SDK: premium status, the paywall and Stripe are handled for you. We take 5% per transaction, nothing else.
import { Ciiti } from '@extmonetize/ciiti';import { EXTMONETIZE_PUBLIC_KEY } from './extmonetize-key.js'; const ciiti = Ciiti.create({ apiKey: 'pk_pub_xyz789', publicKey: EXTMONETIZE_PUBLIC_KEY,}); // At startup: registers the deviceawait ciiti.init(); // Is this feature unlocked?if (await ciiti.canUse('ai_gen')) { runAiGeneration();} else { // 💳 checkout await ciiti.openCheckout({ planId: 'plan_pro' });}In short
Focus on your product. ExtMonetize covers payments, security and measurement.
Pin the public key: a forged token has no valid signature.
Money lands in your own Stripe account. Subscriptions and one-off payments, no card data on your side.
Lock any feature behind canUse(). Entitlements travel inside the token.
Conversion, MRR and events, aggregated per extension.
HMAC-SHA256 signed, retried five times with exponential backoff.
Receipts, failed-payment reminders, trial-ending notices.
Per-user trial period, no card.
Monthly, yearly, or a single payment.
A TypeScript module, shipped as ESM and CJS.
Your customers stay in your Stripe.
One emailed code, and premium follows the user.
Set the currency plan by plan.
The SDK handles the locked → payment → premium transition. Here is what your user sees.
AI generation
This feature is part of the Pro plan.
$4.99 / month
AI generation
Unlimited while the subscription is active.
Create a developer account and register your extension from the dashboard. Grab your publishable key.
Monthly/yearly subscription or one-off payment, free trial, feature gates. All editable on the fly.
create(), init(), canUse(), openCheckout() in your service worker — live in 5 minutes.
Stripe pays out to your account, webhooks notify you, and the dashboard tracks MRR and conversion.
per successful transaction, charged when the money comes in.
Stripe’s own fees apply on top, charged directly to your account.
No. The SDK talks straight to the ExtMonetize API, which handles user accounts, plans, Stripe checkout and entitlements. You manage no backend and no database.
Premium status is a token signed with RS256 by our server; the private key never leaves it. Pin the public key in your bundle and the SDK verifies the signature locally: a token forged in chrome.storage is rejected, and an attacker would have to re-sign the token AND rebuild your extension. Like any client-side check it raises the bar without being unbreakable — keep access control for genuinely sensitive capabilities (premium API calls) on your server.
You do. Through Stripe Connect, payments land in your own Stripe account and Stripe pays you out on your usual schedule. We never hold your funds.
Your customers, subscriptions and payment history live in your Stripe account, not ours. You leave with your entire customer base.
Yes, provided you pin the public key (config.publicKey) — copy it from the dashboard and ship it in your bundle. The token is then verified locally, with no network round trip. Without a pinned key the SDK refuses to start: set allowUnpinnedKey: true to run online-only on purpose, re-fetching the status from the server on every check.
Chrome and Chromium browsers on Manifest V3, plus Firefox. The SDK is a TypeScript module with no runtime dependencies, usable in any extension context.
Because payments are collected in your Stripe account, you are the merchant. Collecting and reporting tax is on your account — Stripe Tax can handle it if you enable it.
Create your account, register your extension, get paid. No credit card.