21 · Licence
The platform is licensed by feature. Each tenant's enabled features must be a subset of the licence in effect.
Where to find it
/admin/license. Requires an ADMIN or SUPER_ADMIN role.
The page is read-only. Status, features, seat counts and expiry are all set centrally on the licence server — the customer can see what they have but cannot self-edit it. The only action on the page is Refresh.
How licensing works
[license-server.portal.kwgroup.org.uk]
│
│ hourly poll
▼
[your platform install]
│
per-tenant licence cache
(refreshed from poll)
📷 Screenshot placeholder: screenshots/license.png
- The canonical licence server is always
license-server.portal.kwgroup.org.uk. New installations bake this in as their default. - The platform polls hourly for updates.
- Licences are signed (HMAC-SHA256) so they can't be tampered with client-side.
- Each licence specifies: list of features, max-tenants, max-users, expiry.
On first install
A new install boots, finds it has no licence file yet, and:
- Calls the licence server with its install fingerprint.
- Receives a 30-day trial licence with all features enabled and the admin tenancy provisioned.
- Saves the licence locally + starts the hourly poll loop.
This means a fresh docker compose up produces a working trial without
any manual licence step.
What the page shows
+----------------------------------------------------+
| Licence [ TRIAL ] |
| Instance ID: abc123… |
| Hostname: portal.kwgroup.org.uk |
| Expires 15/05/2026 (17d left) [↻ Refresh] |
|----------------------------------------------------|
| Features enabled | Max users | Max tenants |
| 27 | 50 | 1 |
|----------------------------------------------------|
| Active features (27) |
| helpdesk crm rmm projects kb esign … |
+----------------------------------------------------+
A licence has one of four statuses: TRIAL, ACTIVE, EXPIRED, or REVOKED.
Once a trial passes its expiry it becomes EXPIRED and an expired- licence banner appears across the portal for everyone.
To convert to paid, contact your licence provider. They issue/activate a licence on the server side and the next poll (or a manual Refresh) picks it up.
Per-tenant features
The licence sets the maximum feature set. Admin tenancy still picks which subset to enable per tenant via Tenants → Features.
Example: licence allows helpdesk + crm + rmm + projects + kb. Tenant
"Acme" only wants helpdesk + RMM → uncheck the others on Acme. They
can be re-enabled later without contacting the licence server.
Refreshing manually
If you've just renewed and don't want to wait for the next hourly poll,
click ↻ Refresh from licence server on /admin/license. The page
re-reads the licence immediately and shows the time it was updated.
There is currently no in-portal upload for a signed licence file and no setting to disable polling. Installs that cannot reach the licence server should speak to their licence provider.
Licence audit
Every poll, refresh, and feature toggle is recorded in the audit log.
Permissions
| Action | Role |
|---|---|
| View licence | ADMIN / SUPER_ADMIN |
| Refresh from licence server | ADMIN / SUPER_ADMIN |
| Toggle per-tenant features | ADMIN / SUPER_ADMIN |
Common workflows
Convert trial to paid
- Provider issues/activates a paid licence on the server side.
- Admin → Licence → Refresh from licence server.
- The expired/trial banner clears.
Add a feature mid-licence
- Provider extends the licence to include
meetings. - Refresh → meetings is now available to enable per-tenant.
- Tenant → Features… → tick
meetings. Users see the new launcher tile once the change propagates.
See also
- Tenants — feature toggles
- Architecture — license-service service