Multi-Tenancy

Multi-Tenancy

Feature toggle

MULTI_TENANCY_ENABLED=false

When false, org-specific routes and middleware groups are not registered.

Data model

  • organizations table stores tenant records.
  • users.organization_id links users to one org.
  • users.role stores owner, admin, or member.
  • organization_invites stores hashed invite tokens with expiry and acceptance state.
  • users.is_super_admin gates platform-level pages.

Flow

  1. User without an org is redirected to /onboarding/organization after login.
  2. Org owner/admin sends invite from /settings/members.
  3. OrganizationService::invite() hashes token and queues an invite email job.
  4. Invitee opens /invite/accept?email=...&token=....
  5. OrganizationService::acceptInvite() validates token, links/creates user, marks invite accepted.

Role enforcement

  • RequireOrgAdminMiddleware allows only owner and admin for org settings/members pages.
  • RequireSuperAdminMiddleware requires is_super_admin = 1 for platform pages.