Perpetual, yearly or subscription: choose a licence model
How you price your app decides how you issue its licences. Sealcord supports four models with the same key format, so your app’s check is the same for all of them; only what the key carries and what ends the licence differ.
| Model | How you issue it | The key carries | What ends it |
|---|---|---|---|
| Perpetual | No expires_at |
No expiry | Only a revocation, for example after a refund |
| Perpetual, paid major upgrades | No expires_at; major is the version you sold |
No expiry, a major | A build of a later major version refuses the key |
| Yearly, or any fixed term | expires_at, the end of the term |
The end date | The date passes; renewing issues a new licence |
| Subscription | No expires_at, from a payment integration |
No expiry | The subscription ends: the integration expires it |
A trial is a fifth case: a licence with an end date that a purchase replaces or, for a subscription, converts.
Perpetual
Section titled “Perpetual”Issue without expires_at. The key never expires, and the licence ends only if you revoke it. This
suits a one-off price, and is the default when you issue from
your backend.
Perpetual, with paid upgrades to a new major version
Section titled “Perpetual, with paid upgrades to a new major version”A key carries the major version it was sold for, and a licence covers that major version and every earlier one. Your app’s build knows its own major version and checks it offline, so a version 2 build refuses a key sold for version 1.
- Each product has a current major version. A licence issued without
majortakes it. - When you ship version 2, change the product’s current major to 2 in the Console or with
PATCH /v1/admin/products/{id}(reference). New licences are then for version 2. - Customers with a version 1 key keep using version 1 builds. Selling them the upgrade is a new licence for version 2, at whatever price you choose.
Yearly, or any fixed term
Section titled “Yearly, or any fixed term”Issue with expires_at, the end of the term. The key carries the date, so the app knows the end with
no network, and the licence stops activating once it has passed. The dates in a key never change
after issue, so renewing is a new licence with a new key, issued when the customer pays again.
Through Polar or Stripe, set the product mapping’s key_valid_days to put an end in every key it
issues, and a renewal link so customers whose licence has ended see where to renew
(Polar, Stripe).
Subscription
Section titled “Subscription”Sell the subscription through a payment integration. Its key carries no expiry, because the subscription has none: when the provider says the subscription has ended, the integration expires the licence, or revokes it if the mapping says so. Your app learns it at its next status call, and its stored verdict lasts at most seven days, so a lapsed subscription stops working within a week, online or offline (verdicts).
Without an integration, your backend does the same: issue without expires_at, and call
POST /v1/admin/licences/{id}/expire when the subscription ends
(on a cancellation).
Questions
Section titled “Questions”Can I change a licence’s model later?
Section titled “Can I change a licence’s model later?”Not on the same licence: its dates and major version are in its key, which never changes. Issue a new licence in the new model, and revoke or expire the old one.
Do expired and revoked licences count towards my plan?
Section titled “Do expired and revoked licences count towards my plan?”No. Only active licences count, trials included.
Which model is best for a first app?
Section titled “Which model is best for a first app?”Sealcord does not decide that. A perpetual licence is the simplest to issue and to explain; a subscription needs a payment provider that sells subscriptions and an integration to end licences on time.