Permission model overview
Permissions in Twenty work through a hierarchical system:Roles
Roles are the foundation of the permission system. Each workspace member is assigned one or more roles that determine their access.Standard roles
Twenty includes default roles:- Admin: Full access to all data and settings
- Member: Standard access to CRM features
- Guest: Limited read-only access
Custom roles
Create roles tailored to your organization:Create new role
Click “New Role” and configure:
- Label: Role name (e.g., “Sales Manager”, “Support Agent”)
- Description: What this role is for
- Icon: Visual identifier
Configure permissions
Set role-wide permissions:
- Can update all settings
- Can access all tools
- Can read all object records
- Can update all object records
- Can soft delete all object records
- Can destroy all object records
Role properties
Roles can be assigned to users, AI agents, and API keys, allowing you to control permissions for both human and programmatic access.
Object permissions
Control what actions roles can perform on each object.CRUD permissions
Four basic permissions for each object:- Create: Can create new records
- Read: Can view records
- Update: Can modify existing records
- Delete: Can soft-delete or permanently remove records
Setting object permissions
- Via UI
- Via API
- Go to Settings → Roles
- Select a role
- Navigate to “Object Permissions”
- For each object, toggle permissions:
Permission inheritance
Permissions have implicit dependencies:canDeleterequirescanUpdatecanUpdaterequirescanRead- Without
canRead, the object is invisible to the role
Field permissions
Restrict access to specific fields within objects.Field visibility
Control which fields roles can see and edit:- Visible: Field appears in views and forms
- Editable: Field can be modified
- Hidden: Field completely hidden from role
Use cases for field permissions
- Sensitive Data
- Read-only Fields
- Role-specific Fields
Hide confidential information:
- Social Security Numbers: Visible only to HR role
- Salary information: Visible only to Finance role
- API keys: Visible only to Admin role
- Credit card info: Never visible to any role
Configuring field permissions
Field Permission Example
Row-level permissions
Define which specific records a role can access based on field values.Permission predicates
Predicates are conditions that determine record visibility:Predicate operators
Available operators for row-level predicates:- eq: Equals
- ne: Not equals
- gt: Greater than
- gte: Greater than or equal
- lt: Less than
- lte: Less than or equal
- in: In array
- notIn: Not in array
- contains: String contains substring
- startsWith: String starts with
- endsWith: String ends with
- isEmpty: Field is null or empty
- isNotEmpty: Field has a value
Dynamic predicates
Use variables to make predicates dynamic:Dynamic Variables
Example row-level permissions
- Sales Territory
- Team Hierarchy
- Customer Portal
- Multi-condition
Permission flags
Binary permissions for workspace-level features.Available permission flags
Flags control access to workspace features:Assigning permission flags
Role with Flags
Workspace members
Manage who has access to your workspace.Inviting users
Member properties
- Email: User’s email address
- Role(s): Assigned roles (can have multiple)
- Status: Active, Invited, Suspended
- Locale: User’s language preference
- Avatar: Profile picture
- Last active: Last login timestamp
Removing access
- Go to Settings → Members
- Click on user to remove
- Choose:
- Suspend: Temporarily disable access (can be restored)
- Remove: Permanently remove from workspace
Best practices
Role design
- Create roles by function: “Sales”, “Support”, “Marketing” rather than by seniority
- Use least privilege: Give only permissions required for the job
- Plan for growth: Design role hierarchy that scales with team size
- Document roles: Write clear descriptions of what each role can do
Permission patterns
- Sales Team
- Support Team
Security considerations
- Regular audits: Review permissions quarterly
- Offboarding: Remove access immediately when team members leave
- API keys: Create roles specifically for API access with minimal permissions
- Audit logs: Monitor for unauthorized access attempts
- Sensitive data: Use field permissions for PII and financial data
Performance optimization
- Simple predicates: Complex row-level rules slow down queries
- Indexed fields: Use indexed fields in row-level predicates
- Cache roles: Permissions are cached, changes take effect on next login
- Limit roles: Keep role count manageable (< 20 roles)
Testing permissions
Admins can use “View as” feature to preview the workspace as different roles without logging out.
Troubleshooting
User can’t see data they should access
- Check object permissions: Is Read enabled?
- Check field permissions: Are fields visible?
- Check row-level predicates: Do predicates match user’s context?
- Check user’s role assignments: Is role actually assigned?
- Clear cache and refresh: Log out and back in
User can access data they shouldn’t
- Review all assigned roles: User may have multiple roles
- Check for permissive row-level rules: OR conditions may be too broad
- Audit permission flags: May have elevated workspace permissions
- Review role inheritance: Check if roles grant unexpected access
Performance issues with permissions
- Simplify row-level predicates: Reduce nested conditions
- Index predicate fields: Add database indexes to filtered fields
- Limit role count: Consolidate similar roles
- Cache optimization: Adjust cache TTL for permission checks
Next steps
Objects and fields
Understand what data permissions control
Workflows
Automate role-based actions and notifications
API authentication
Use API keys with role-based permissions
Workspace Settings
Configure workspace permissions and roles
