Some checks failed
App Prod-Parity E2E Dispatch / dispatch (push) Failing after 10s
CD Storybook UI / build (push) Failing after 3m25s
CD Storybook UI / dispatch (push) Has been skipped
CD deploy main / website-changed-files (push) Successful in 18m8s
CI Agent Skills / changed-files-check (push) Successful in 18m9s
CI Create App E2E minimal / changed-files-check (push) Successful in 24s
CI Create App / changed-files-check (push) Successful in 26s
CI Docs / changed-files-check (push) Successful in 26s
CI Emails / changed-files-check (push) Successful in 28s
CI Example App Hello World / changed-files-check (push) Successful in 23s
CI Front / changed-files-check (push) Has been skipped
CI Example App Postcard / changed-files-check (push) Successful in 27s
CI UI / changed-files-check (push) Has been skipped
CI Utils Test / changed-files-check (push) Successful in 45s
CI Twenty Apps / discover (push) Successful in 1m3s
CD deploy main / deploy-main (push) Failing after 3s
CI Agent Skills / agent-skills-validate (push) Has been skipped
CI Create App / create-app-test (lint) (push) Has been skipped
CI Emails / emails-test (push) Has been skipped
CI Front / front-task (lingui:compile) (push) Has been skipped
CI Front / front-task (lint) (push) Has been skipped
CI Example App Postcard / example-app-postcard (push) Has been skipped
CI UI / ui-task (lint) (push) Has been skipped
CI UI / ui-task (pack-size) (push) Has been skipped
CI UI / ui-task (size) (push) Has been skipped
CI UI / ui-task (test) (push) Has been skipped
CI UI / ui-task (typecheck) (push) Has been skipped
CI Utils Test / utils-test (push) Has been skipped
CI Twenty Apps / ${{ matrix.app.name }} (push) Has been skipped
CI Emails / ci-emails-status-check (push) Successful in 2s
CI Example App Hello World / ci-example-app-hello-world-status-check (push) Successful in 2s
CI Example App Postcard / ci-example-app-postcard-status-check (push) Successful in 3s
CI UI / ui-sb-test (push) Has been skipped
CI Utils Test / ci-utils-test-status-check (push) Successful in 2s
CI Twenty Apps / ci-twenty-apps-status-check (push) Successful in 2s
CI UI / ci-ui-status-check (push) Successful in 2s
CI Desktop / desktop (push) Failing after 1m8s
Push docs to Crowdin / Push documentation to Crowdin (push) Failing after 55s
Push translations to Crowdin / Extract and upload translations (push) Failing after 5s
Push website translations to Crowdin / Extract and upload website translations (push) Failing after 5s
CI Create App / create-app-test (test) (push) Has been skipped
CI Create App / create-app-test (typecheck) (push) Has been skipped
CI Docs / docs-lint (push) Has been skipped
CI Example App Hello World / example-app-hello-world (push) Has been skipped
CI Front / front-task (lingui:extract) (push) Has been skipped
CI Front / front-task (test) (push) Has been skipped
CI Front / front-task (typecheck) (push) Has been skipped
CI UI / ui-sb-build (push) Failing after 1m32s
CI Twenty Apps / ${{ matrix.app.name }} (${{ matrix.server-source }}) (push) Has been skipped
CI Agent Skills / agent-skills-publish (push) Has been skipped
CI Create App / ci-create-app-status-check (push) Successful in 2s
CI Agent Skills / agent-skills-remote-source (push) Has been skipped
CI Create App E2E minimal / create-app-e2e-minimal (push) Has been cancelled
CI E2E Main / e2e-test (push) Has been cancelled
CI Front / front-sb-build (push) Has been cancelled
CI Front / front-build (push) Has been cancelled
CI Create App E2E minimal / ci-create-app-e2e-minimal-status-check (push) Has been cancelled
CI E2E Main / ci-e2e-main-status-check (push) Has been cancelled
CI E2E Main / notify-main-ci-failure (push) Has been cancelled
CI E2E Main / qa-scout-comment (push) Has been cancelled
CI Front / front-sb-test (push) Has been cancelled
CI Front / front-sb-screenshots (push) Has been cancelled
CI Front / ci-front-status-check (push) Has been cancelled
DPA Sub-Processor Sync / sync-subprocessors (push) Failing after 3s
AI Catalog Sync / sync-catalog (push) Failing after 2s
208 lines
7.9 KiB
Plaintext
208 lines
7.9 KiB
Plaintext
---
|
|
title: Permissions
|
|
description: Control access to objects, fields, and settings with role-based permissions.
|
|
---
|
|
|
|
Twenty's permission system allows you to control access to three main areas:
|
|
- **Objects and Fields**: Control who can view, edit, or delete records and individual fields
|
|
- **Settings**: Manage access to workspace configuration and administrative functions
|
|
- **Actions**: Control general workspace actions like importing data or sending emails
|
|
|
|
## Create a Role
|
|
|
|
To create a new role:
|
|
|
|
1. Go to **Settings → Members → Roles**
|
|
2. Under **All Roles**, click on **+ Create Role**
|
|
3. Enter a role name
|
|
4. In the default **Permissions** tab, [configure permissions](#customize-permissions)
|
|
5. Click **Save** to finish
|
|
|
|
## Delete a Role
|
|
|
|
To delete a role:
|
|
|
|
1. Go to **Settings → Members → Roles**
|
|
2. Click on the role you want to remove
|
|
3. Open the **Settings** tab, then click **Delete Role**
|
|
4. Click **Confirm** in the modal
|
|
|
|
<Note>
|
|
If a role is deleted, any workspace member assigned to it will be automatically reassigned to the default role. All roles except the **Admin** role can be deleted. There must always be at least one member assigned to the **Admin** role.
|
|
</Note>
|
|
|
|
## Assign Roles to Members
|
|
|
|
### View Current Assignments
|
|
- Go to **Settings → Members → Roles**
|
|
- See all roles and how many members are assigned to each
|
|
- View which members have which roles
|
|
|
|
### Assign a Role to a Member
|
|
1. Go to **Settings → Members → Roles**
|
|
2. Click on the role you want to assign
|
|
3. Open the **Assignment** tab
|
|
4. Click **+ Assign to member**
|
|
5. Select the workspace member from the list
|
|
6. Confirm the assignment
|
|
|
|
### Set Default Role
|
|
1. Go to **Settings → Members → Roles**
|
|
2. In the **Options** section, find **Default Role**
|
|
3. Select which role new members should automatically receive
|
|
4. New workspace members will be assigned this role when they join
|
|
|
|
<Note>
|
|
You can only assign roles to existing workspace members. To invite new members, use [Member Management](/user-guide/settings/capabilities/member-management).
|
|
</Note>
|
|
|
|
## Customize Permissions
|
|
|
|
Permissions determine what each role can access or modify within your workspace, including workspace objects, records, settings, and actions.
|
|
|
|
### Object Permissions
|
|
|
|
The **Objects** section controls what this role can do with records across your workspace.
|
|
|
|
#### Set Default Permissions (All Objects)
|
|
|
|
First, configure the baseline permissions that apply to **all objects** by default:
|
|
|
|
| Permission | Description |
|
|
|------------|-------------|
|
|
| **See Records on All Objects** | View records in lists and detail pages |
|
|
| **Edit Records on All Objects** | Modify existing records |
|
|
| **Delete Records on All Objects** | Soft-delete records (can be restored) |
|
|
| **Destroy Records on All Objects** | Permanently delete records |
|
|
|
|
Select or unselect based on what should be the default behavior for this role.
|
|
|
|
<Note>
|
|
**Example — Intern role**: An intern should be able to see all objects but not edit them by default. Enable "See Records on All Objects" but leave "Edit Records on All Objects" unchecked.
|
|
</Note>
|
|
|
|
#### Add Object-Level Exceptions
|
|
|
|
After setting defaults, use the **Object-Level** sub-section to add rules that override the defaults for specific objects.
|
|
|
|
Click **+ Add rule** and select an object to create an exception.
|
|
|
|
**Example rules for an Intern role:**
|
|
|
|
| Rule | Effect |
|
|
|------|--------|
|
|
| Opportunities → disable "See Records" | Intern cannot see the Opportunities object at all |
|
|
| People → enable "Edit Records" | Intern can edit People records (but not other objects) |
|
|
|
|
### Row-Level Permissions
|
|
|
|
<Note>
|
|
Row-level permissions are a **Premium feature** available on the **Organization** plan (Cloud and Self-Hosted).
|
|
</Note>
|
|
|
|
Row-level permissions let you restrict which individual records a role can see or edit, based on dynamic criteria. Unlike object permissions (which apply to an entire object type), row-level permissions evaluate each record independently.
|
|
|
|
**Example use cases:**
|
|
- Sales reps can only see their own opportunities
|
|
- Managers can see all records in their region
|
|
- Support agents can only view tickets assigned to them
|
|
|
|
To configure row-level permissions, open a role, navigate to the **Objects** tab, and use the **Row-Level** section to define filter conditions for a specific object.
|
|
|
|
### Field Permissions
|
|
|
|
Within each object-level rule, you can go further and configure **field-level permissions** to control access to specific fields.
|
|
|
|
| Permission | Description |
|
|
|------------|-------------|
|
|
| **See Field** | View the field value |
|
|
| **Edit Field** | Modify the field value |
|
|
| **No Access** | Field is completely hidden |
|
|
|
|
**Example — Restrict sensitive fields:**
|
|
|
|
For the Intern role with People edit access, you might want to restrict certain fields:
|
|
- People → Email → **See Field** only (cannot edit)
|
|
- People → Address → **No Access** (completely hidden)
|
|
|
|
This allows the intern to edit most People fields while protecting sensitive information.
|
|
|
|
### How Permission Inheritance Works
|
|
|
|
Permissions cascade from general to specific:
|
|
|
|
1. **All Objects** → sets the baseline for all objects
|
|
2. **Object-Level rules** → override the baseline for specific objects
|
|
3. **Field-Level rules** → override the object setting for specific fields
|
|
|
|
More specific settings always take precedence.
|
|
|
|
### Managing Permission Overrides
|
|
|
|
To override inherited permissions:
|
|
|
|
1. Click **X** to remove the inherited rule
|
|
2. Select the specific permissions you want
|
|
3. Click the orange **Undo** icon (circular arrow) to revert changes
|
|
|
|
When done, click **Finish**, then **Save** once redirected to the role page.
|
|
|
|
### Workspace Settings Permissions
|
|
|
|
Control access to workspace settings in two ways:
|
|
|
|
- Toggle **Settings All Access** to grant full access
|
|
- Or enable specific permissions (e.g., API key generation, workspace preferences, role assignment, data model configuration, security settings, and workflow management)
|
|
|
|
<Note>
|
|
**Current limitation**: Access to workflow management is currently required to manually trigger workflows. This behavior may change in future releases.
|
|
</Note>
|
|
|
|
### Workspace Action Permissions
|
|
|
|
Control access to general workspace actions:
|
|
|
|
- Toggle **Application All Access** to grant full permissions
|
|
- Or enable individual actions such as **Send Email**, **Import CSV**, and **Export CSV**
|
|
|
|
## Assign Roles to API Keys and AI Agents
|
|
|
|
Beyond workspace members, roles can also be assigned to **API Keys** and **AI Agents**. This is particularly helpful for teams who want to control exactly "who" can do what in their workspace—including automated processes and integrations.
|
|
|
|
### Why Assign Roles to API Keys and AI Agents?
|
|
|
|
- **Security**: Limit what automated processes can access or modify
|
|
- **Compliance**: Ensure integrations only touch the data they need
|
|
- **Control**: Prevent accidental data changes from misconfigured automations
|
|
- **Auditability**: Track which actions were performed by which integration or agent
|
|
|
|
### Assign a Role to an API Key
|
|
|
|
1. Go to **Settings → Members → Roles**
|
|
2. Click on the role you want to assign
|
|
3. Open the **Assignment** tab
|
|
4. Under **API Keys**, click **+ Assign to API key**
|
|
5. Select the API key from the list
|
|
6. Confirm the assignment
|
|
|
|
The API key will now inherit all permissions defined by that role. Any API calls made with this key will be restricted accordingly.
|
|
|
|
<Note>
|
|
API keys without an assigned role use default permissions. For tighter security, always assign a specific role to production API keys.
|
|
</Note>
|
|
|
|
### Assign a Role to an AI Agent
|
|
|
|
1. Go to **Settings → Members → Roles**
|
|
2. Click on the role you want to assign
|
|
3. Open the **Assignment** tab
|
|
4. Under **AI Agents**, click **+ Assign to AI agent**
|
|
5. Select the AI agent from the list
|
|
6. Confirm the assignment
|
|
|
|
The AI agent will only be able to access data and perform actions allowed by its assigned role.
|
|
|
|
<Note>
|
|
For AI agents running within workflows, this ensures the agent cannot access or modify data outside its intended scope—even if the workflow has broader permissions.
|
|
</Note>
|