Skip to content

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.

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.

  1. Each product has a current major version. A licence issued without major takes it.
  2. 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.
  3. 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.

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).

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).

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.

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.