From use-crystallize
Manage user roles, permissions, and access control in Crystallize. Use when configuring field-level permissions (read-only or hidden fields for specific roles), managing user roles and team access, setting up access tokens with specific scopes, controlling who can view/edit specific content areas or component fields, designing role-based access for multi-team tenants, or planning permission strategies for content workflows.
How this skill is triggered — by the user, by Claude, or both
Slash command
/use-crystallize:permissionsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Design and configure user roles, field-level permissions, and access tokens in Crystallize.
Design and configure user roles, field-level permissions, and access tokens in Crystallize.
This distinction trips up most users. Crystallize separates permissions into two layers:
| Layer | Scope | What it controls |
|---|---|---|
| UI permissions | Crystallize UI only | Hide or lock fields from editors — cosmetic, does not restrict API access |
| CRUD permissions | API + UI | Actual data access control (read/write/delete) |
Setting a field to "Read-Only" in the UI does not prevent API writes to that field. If you need true access restriction, set both UI and CRUD permissions. This is especially important when integrations (ERPs, PIMs) write data via API — you want UI-only locks for editors, but the API token needs write access.
Before recommending a permission setup, understand the user's situation. Ask clarifying questions:
Use the answers to design a role structure and recommend the right combination of UI + CRUD permissions.
Crystallize provides granular access control at multiple levels:
Crystallize has two built-in roles and supports unlimited custom roles.
| Role | Description |
|---|---|
| Tenant Admin | Full access to everything including tenant copying, mass operation logs, and all settings |
| User | Base role with minimal permissions — typically used as starting point for custom roles |
Create custom roles in Settings → Roles & Permissions.
Key characteristics:
When inviting users, select which role they should have. If a user needs different permissions, create a new role — you cannot assign multiple roles to one user.
Field-level permissions are configured per shape resource in the Roles & Permissions settings.
| Permission | Crystallize UI | API behavior |
|---|---|---|
| Read-Only | Greyed out, cannot edit | Can only read field values |
| Hidden | Completely invisible | Field is not accessible |
| Default (no restriction) | Editable | Full read/write access |
Important: UI permissions (hide/lock) only apply to the Crystallize UI, not the API level. Use API-level CRUD restrictions for API access control.
Almost every feature in Crystallize has CRUD operation resources (Create, Read, Update, Delete).
Restrict catalogue access to specific folders per role:
| Permission type | Scope | Use case |
|---|---|---|
| UI permissions | Crystallize UI only | Hide/lock fields from editors, simplify UI |
| CRUD permissions | API + UI | Control actual data access (read/write/delete) |
Example: You can hide a "price" field in the UI but still allow API access — useful when editors shouldn't manually change prices that are synced from an ERP.
Crystallize has two types of tokens:
Generate tokens in Settings → Access Tokens.
Choosing between token types: Use user tokens when you want API access scoped to a role's permissions. Use API tokens for service integrations that need tenant-wide access regardless of any specific role.
Permissions can be queried and configured via the Core API under the user resource in the GraphQL schema. Permissions are a separate resource from shapes — you won't see permission settings when querying shapes.
query GetRoles {
user {
roles {
id
name
tenantPermissions
}
}
}
query GetRole($roleId: ID!) {
user {
role(id: $roleId) {
id
name
tenantPermissions
}
}
}
mutation CreateRole {
user {
role {
create(input: { name: "Content Editor" }) {
id
name
}
}
}
}
mutation UpdateRole($roleId: ID!) {
user {
role {
update(
id: $roleId
input: {
name: "Content Editor"
tenantPermissions: {
# Set CRUD permissions per resource
}
}
) {
id
name
}
}
}
}
For the exact permission structure and available fields, check the Core API schema — the tenantPermissions input type defines all configurable resources and their CRUD flags.
Scenario: Prices are synced from an ERP — editors shouldn't manually change them.
Solution:
Scenario: Migration tracking fields should be invisible to content editors.
Solution:
Scenario: Team A manages products in /shop/electronics, Team B manages /shop/fashion.
Solution:
/shop/electronics/shop/fashionScenario: A storefront needs read-only access to products but should never modify data.
Solution:
npx claudepluginhub crystallizeapi/ai --plugin use-crystallizeConfigures Webflow enterprise RBAC with OAuth 2.0 scopes, role mappings, per-site tokens, workspace management, and audit logging for API integrations.
Creates web roles for Power Pages code sites to control user access and permissions, including anonymous and authenticated roles. Generates YAML files with UUIDs, verifies structure, and preps for deployment.
Implements RBAC for Shopify Plus apps via staff permissions, multi-location management, and organization features. Provides TypeScript code for GraphQL queries and role mapping.