Licensing Models¶
A plan's license_type and license_model, combined with the support window, express five commercial models. This page explains each and how a license behaves under it.
The status lifecycle¶
Every license has a status:
| Status | Usable? | Meaning |
|---|---|---|
active |
✅ | Normal, in-force license. |
trialing |
✅ | Inside a trial window. |
past_due |
✅ (grace) | Payment failed; still usable during grace/dunning. |
canceled |
until period end | Subscription canceled; usable until valid_until. |
expired |
❌ | Past valid_until + grace. |
suspended |
❌ | Manually paused by an admin. |
revoked |
❌ | Permanently killed. |
verify (and other SDK checks) collapse every unusable/unknown case into a single 404 LICENSE_NOT_FOUND — see Security.
1. Subscription¶
license_type: subscription. Recurring billing via Stripe. The webhook advances valid_until each period; a failed payment moves the license to past_due and starts the dunning email ladder. After the grace period the license expires.
- Set
stripe_price_idto a recurring Stripe Price. grace_dayscontrols how long apast_duelicense keeps working.
2. Perpetual¶
license_type: perpetual. A one-time purchase; the license never expires (valid_until stays empty). The customer owns this version forever.
- Set
stripe_price_idto a one-time Stripe Price (or issue manually). - No renewal, no dunning.
3. Trial¶
license_type: trial with trial_days > 0. On creation the license gets status: trialing and valid_until = now + trial_days. When the window passes, the hourly checker flips it to expired and sends the trial-expired email.
- Trials can be issued directly (admin API) or via a Stripe checkout on a trial plan.
- An expired trial fails
verify(404), so your client falls back to its unlicensed behavior.
Trials don't auto-downgrade
When a trial expires it becomes expired, not "reverted to free." If your model is free-with-trial, keep the free tier as a separate license the client falls back to, rather than expecting the trial license to become a free one.
4. Floating (concurrent)¶
license_model: floating (on a saas/hybrid product). Instead of node-locking to devices, a floating license allows up to max_activations concurrent sessions. Clients check out a session, send heartbeats, and check in when done; idle sessions time out after floating_timeout minutes and free the slot.
Endpoints: POST /license/floating/checkout, /floating/heartbeat, /floating/checkin.
5. Perpetual + paid support¶
A perpetual license (never expires) plus a separate, time-boxed support window that gates updates — the JetBrains model, also known as perpetual fallback. The license keeps working forever, but access to new releases stops when support lapses; the customer keeps every version published while their support was active (the "fallback") and renews to receive newer ones.
This is powerful enough to have its own page: The Support Window.
Choosing a model¶
| You want… | Use |
|---|---|
| Recurring revenue, feature gating | Subscription |
| Sell-once, own-forever | Perpetual |
| Time-limited evaluation | Trial |
| Shared seats across a team/lab | Floating |
| Sell-once but charge for updates/support | Perpetual + paid support |
These aren't mutually exclusive across your catalog — different plans on the same product can use different models.