Licensing models
How to sell your software with Keygate: subscriptions, perpetual licenses with or without a maintenance period, free trials, device limits and team seats.
A product can be sold in more than one way at the same time. You might offer a monthly subscription, a yearly one and a perpetual license side by side, each with its own price and limits. In Keygate each of these is a plan.
Plans
Create plans under Plans in the dashboard. The settings that matter most:
| Setting | What it controls |
|---|---|
| License Type | subscription, perpetual or trial. The sections below explain each. |
| Billing Interval | Monthly or yearly, for subscriptions. |
| Max Activations | How many devices or users one license can be active on at once. |
| Max Seats | How many team members a license can hold, for team products. |
| Grace Days | How long a license keeps working after its end date, to give a late renewal time to arrive. |
| Check in interval | How many days your app may run offline before it must check in again. |
| Stripe price | The Stripe price a customer pays for this plan. |
| Features | What the plan unlocks. See Features and usage limits. |
Every plan also gets a checkout link of its own, which is how customers buy it. The Stripe guide covers that part.
Subscriptions
The customer pays every month or every year, and the license stays valid as long as they do. Keygate follows the subscription in Stripe: a renewal moves the license's end date forward, a failed payment marks it past due, and a cancellation lets it run to the end of the period already paid for.
Your app does not need to know about any of this. It asks whether the license is valid and gets a yes or a no, along with the date the license currently runs to.
Perpetual licenses
The customer pays once and owns the license for good. It has no end date and never needs renewing. This suits apps people buy the way they used to buy boxed software.
Perpetual with an update period
This is the model JetBrains made familiar. The customer pays once and keeps the version they have forever, but new releases are only included for a period, typically a year. After that the app keeps working; it just stops receiving updates until the customer renews.
To set it up on a perpetual plan:
- Set Updates Included (days) to the length of the update period that comes with a purchase, for example 365.
- Set Renewal Length (days) and a Stripe Renewal Price ID, a one time price, so customers can extend the period from the customer portal.
Each license then carries an updates_until date. Keygate's update feeds and download endpoint only offer releases published before it, and the signed token your app receives carries the same date, so the app can enforce it too.
Trials
A trial plan gives full access for a set number of days, then stops. There are two ways to use it.
- Free trial without payment. Issue trial licenses from the dashboard or from your backend through the admin API. When the days run out, the license expires and your app sees it.
- Trial that turns into a subscription. Sell the plan through Stripe with a trial period. The customer starts on the trial, Stripe charges the card when it ends, and the license becomes an active subscription. If the charge fails, the license goes past due like any other subscription.
A trial that expired can be given more time: set a new end date on the license in the dashboard and it starts working again.
Devices and seats
Not sure which limit fits your product? Node locked vs floating compares the options.
Device limits
Max activations caps how many devices can use one license at the same time. Activating a device the license already knows does not use another slot. When all slots are taken, a new activation is refused, and the customer frees one by deactivating an old device, either from your app or from the customer portal.
Floating licenses
If people share a pool of seats across many machines, use a floating license instead: any machine can take a seat, and the seat comes back when the app closes or stops checking in. See Floating licenses.
Team seats
For products sold to teams, max seats sets how many people a license can hold. The customer adds and removes members in the customer portal, and invited members receive an email to join. The product type decides which limit applies: desktop products count devices, SaaS products count seats, and hybrid products count both.
License status
Every license has a status. Your app mostly cares whether the license works, and the table says when it does.
| Status | Meaning | Works? |
|---|---|---|
active | Paid for or issued, and in use. | Yes |
trialing | On a trial. | Yes |
past_due | A subscription payment failed and Stripe is retrying it. | Yes, while reminders go out |
canceled | The subscription was canceled. | Until the end of the paid period |
expired | The end date and the grace days have passed. | No |
suspended | Paused by an admin, or the subscription was paused in Stripe. | No, until reinstated |
revoked | Switched off for good, for example after a full refund. | No |
Active, trialing and past due licenses keep working for the plan's grace days after their end date. A canceled license stops exactly at its end date, since the customer chose to leave.
Changing plans
Customers who pay through Stripe change plans in the customer portal, for example from monthly to yearly. Stripe works out the difference and Keygate moves the license to the new plan.
For licenses that are not billed by Stripe, an admin can change the plan from the license page in the dashboard. Licenses billed by a Stripe subscription can only be changed through Stripe, so the two never disagree about what the customer is paying for.
Last updated October 4, 2026