Licensing
How activation codes work, what happens when one expires, what each error message means, and how seats are counted.
A Busabase Premium licence is a single string: a payload and a signature, separated by a dot. The payload says who the licence is for, how many seats it covers and when it expires. The signature is Ed25519, checked against a public key compiled into the build.
That design has one consequence worth stating plainly: verification never touches the network. An air-gapped instance validates its licence exactly like one on the public internet.
Getting a code
Codes are issued from your Busabase Cloud account, under Settings → Self-hosted licence. Signing up for a trial issues a 30-day code immediately; there is nothing to wait for.
This is deliberate. You sign in to the cloud once, to prove who you are and to have somewhere to renew from later. Everything after that happens on your own machine.
Activating
System Admin → Licence, paste, save. It takes effect immediately — no restart.
The page shows what the code actually resolved to: customer name, seats, expiry, plan. Read it before you close the page. A code that activates successfully but says "5 seats" when you bought 50 is a mistake worth catching in the ten seconds after activation rather than the day someone cannot be invited.
When a licence expires
The instance goes read-only. It does not shut down, it does not lock you out, and it does not delete anything.
| Still works | Stops working |
|---|---|
| Signing in | Inviting members |
| Reading everything | Changing member roles |
| Exporting and backing up | Removing members |
| Pasting a renewal code | Other write operations |
The licence page stays reachable while expired, on purpose. It is the one page that has to work when everything else has gone read-only, because it is where the renewal gets pasted.
This is a deliberate choice about what a licence is for. An expired licence means you owe us money. It does not mean you should lose access to your own data, and a product that holds data hostage over a lapsed renewal is not one we want to ship.
Seats
A seat is a member who can sign in to this instance. The count is checked when you invite someone: if the instance is at its seat limit, the invitation is refused with a message saying so, rather than being accepted and silently failing later.
Removing a member frees the seat immediately.
Error messages
Every one of these comes from local verification, so none of them means "we could not reach the licence server".
| Message | What actually happened |
|---|---|
Activation code is empty | Nothing was pasted, or only whitespace. |
Activation code is not in <payload>.<signature> form | The string is missing its dot — usually a copy that caught only part of the code. |
Activation code signature has the wrong length | Truncated in transit. Copy it again, all of it. |
Activation code payload is not valid license data | The payload decoded but is not a licence. Check you did not paste an API key. |
This activation code is for '<product>', not Busabase Premium | A code for a different product. |
Activation code is not valid. | The signature did not verify. Either the code was altered, or it was not issued by us. |
If a code you were definitely issued fails to verify, do not retype it by hand — that is how the "wrong length" cases happen. Copy it again from the cloud settings page.
Renewing and replacing
Paste the new code over the old one. There is no separate "deactivate" step, and the change takes effect without a restart. If the instance had gone read-only, writes resume the moment the new code verifies.
Configuration reference
Every environment variable the self-hosted deployment reads — what it does, what happens if you get it wrong, and whether changing it needs a restart.
Backup and restore
The three things you have to back up, a script that does all three, and a restore drill you should run before you need it.