Skip to content

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.