Appearance
Provisioning tenants
Who this is for: Platform operators
What you'll achieve: Create a blank school tenant with an owner login
Every tenant starts blank — no example school data is injected. Seeded defaults include grades, capabilities, duty types, and default notification rules/templates.
Option A — Web operator console
- Set
OPERATOR_API_TOKENin production (orOPERATOR_AUTH_DISABLED=1locally). - Open
/operator/loginand authenticate with the operator token. - Enter subdomain, school name, owner email, temp password, plan, and seat limit.
- Submit to create the tenant.
- Share
https://{host}/t/{subdomain}/loginand owner credentials.
Option B — CLI
bash
export OPERATOR_API_TOKEN=your-token
pnpm tenant:create -- --subdomain riverside --name "Riverside Primary" --email admin@riverside.test --plan trial --seats 50Option C — Self-serve (Stripe)
Schools sign up at /signup → Stripe Checkout → webhook creates tenant and emails welcome credentials. See docs/BILLING_AND_HOSTING.md in the repository.
Multi-site trusts (Phase 9)
Today, all provisioning creates a single-site tenant. Multi-site org signup (MAT, federation, company with several schools) is planned for Phase 9d. See docs/MULTI_SITE_AND_ORGS.md.
Feature flags (operator)
Post-pilot features are controlled per tenant in /operator → Tenant feature flags:
| Flag | Purpose |
|---|---|
outlook_calendar | Shows Admin → Outlook calendar integration for the school |
You can also pass flags when creating a tenant via API:
json
POST /api/operator/tenants
{ "featureFlags": { "outlook_calendar": true, ... } }Or toggle an existing tenant:
http
PATCH /api/operator/tenants/{tenantId}/flags
{ "outlook_calendar": true }After provisioning
- Sign in
- Complete Initial setup
- Import staff (respects seat limit)
- Run the go-live checklist
Plans and seats
- Hard seat limit on active rota people
- Trial:
plan=trial,trialEndsAtdefaults to +90 days for new tenants - Stripe-linked tenants: plan/seats sync via webhooks
