Choosing a licensing model

A licensing model is a kind of license customers ask for, such as floating or node-locked. Each is a few settings on a KeyGrant license model, the object you configure: find yours below.

One license model is often several of these at once. A perpetual Pro edition for one machine, that only its buyer can activate, is perpetual, node-locked, user-locked and a feature license together.

  • Perpetual: A key that never expires.
  • Time-limited: A key that stops: a term bought once, a subscription, or a trial.
  • Floating: A pool of seats the customer's machines take and give back.
  • Node-locked: A key held to one machine.
  • User-locked: A key only its buyer can activate on a new device.
  • Feature: Editions and add-ons, read by your app offline.
  • Metered: Uses counted against a key, such as exports or renders.
  • Offline: An app that runs without the network, for days or for good.

Perpetual

A key that never expires, unless it is issued with an expiry. It is the usual way to sell a version. Set:

  • How it expires: Perpetual.
  • Versions: Version sold, so a key sold for 2.4 runs every 2.x release.
  • Upgrade protection, if you want it: 1 to 120 months from the sale, during which the key takes the new versions released and keeps the newest one it ran.

To sell a later version to the same key, sell a model as an upgrade. See Licensing by version, in particular Upgrade protection and Sell an upgrade.

Time-limited

A key that stops. Choose how under How it expires:

  • Timed: one payment buys a term, 1 to 3,650 days or 1 to 120 months, or runs to a date. Buying again extends the same key. See Timed models.
  • Subscription: sold through Stripe, it renews with each payment; issued by hand or from your server, it does not renew on its own: extend it from your server on each renewal. See Subscriptions.
  • Trial: a trial key runs the model's trial length. A trial from the app with no key is a device trial, set on the product. See Trials.

On a timed or subscription model, set Grace after expiry, days so a customer who renews a little late is never stopped. Such a key's leases carry its end, so an app that is offline stops on time and never sooner. See Perpetual, subscription, trial, timed.

Floating

A pool of seats the customer's machines share. Set:

  • Devices per license: the size of the pool, from 1 to 1,000.
  • Free unused seats, if you want it: from the model's Offline days to 365 days, so a machine that stops using the app gives its seat back. At a few days, with Offline days no longer, it does so within days of going quiet.

Also:

  • KeyGrant counts devices, not copies of the app running at once: a device keeps its seat while the app is closed, until the app calls deactivate(), you release the seat, or Free unused seats frees it.
  • A full pool refuses a new device with limit, and your systems hear device.limit_reached. A customer can buy more seats as an upgrade of Devices.

See Device limits and seats, Release a seat, Free unused seats and Sell more devices.

Node-locked

A key that runs on one machine. Set Devices per license to 1.

  • The SDKs identify a machine by the operating system's own ID, and a seat activated with it is held to that machine: a license copied to another is refused with reason device.
  • To move machines, the customer deactivates the old one or you release its seat. KeyGrant reports a seat seen on a second machine with device.shared.

See How a device is identified (on iOS and Android, the Dart / Flutter SDK), Holding a license to its device and A license used on several machines.

User-locked

A key only its buyer can activate on a new device. KeyGrant knows the buyer by the email on the key, not by an account. Set Who can activate to:

  • Only the buyer: they type their email, which stops a key being shared casually; or
  • Only the buyer: a code is emailed to them, which proves the address is theirs.

Only a new device is asked; an app already activated, or offline, never is. See Who can activate.

Feature

Editions and add-ons as entitlements: names with an on/off flag, a number or a text value, such as cloud_sync, seats: 5 or edition: "pro".

  • Sell each edition as a model, and list what it grants under its Entitlements.
  • To sell a step up to the key a customer holds, sell a model as an upgrade of Entitlements.
  • Every lease carries them, so your app reads them offline with has() and require().

See Editions & entitlements and Sell an edition upgrade.

Metered

Uses counted against a key, such as exports or renders. Set:

  • On the product's Meters tab, what to count, at most 8 a product.
  • On the model, under Metered uses, the meters and their uses: 1,000 exports for good, say, or, on a subscription, 50 renders that come back each billing period.
  • To sell more uses, a model sold as an upgrade of Uses.

Your app spends them with use(), within its Offline allowance while KeyGrant cannot be reached. A used-up meter refuses spends but never takes the license away. See Metered uses and Sell more uses.

Offline

Every key works offline, and a machine that never goes online can have a file instead:

  • Offline days: how long the app runs without the network, 1 to 90, or 30 days for a perpetual key and 7 for the rest when the model sets none. An outage, a timeout or a server error never takes a valid lease away.
  • License file: a perpetual model Delivered as a License file sells a signed file that works offline for good, with no seat limit, and that cannot be revoked.

See Offline validation & grace, and Delivered as among the terms of a license model.