Usage-based pricing is part of the Pro plan and above. Below Pro the
editor shows the section locked, and the API answers
403 FEATURE_LOCKED.1
Set it up on the subscription
In the subscription editor, open Usage & seats. Turn on Charge per
seat and/or Charge for usage, then add a meter (for example
api_calls).2
Sell
Buyers choose their seats on the checkout page. The subscription price is
charged for those seats every period, like any subscription.
3
Report usage from your app
Call
POST /subscriptions/{id}/usage with an API key whenever a
subscriber uses something billable. Send an idempotencyKey so retries
never count twice.4
We bill the overage
When the period ends we total each meter, take off the included units,
price the rest and charge it with one payment. You get a
usage.period_closed webhook with the totals and the charge status.Per-seat pricing
- Price is the price of one seat. A buyer with 5 seats pays price × 5 every period.
- Minimum / maximum seats bound what buyers can pick at checkout and in their portal. Leave the maximum blank for no maximum (up to 10,000).
- Adding seats (from the buyer’s portal, your dashboard or
POST /subscriptions/{id}/seats) takes effect at once. Seats above the number bought at checkout are billed at the end of the period, prorated by the time they were held: two extra 12 × 24/30 = $19.20. - Removing seats works down to the number bought at checkout. The subscription price already covers those every period, so going lower means cancelling and subscribing again with fewer seats.
- License keys. Turn on Issue a license key per subscriber and each
subscriber gets one license key whose
activation limit is their seat count. When seats change, the limit follows.
When the subscription is canceled or expires the key stops validating, and
it turns back on if the subscription resumes (a key you switched off
yourself stays off).
Your app validates the key with the usual license endpoints (the
productIdis the subscription offer id).
Metered usage
A meter has:
All amounts are computed in integer cents and each line is rounded half up to
the cent once.
Tiers
Tiers count billable units — what is left after the included units.- Graduated: each tier prices the units that fall inside it. With tiers “up to 100,000 at 0.50 / 1,000”, 150,000 billable calls cost 25 = $125.
- Volume: every unit is priced at the tier the period’s total reaches. The same 150,000 calls cost 150 × 75.
- A tier’s flat fee is added once when any unit lands in it.
Prices are copied onto each billing period when it opens, so a price change
applies from the next period, never to usage already being counted.
Billing periods
Usage periods follow the subscription’s renewal date (weekly 7 days, monthly 30 days, yearly 365 days). A report belongs to the period itstimestamp
falls in; a period’s end is exclusive. Once a period has closed, reports for it
are refused with 409 PERIOD_CLOSED, so send usage promptly (or without a
timestamp to use the current time).
How the overage is charged
- One off-session charge per period, to the card the subscription pays with, with the same platform fee as your other sales.
- Exactly once: a period can only close once, and the charge carries a fixed idempotency key, so a retry is always the same payment.
- A paid overage is a normal order: it appears in Orders and on the
subscriber’s payment history as Usage (
billingReason: "usage"), the buyer gets a receipt, and it counts in your analytics. The platform fee is stored on the order like on any other sale. Integrations (webhooks, Zapier) get the sameinvoice.payment_succeededevent as a renewal, withbillingReason: "usage". - If the card can’t be charged the period shows Failed; if there is no
saved card, payments are paused or the payouts account is missing it shows
Due. Both are retried automatically 1, 3, 5 and 7 days after the
first failure — the same schedule as a failed renewal — each retry once.
After the last one fails the overage is Uncollectible: we stop trying
and email you. Unpaid amounts appear on the subscriber page as
Outstanding, and the
usage.period_closedwebhook tells you the status so you can follow up (for example limit the account in your app).
Where to see it
- Subscriber page: usage this period (a daily chart per meter), the line items with the upcoming overage, the seat changer and past periods with their charge status.
- Buyer portal: the subscriber sees usage this period, can add or remove seats (from the signed portal link) and sees their license key.
- API / MCP:
GET /subscriptions/{id}/usageand theget_subscription_usageMCP tool return the same data.
API
See Usage billing API for every endpoint with curl and SDK examples, and Webhook events forusage.recorded and usage.period_closed.