Skip to content

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

  1. Set OPERATOR_API_TOKEN in production (or OPERATOR_AUTH_DISABLED=1 locally).
  2. Open /operator/login and authenticate with the operator token.
  3. Enter subdomain, school name, owner email, temp password, plan, and seat limit.
  4. Submit to create the tenant.
  5. Share https://{host}/t/{subdomain}/login and 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 50

Option 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 /operatorTenant feature flags:

FlagPurpose
outlook_calendarShows 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

  1. Sign in
  2. Complete Initial setup
  3. Import staff (respects seat limit)
  4. Run the go-live checklist

Plans and seats

  • Hard seat limit on active rota people
  • Trial: plan=trial, trialEndsAt defaults to +90 days for new tenants
  • Stripe-linked tenants: plan/seats sync via webhooks

What happens next

SchoolRota documentation — every slot covered, every day.