Skip to main content
Twenty’s permission system gives you granular control over who can access and modify data in your workspace. Create custom roles with specific permissions at the object, field, and record level.

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:
1

Navigate to Roles

Go to Settings → Workspace → Roles
2

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
3

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
4

Set object permissions

Define specific permissions per object (covered below).

Role properties

{
  label: "Sales Manager",
  description: "Manages sales team and pipeline",
  icon: "users",
  
  // Global permissions
  canUpdateAllSettings: false,
  canAccessAllTools: true,
  canReadAllObjectRecords: true,
  canUpdateAllObjectRecords: false,
  canSoftDeleteAllObjectRecords: false,
  canDestroyAllObjectRecords: false,
  
  // Assignment options
  canBeAssignedToUsers: true,
  canBeAssignedToAgents: false,
  canBeAssignedToApiKeys: false,
  
  // Editability
  isEditable: true
}
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

  1. Go to Settings → Roles
  2. Select a role
  3. Navigate to “Object Permissions”
  4. For each object, toggle permissions:
Object: Companies
✓ Create
✓ Read
✓ Update
✗ Delete

Object: Opportunities
✓ Create
✓ Read
✓ Update
✓ Delete

Permission inheritance

Delete permission requires Update permission. You cannot delete records you cannot update.
Permissions have implicit dependencies:
  • canDelete requires canUpdate
  • canUpdate requires canRead
  • 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

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
// Object: Company
// Role: Sales Rep

Fields:
  name:               { visible: true,  editable: true  }  // Full access
  annualRevenue:      { visible: true,  editable: false }  // Read-only
  internalNotes:      { visible: false, editable: false }  // Hidden
  owner:              { visible: true,  editable: false }  // Read-only
  industry:           { visible: true,  editable: true  }  // Full access
Use field permissions to implement progressive disclosure: show simple fields to all users, advanced fields only to power users.

Row-level permissions

Define which specific records a role can access based on field values.

Permission predicates

Predicates are conditions that determine record visibility:
// Sales reps can only see their own opportunities
{
  field: "ownerId",
  operator: "eq",
  value: "{{currentUser.id}}"
}

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
// Current user
{{currentUser.id}}
{{currentUser.email}}
{{currentUser.teamId}}
{{currentUser.role}}

// Related records
{{currentUser.managedTeamIds}}  // Array of team IDs user manages
{{currentUser.regionId}}         // User's assigned region

// Workspace context
{{workspaceId}}

Example row-level permissions

// Sales reps see accounts in their territory
Role: Sales Rep
Object: Company

Predicate:
{
  logicalOperator: "OR",
  predicates: [
    // Accounts they own
    { field: "ownerId", operator: "eq", value: "{{currentUser.id}}" },
    // OR accounts in their territory
    { field: "territory", operator: "eq", value: "{{currentUser.territory}}" }
  ]
}
Row-level permissions can impact query performance on large datasets. Use indexed fields in predicates for better performance.

Permission flags

Binary permissions for workspace-level features.

Available permission flags

Flags control access to workspace features:
// Workspace settings
CAN_ACCESS_WORKSPACE_SETTINGS
CAN_EDIT_WORKSPACE_SETTINGS

// Data model
CAN_CREATE_OBJECTS
CAN_EDIT_OBJECTS
CAN_DELETE_OBJECTS
CAN_CREATE_FIELDS
CAN_EDIT_FIELDS
CAN_DELETE_FIELDS

// Workflows
CAN_CREATE_WORKFLOWS
CAN_EDIT_WORKFLOWS
CAN_DELETE_WORKFLOWS
CAN_EXECUTE_WORKFLOWS

// Users and permissions
CAN_INVITE_USERS
CAN_MANAGE_USERS
CAN_MANAGE_ROLES
CAN_ASSIGN_ROLES

// Integrations
CAN_MANAGE_API_KEYS
CAN_MANAGE_WEBHOOKS
CAN_INSTALL_APPS

// Data
CAN_IMPORT_DATA
CAN_EXPORT_DATA
CAN_DELETE_ALL_DATA

Assigning permission flags

Role with Flags
{
  label: "Developer",
  permissionFlags: [
    "CAN_ACCESS_WORKSPACE_SETTINGS",
    "CAN_MANAGE_API_KEYS",
    "CAN_MANAGE_WEBHOOKS",
    "CAN_CREATE_WORKFLOWS",
    "CAN_EDIT_WORKFLOWS",
    "CAN_EXPORT_DATA",
    "CAN_IMPORT_DATA"
  ]
}

Workspace members

Manage who has access to your workspace.

Inviting users

1

Go to Settings → Members

View all workspace members and pending invitations.
2

Click Invite Member

Enter email address of person to invite.
3

Assign role

Choose which role(s) to assign to the new member.
4

Send invitation

User receives email with link to join workspace.

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

  1. Go to Settings → Members
  2. Click on user to remove
  3. Choose:
    • Suspend: Temporarily disable access (can be restored)
    • Remove: Permanently remove from workspace
Removing a user does not delete records they created. Records remain but show “[Deleted User]” as the creator.

Best practices

Role design

Start with broader permissions and tighten as needed. It’s easier to remove permissions than deal with access request tickets.
  1. Create roles by function: “Sales”, “Support”, “Marketing” rather than by seniority
  2. Use least privilege: Give only permissions required for the job
  3. Plan for growth: Design role hierarchy that scales with team size
  4. Document roles: Write clear descriptions of what each role can do

Permission patterns

Sales Rep:
- Read: All companies, people, opportunities
- Write: Own opportunities, related tasks
- Row-level: Territory-based or owner-based

Sales Manager:
- Read: All sales data
- Write: Team's opportunities, can reassign
- Row-level: Team hierarchy-based

Sales Ops:
- Read: All data
- Write: Data model, workflows, imports
- Full access to settings

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

1

Create test user

Invite a test account with the role you want to verify.
2

Log in as test user

Use an incognito browser to log in with test account.
3

Verify visibility

Check that objects, fields, and records are visible/hidden correctly.
4

Test actions

Attempt to create, update, and delete records to verify permissions.
5

Check edge cases

Test row-level predicates with different data scenarios.
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

  1. Check object permissions: Is Read enabled?
  2. Check field permissions: Are fields visible?
  3. Check row-level predicates: Do predicates match user’s context?
  4. Check user’s role assignments: Is role actually assigned?
  5. Clear cache and refresh: Log out and back in

User can access data they shouldn’t

  1. Review all assigned roles: User may have multiple roles
  2. Check for permissive row-level rules: OR conditions may be too broad
  3. Audit permission flags: May have elevated workspace permissions
  4. Review role inheritance: Check if roles grant unexpected access

Performance issues with permissions

  1. Simplify row-level predicates: Reduce nested conditions
  2. Index predicate fields: Add database indexes to filtered fields
  3. Limit role count: Consolidate similar roles
  4. 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

Build docs developers (and LLMs) love