Plans, free mail and signup
Zappocity sells mail by plan. Every customer (a tenant) is on exactly one plan, and the plan decides how much they may use and which features they get. The SaaS administrator sets all of it; nothing is hard-coded.
Managed from Zappocity
Mailocity's plans, their limits and their features are managed in Zappocity: in the admin panel under Products → Mailocity → Limits and features (and New plan), with PUT /v1/platform/products/mailocity/plans/{plan} or corpsuite zappocity plan set. Prices are set there too. For one customer, open their organization and choose Features on the subscription to switch features on or off for that team only, over its plan (/v1/platform/subscriptions/{id}/features, corpsuite zappocity subscription features set). Mailocity keeps and enforces them, so mail works even if Zappocity cannot be reached; team admins can still change features for single users within what the team has. The Mailocity Plans page keeps what signup offers.
Kinds of plan
| Kind | Users | For |
|---|---|---|
| Free | 1 | Free mail on one of the platform's shared domains |
| Solo | 1 | One person paying for mail, optionally on their own domain, with no team to set up |
| Team | many | A company or group with several users and domains |
Three plans are created for you: Free, Solo and Team. You can change their names, limits and features, add more plans of any kind (for example a "Student" free plan or a "Team 100" plan), stop offering a plan, and delete a plan nobody is on.
Limits
Each plan sets:
- Users (always 1 on free and solo plans). A tenant's own seat limit can be lower; the lower number wins.
- Custom domains. 0 means the customer only has addresses on shared domains.
- Aliases: for the whole tenant, per user, and of those on shared domains per user (the free-mail names users take for themselves, such as
ali@freemail.example; 0 allows none). - Storage per user.
- Largest message, for mail received, sent or stored.
- Sending per hour and per day, counted in recipients, and recipients per message.
Any limit can be Unlimited (tick the box beside it; -1 in the API and command line): unlimited storage, sending, aliases, domains, users and so on.
A team can have its own limits in place of its plan's (the team's page, Team limits; corpsuite tenant limits set TEAM quotaBytes:=-1): the per-user ones (storage, largest message, sending, recipients, aliases) and the team's own (domains, aliases). The team's user cap is its seat limit, which can be unlimited too.
Storage, largest message, the three sending limits and the user's aliases (and their aliases on shared domains) can also be set for one user (the user's page, Limits; corpsuite mailbox limits set). A user's own limit comes first, then the team's, then the plan's. A team's admins can only lower their users' limits. See Sending limits.
Changing a plan's limits applies to everyone on it immediately. Lowering a limit never deletes anything; it only stops further growth (for example, a mailbox over its new quota stops accepting mail until it is under it again).
What happens at a limit:
| Limit | What the user sees |
|---|---|
| Storage | Senders get "mailbox full" and retry later; IMAP and JMAP report over quota |
| Largest message | The sender gets "message too big" |
| Sending per hour or day | The mail app gets "sending limit reached, try again later" |
| Recipients per message | Recipients past the limit are refused |
| Users, domains, aliases | The admin API answers 409 with the limit, the number used and the maximum |
Features (entitlements)
A plan switches features on from a fixed list: webmail, IMAP, mail-app sending (SMTP submission), plus-address folders, forwarding (mail filters that redirect to other domains), calendar, contacts, tasks, notes, chat on the shared or a dedicated server, meetings, files, API access, a dedicated IPv4 address and priority support.
IMAP, mail-app sending, plus-address folders, forwarding, team administration, team signup and API access are enforced today: a free plan without IMAP, for example, refuses mail-app sign-ins with "not included in your plan". The others can be set on plans now and take effect as each feature ships.
Features for one user
A user can have fewer or more features than their plan. On the tenant's page, Features on a user lists them: untick one of the plan's to turn it off for that user only (for example IMAP for a shared front-desk account), or tick one the plan lacks to give it to that user alone. A team's own admins can turn plan features off for their users in the domain admin panel, but only the operator can give more than the plan. From the command line: corpsuite mailbox features USER and corpsuite mailbox features set USER off:='["imap"]'. The change applies at the user's next request; mail apps already signed in over IMAP stop at their next account check.
Shared domains and free mail
Shared domains are the platform's own domains, such as freemail.example. Accounts of any customer can have addresses there, which is how free mail works. You choose which shared domains are offered on the signup page. Users on a plan with Own aliases can take aliases on shared domains open for signup (webmail, Settings → Addresses); reserved names are refused as at signup, and the plan's and user's shared-domain alias limits apply. Team admins and the admin API make aliases only on the team's own domains. A shared domain cannot be removed while anyone has an address on it.
A shared domain can become one team's own (for example the platform's own domain for the platform's own team): Give to a team on its page (corpsuite shared-domain assign DOMAIN tenantId=ID). Every mailbox and alias on it must already be that team's; it becomes the team's proved domain, with its settings, keys and reports, and leaves the signup page. A team asking for a shared domain itself is told it is shared.
Signup
Signup is closed until you open it. There are two switches:
- Free signup lets anyone create a free account on an offered shared domain. It is active immediately.
- Paid signup lets people choose a solo or team plan. The account is created pending: it cannot sign in or receive mail until billing confirms payment and activates it.
A plan appears on the signup page only when it is marked for signup and the matching switch is on. Protections:
- Reserved names, such as
postmaster,abuse,adminanddmarc-reports, cannot be taken on shared domains. You can edit the list. - Each network address may make a limited number of successful signups per hour (3 by default, adjustable) and 30 attempts per hour.
- Passwords must be at least 12 characters.
Through Zappocity
While single sign-on is on, accounts are made with a Zappocity account. The signup page first asks people to Continue with Zappocity: they sign in at zappo.city, or create their account there (confirming its email), and come back to choose their address. The mailbox has no password of its own: it signs in through that Zappocity account, and mail apps use app passwords. No verification code or captcha is asked on the way back, since the confirmed Zappocity account stands for them; the other protections above still apply. The sign-in lasts 30 minutes and makes one account.
Approving signups
Signups can wait for your approval before they work; see Sign-in security.
Upgrading: free to solo, solo to team
A customer converts by moving to another plan. Free to solo keeps their address and adds whatever solo includes, such as their own domain. Solo to team keeps everything and allows more users; the seat limit rises to the team plan's user limit unless billing sets a different number. Free to team works the same way.
Moving to a smaller plan is refused while the customer uses more than it allows (for example, two users on a one-user plan); the answer says which limit is in the way.
Retiring a plan
Retire a plan you no longer sell but still honour, such as an early-adopter plan: Plans → Retire in the Mailocity panel, with a note on why (corpsuite plan set early retired:=true retiredNote="Honoured for 2026 teams").
- Teams already on it keep it, with its limits and features, and saving their settings keeps it too. Its customers keep its price at renewal.
- No other team can move to it, no new Zappocity subscription can take it, and signup and invitation links stop offering it. (The plan for invitation links cannot be retired; choose another first.)
- The plans list and Zappocity's Products show it as retired with the note and how many teams or customers are on it.
- Bring back undoes it; the plan is then inactive until you make it active again.
A plan with teams on it cannot be deleted; retire it instead.
Where to set it
Use the SaaS admin panel at /admin: Plans for plans, limits, features and what signup offers; Settings for the signup switches, reserved names and per-network limit; Shared domains for the domains on offer; and a tenant's page for its plan, status and usage. The public signup page is at /signup. The in-app upgrade button comes with webmail. The same settings are in the provisioning API:
| Setting | API |
|---|---|
| Plans, limits and features | GET/POST /v1/plans, GET/PATCH/DELETE /v1/plans/{plan}, GET /v1/entitlements |
| Open or close signups, reserved names, per-address limit | GET/PATCH /v1/settings |
| Shared domains | GET/POST /v1/shared-domains, GET/PATCH/DELETE /v1/shared-domains/{domain} |
| Move a customer to another plan, activate a paid signup | PATCH /v1/tenants/{tenantId} with plan or status |
| A customer's usage | GET /v1/tenants/{tenantId}/usage |
The public signup page uses GET /api/signup/options and POST /api/signup (see api/signup.yaml).