License states: what each one stops (self-hosted, week 21)
A self-hosted EntryWick degrades when its license is not in order — it never locks. This page says what each state
means, what the admin's license banner shows, and what keeps working. PRICING_ENTITLEMENTS §5, ADR-020.
How a key is put in: license-keys.md. Where revoked comes from: heartbeat.md.
Who opens it: an Owner or Admin who sees the license banner; whoever runs the install.
What they came to do: understand what the banner means, what has stopped, and what to do about it.
What must be true when they leave: they know that check-in, published events and their data are never held hostage — and exactly which buttons say no, until when, and what makes them say yes again.
Never stopped, in any state
- Check-in: the scanner app, scanning, search, manual check-in and overrides, kiosks, scanner API keys, and a phone's offline batch upload when it comes back online.
- Events already published: public pages and registration, tickets, scheduled messages, outgoing webhooks.
- Reading and exports, in the admin and through the API.
The states
| State | When | Banner (Owners and Admins) | What stops |
|---|---|---|---|
| Active | Up to and including valid_until (UTC) |
None (or a quiet line for a new version or a notice) | Nothing |
| Grace | The 30 days after valid_until |
"The license key expired on …: N days of grace left" | Nothing yet |
| Expired | From the 31st day after valid_until |
"The license key expired on …" | Publishing a new event; updates |
| Missing key | EW_LICENSE_KEY is empty |
"This instance has no license key" | As expired |
| Key cannot be verified | A typo, a key for another build | "The license key on this instance cannot be verified" | As expired |
| Revoked, counting down | The license server answered revoked |
"…was revoked. In N days, on …, the admin and the API become read-only" | Updates (at once) |
| Read-only | Seven days after the first revoked answer |
"This instance is read-only: its license was revoked" | Every change in the admin and through the API, including publishing; updates |
| Unreachable | The license server has not answered for 30 days | "The license server has not answered for N days" | Nothing — a warning only |
When more than one applies, the banner shows the most severe (read-only, revoked, expired, cannot be verified,
missing, grace, unreachable, then a new version and notices). Notices from the license server are listed under it.
Nobody without tenant.update (below Admin) sees the banner. A key whose start date is still ahead publishes and
updates normally.
Read-only keeps exactly what a suspended organization keeps on the cloud: members can read, export and do
everything under check-in; nothing else, Owners included. API keys keep reads and POST /exports; other calls answer
403 instance_read_only. It applies to every organization on the instance.
Publishing refused shows in the event's Publish dialog before anyone presses it, and through the API as
422 license_not_valid with error.validity (expired, missing, invalid).
Getting out of it
- Grace, expired, missing, cannot be verified: put the renewed key in
EW_LICENSE_KEY, restart the containers, and runphp artisan ew:license:check. Publishing and updates come back at once. - Revoked or read-only: once EntryWick reinstates the license, the next daily heartbeat (03:45 UTC) — or
php artisan ew:license:check --heartbeatnow — clears it everywhere. - Unreachable: let the server reach
license.entrywick.ioover https.
For the update tool
php artisan ew:license:check --json prints one JSON object: hosting, validity, reason, key_prefix,
license, organization, channel, valid_from, valid_until, grace_ends_on, condition (the banner's state),
publish_allowed, updates_allowed, read_only, revoked_at, read_only_after, days_unreachable,
unreachable_warning, version, latest_version, update_available, notices, and the last heartbeat's times and
error. On the cloud it prints {"hosting":"cloud"}. It always exits 0: updates_allowed: false is a state, not a
failure of the command.