Organizations & multi-tenancy¶
The Organization is the tenant root. Every other object in Expecto — projects, entities, contracts, transformers, catalogs, sessions, providers — belongs to exactly one organization, and access never crosses that boundary.
How tenancy is enforced¶
Every model carries an organization_id. All queries are scoped by it, and
nested resources additionally verify that a child belongs to its declared
parent before returning it. There is no "global" data shared between
organizations.
Membership and roles¶
Users join an organization through a Membership, which carries a role (for example owner, admin, member). The role determines what a user may do within the organization. API keys are scoped the same way — a key acts within one organization, with a set of granted permissions.
Auto-provisioning¶
The first time a user logs in via Auth0, Expecto provisions a personal organization, the user record, and an owner membership in one step. This means a new user always lands in a usable, isolated workspace without a manual setup.
Data providers are not organizations¶
A supplier that submits data is modelled as a Data Provider, not as a full member of your organization. Providers get scoped submission access to specific projects and contracts, never the configuration surface.