diff --git a/content/guides/03.auth/2.access-control.md b/content/guides/03.auth/2.access-control.md index 28335a48..e61d53e6 100644 --- a/content/guides/03.auth/2.access-control.md +++ b/content/guides/03.auth/2.access-control.md @@ -117,11 +117,13 @@ Specifying both the IPv4 and IPv6 addresses ensures uninterrupted access to your ## Studio Users -Studio Users in Directus are used in the context of licensing and billing for Directus Cloud. A studio user meets at least one of the following criteria: +Studio Users are the users counted against the seat limit on your plan, whether you are self-hosted or on Directus Cloud. A Studio user meets at least one of the following criteria: 1. At least one policy with 'Admin Access' enabled. 2. At least one policy with 'App Access' enabled, allowing access to the Data Studio. +Users with neither are considered API-only users and do not consume a seat, regardless of how many of them may exist. See [Key Definitions](/licensing/overview#key-definitions) in the licensing overview for the full seat and collection counting rules. + ## Combining Multiple Policies When multiple policies are assigned to a role or user, the system evaluates and combines these policies depending on the type of restriction or permission being applied. Understanding how these rules combine is essential for designing effective access control strategies. diff --git a/content/licensing/1.overview.md b/content/licensing/1.overview.md index 0fcabada..69e011be 100644 --- a/content/licensing/1.overview.md +++ b/content/licensing/1.overview.md @@ -13,9 +13,51 @@ Free commercial use is available through the **[Open Innovation Grant](https://d Quick links: +- [What counts as a user seat or a collection?](#key-definitions) - [Enquire about a commercial license](https://directus.com/contact) - [Upgrading to Directus 12 (existing customer)](#upgrading-to-directus-12) +## Key Definitions + +Plan limits are counted in units that are easy to misread. This section defines what counts toward **user seats** and **collections**. For the limits that apply to each tier, see the [pricing page](https://directus.com/pricing). + +### User Seats + +A seat is consumed by each **active Studio user**. A user is a Studio user if they have at least one policy with **App Access** or **Admin Access** enabled. See [Studio Users](/guides/auth/access-control#studio-users) for the full criteria. + +**API-only users do not count toward your seat limit.** These are users created and managed in Directus who never access the Data Studio and reach your data only through the REST, GraphQL, WebSockets, or SDK APIs. Common examples: + +- End users of your application, whether they register themselves through your frontend or you create their accounts for them. +- Service accounts and integrations that authenticate with a static token. + +These users do not consume a seat, regardless of how many exist, provided no policy grants them app access. Conversely, any user whose policy grants app access consumes a seat, whether or not they ever log in. + +::callout{icon="i-lucide-info"} +**Seats measure Studio access, not the size of your user base.** +
+A project with 2 content editors and 50,000 registered application users consumes 2 seats. Only accounts that can access the Data Studio are counted. +:: + +You can send invitations even after reaching your seat limit. However, you cannot **activate** a user beyond the limit. To activate a pending user, either increase your seat count or free a seat by removing app access from an existing user. + +### Collections + +A collection counts toward your limit if it is a user collection registered in Directus, meaning it has Directus metadata and appears in the Data Studio. See [Collections](/guides/data-model/collections) for the difference between user and system collections. + +Counted: + +- User collections, whether created through the Data Studio, the API, or created in your database and then registered in Directus. +- Translation collections, such as `articles_translations`. +- Junction tables created for many-to-many and many-to-any relationships. + +Not counted: + +- System collections, which are prefixed with `directus_`. +- Folders, which group collections in the Data Model settings and are not tables. +- Database-only tables, which exist in your database but have no associated Directus metadata because they are not registered in Directus. + +Translation collections and junction tables receive no special treatment: they are standard user-created tables, so each one counts as a collection. Account for them when you estimate your total. + ## `PUBLIC_URL` and Licensing Before applying a license, `PUBLIC_URL` must be set to a valid absolute URL (e.g. `https://directus.example.com`). The default value (`/`) and any relative path are rejected by the licensing service during [activation](#activations-and-project-bindings).