License UX patterns
License UX patterns
The difference between "licensing that annoys" and "licensing that disappears" is what you show your users at the five moments something can go wrong. This page is the copy-paste answer for each.
The five moments
1. Not licensed yet (first run)
Show the key-entry screen (ready-made). Two rules:
- Let them paste. Auto-uppercase, strip spaces, re-insert dashes —
9tmc5ts90mkq...must just work. The recipe helpers do this. - Fail typos locally. Keys carry a checksum; validate the shape before any network call ("That doesn't look like a key — check for typos.").
2. "No seats available" (429)
Someone is already using all the machines this key allows. Don't say error:
This key is already active on {max} machine(s). Deactivate it on a machine you no longer use (Help → Deactivate), or contact support to move it.
3. "License revoked" (403)
Usually a refund. Be calm, don't accuse, give a path:
This license is no longer active. If you believe this is a mistake, reply to your purchase email and we'll sort it out.
4. "License expired" (403)
Subscriptions and trials. This is a renewal moment, not an error:
Your license expired on {date}. Renew it to keep using {app} — your files and settings are untouched.
5. Offline at launch
Never block a launch on your server being down. That's the whole point of offline tokens: the cached token answers locally. Only if there is no cached token and no network, say so honestly:
Can't reach the license server and no license is stored on this machine. Connect to the internet once to activate — after that, {app} works offline.
Grace & re-checking
- Revocation is eventual by design (the honest trade-off).
Re-check a few times a day (Electron recipe ships
startLicenseRecheck) and react on the licensed → lost transition — not on every network hiccup. - Key changes machines: customers reinstalling their OS get a new fingerprint. That's a support flow, not a bug: you press reset seats in the dashboard, they activate again. Tell them this in the error copy above.
Trial notes
Trials are just license types with duration_days — issue them like any key.
Self-serve trial signup (customer triggers their own trial) is on the roadmap;
today the vendor issues trial keys (dashboard, CLI, or your payment webhook).