Enterprise Licenses

Issue Description

I purchased additional licenses They haven’t synced to my server I went in as the support system recommended and ran actions actually multiple times over a couple of weeks now. And the server is still not getting the additional 25 licenses that I bought I need some help help help We’re at capacity and I have users that have no email now We’re at capacity and I have users that have no email now

Actual Behavior

I click on Actions Server Actions and it says there’s nothing

Stalwart Version

v0.16.x

Installation Method

Binary (Linux)

Database Backend

RocksDB

Blob Storage

RocksDB

Search Engine

Internal

Directory Backend

Internal

Additional Context

I’ve looked at the fact and believe I’ve done everything there

I have reviewed the documentation and FAQ and confirm that my issue is NOT addressed there.

on

I have searched this support forum (open and closed topics) and confirm this is not a duplicate.

on

I understand that topics in this category are triaged by a bot first but a human reply will follow up. If I’d prefer a human-only reply, I’ll add the no-ai tag to my topic.

on

This looks like a licensing/config issue rather than an “action” issue. Enterprise licenses are not automatically pushed to the server — buying more mailboxes on the licensing portal generates a new license string, which you then have to manually install:

  1. Go to https://license.stalw.art and get your updated license key (it should now reflect the additional 25 mailboxes).
  2. In the WebUI, go to Settings → Enterprise, and paste the new key into the licenseKey field (or update the referenced file/env var if you’re using a secret reference).
  3. Save, then run the Reload: Server settings action (actionReloadSettings) from the CLI or Actions menu so the server picks up the new key.
  4. Log out and back in — Enterprise license changes only become visible in a fresh session.

“Server Actions” showing nothing is expected once there’s no pending action to run; it isn’t a sync mechanism for licenses. If after installing the new key and reloading/relogging your mailbox limit still doesn’t reflect the extra 25 licenses, double check on the licensing portal that the purchase was actually applied to the same license/domain you have configured on this server (a separate license string may have been generated). If it still doesn’t match after that, this is something a staff member will need to check on the licensing side.

Reference: Enterprise License | Stalwart

This is an automated reply from the Stalwart Help Bot. Other community members may follow up if this answer is incomplete or wrong.

Buying the seats does not push anything to your server, which is why nothing changed. The seat count is signed into the license key itself, so until the server gets a new key it keeps enforcing the old number, and restarting or reloading only re-reads the key it already has. The server only calls back to license.stalw.art in three situations: the key is within four days of expiring, the key it has is unreadable, or the key field is empty and an API key is set. A purchase does not trigger any of those.

The Actions page was never going to help either. That list is a fixed set of reload, cache and queue actions, and none of them touch licensing, so nothing was missing when it looked empty. That said, an empty Actions page is itself a symptom: it renders empty when your session has no action permissions, and one way that happens is the Enterprise license being inactive, which also downgrades a tenant-scoped login. If your account count is above the licensed limit, the license is treated as not valid at all, and you would see a line in the log saying the key is valid but only allows N accounts while M were found. Search your log for server.licensing: the startup line prints your licensed domain, the seat total and the validity dates, and that is the only place the number the server enforces shows up.

Two ways to get the new key in once it exists: paste it into Settings, Enterprise, licenseKey and reload settings; or clear licenseKey while leaving your API key set, which forces a fetch from the portal on the next reload. Log out and back in afterwards.

Before you try either, send me the domain the licence is issued to and that server.licensing line, and I will check on our side whether the 25 seats landed on your record at all. If the portal is still signing the old count then nothing you do on the server will change it, and that is the more likely explanation given you have been at this for two weeks.

Through the reply FYI the action instructions came from another post and Support portal portal and I believe it was from Support admin not from another user.

Anyways I tried a lot of different things but what I ended up doing is have my AI agent go and try to fix it and here he did and here’s what he did to fix it. Maybe this will help others with the problem:

I fetched the updated vendor-signed key directly from Stalwart, applied it with the official CLI, restarted Stalwart and its proxy, and verified both admin sites, Enterprise tenant access, SMTP/IMAP, and mailbox login. No license errors appeared.

A checksum-protected rollback backup was made first; no mailboxes were created or deleted.

My AI agent actually did a full write up here you go:

Solved: additional Stalwart account licenses were not syncing

I fixed this on Stalwart v0.16.4 running in Docker.

Root cause

The server still had a valid signed 25-account license installed. In this release, Stalwart’s automatic renewal logic only contacts the licensing service when the current license is invalid or within roughly four days of expiration. Because the old license remained valid until 2027, purchasing more accounts did not automatically download the updated entitlement.

Also, separate 25-account keys do not stack. The server needs the newly issued signed key that contains the full 50-account allowance.

What fixed it

  1. Back up the current Enterprise settings and license material.

  2. Manually request the current signed license from Stalwart’s licensing API using the auto-renewal API key:

curl -fsS \
  -A 'Stalwart/0.16.4' \
  -H "Authorization: Bearer ${STALWART_API_KEY}" \
  "https://license.stalw.art/api/license/example.com" \
  -o new-license.key

Replace example.com with the domain to which the license was issued. Keep both keys private.

A normal Python HTTP client was rejected by Cloudflare with error 1010, but the request worked when sent with a Stalwart user agent.

  1. Confirm the returned key is different from the installed key and contains the expected domain and total account count. In my case, the licensing API returned a vendor-signed 50-account key.

  2. Apply the new license key and the auto-renewal API key through the official CLI rather than the WebUI. I used the official Docker image:

docker pull stalwartlabs/cli:latest

docker run --rm -i \
  -e STALWART_URL=https://mail.example.com \
  -e STALWART_USER=admin \
  -e STALWART_PASSWORD \
  stalwartlabs/cli:latest update Enterprise --stdin

The JSON submitted on stdin was:

{
  "licenseKey": {
    "@type": "Value",
    "secret": ""
  },
  "apiKey": {
    "@type": "Value",
    "secret": ""
  }
}

Using stdin avoids placing the license value directly in shell history. If a temporary JSON file is used, protect and delete it afterward.

  1. Restart Stalwart, wait for it to become healthy, and restart any reverse proxy or network-namespace bridge that depends on the container.

  2. Log out and back into the WebUI, then verify the Enterprise status, account count, and logs.

Result

The server now reports 25 accounts in use out of 50 licensed, leaving 25 available. Enterprise APIs, admin access, SMTP, and IMAP all remained healthy, and there were no license errors after restart.

The key step was manually retrieving the newly issued combined entitlement and applying it with stalwart-cli; repeatedly pasting the old key into the WebUI could never increase the limit.