User guide structure update (#16705)
Reorganizing by Feature sections Capabilities folders to give an overview of each feature How-Tos folders to give guidance for advanced customizations Reorganized the Developers section as well, moving the API sub section there added some new visuals and videos to illustrate the How-Tos articles checked the typos, the links and added a section at the end of the doc.json file to redirect existing links to the new ones (SEO purpose + continuity of the user experience) What I have not updated is the "l" folder that, per my understanding, contains the translation of the User Guide - that I only edited in English <!-- CURSOR_SUMMARY --> --- > [!NOTE] > <sup>[Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) is generating a summary for commit 5301502a32856e5b45d7ef30253fa7db6dc55233. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> Co-authored-by: github-actions <github-actions@twenty.com> Co-authored-by: Abdul Rahman <ar5438376@gmail.com> Co-authored-by: Félix Malfait <felix.malfait@gmail.com>
@@ -1,49 +0,0 @@
|
||||
---
|
||||
title: API
|
||||
image: /images/docs/getting-started/api.png
|
||||
info: Discover how to use our APIs.
|
||||
---
|
||||
<Frame>
|
||||
<img src="/images/docs/getting-started/api.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
## Overview
|
||||
The Twenty API allows developers to interact programmatically with the Twenty CRM platform. Using the API, you can integrate Twenty with other systems, automate data synchronization, and build custom solutions around your customer data. The API provides endpoints to **create, read, update, and delete** core CRM objects (such as people and companies) as well as access metadata configuration.
|
||||
|
||||
**API Playground:** You can now access the API Playground within the app's settings. To try out API calls in real-time, log in to your Twenty workspace and navigate to **Settings → APIs & Webhooks**. This opens the in-app API Playground and the settings for API keys.
|
||||
**[Go to API Settings](https://app.twenty.com/settings)**
|
||||
|
||||
## Authentication
|
||||
Twenty’s API uses API keys for authentication. Every request to protected endpoints must include an API key in the header.
|
||||
|
||||
* **API Keys:** You can generate a new API key from your Twenty app’s **API settings** page. Each API key is a secret token that grants access to your CRM data, so keep it safe. If a key is compromised, revoke it from the settings and generate a new one.
|
||||
* **Auth Header:** Once you have an API key, include it in the `Authorization` header of your HTTP requests. Use the Bearer token scheme. For example:
|
||||
```
|
||||
Authorization: Bearer YOUR_API_KEY
|
||||
```
|
||||
|
||||
Replace `YOUR_API_KEY` with the key you obtained. This header must be present on **all API requests**. If the token is missing or invalid, the API will respond with an authentication error (HTTP 401 Unauthorized).
|
||||
|
||||
## API Endpoints
|
||||
All resources can be accessed and via REST or GraphQL.
|
||||
|
||||
* **Cloud:** `https://api.twenty.com/` or your custom domain / sub-domain
|
||||
* **Self-Hosted Instances:** If you are running Twenty on your own server, use your own domain in place of `api.twenty.com` (for example, `https://{your-domain}/rest/`).
|
||||
|
||||
Endpoints are grouped into two categories: **Core API** and **Metadata API**. The **Core API** deals with primary CRM data (e.g. people, companies, notes, tasks), while the **Metadata API** covers configuration data (like custom fields or object definitions). Most integrations will primarily use the Core API.
|
||||
|
||||
### Core API
|
||||
Accessed on `/rest/` or `/graphql/`.
|
||||
The **Core API** serves as a unified interface for managing core CRM entities (people, companies, notes, tasks) and their relationships, offering **both REST and GraphQL** interaction models.
|
||||
|
||||
### Metadata API
|
||||
Accessed on `/rest/metadata/` or `/metadata/`.
|
||||
The Metadata API endpoints allow you to retrieve information about your schema and settings. For instance, you can fetch definitions of custom fields, object schemas, etc.
|
||||
|
||||
* **Example Endpoints:**
|
||||
|
||||
* `GET /rest/metadata/objects` – List all object types and their metadata (fields, relationships).
|
||||
* `GET /rest/metadata/objects/{objectName}` – Get metadata for a specific object (e.g., `people`, `companies`).
|
||||
* `GET /rest/metadata/picklists` – Retrieve picklist (dropdown) field options defined in the CRM.
|
||||
|
||||
Typically, the metadata endpoints are used to understand the structure of data (for dynamic integrations or form-building) rather than to manage actual records. They are read-only in most cases. Authentication is required for these as well (use your API key).
|
||||
@@ -1,82 +0,0 @@
|
||||
---
|
||||
title: Webhooks
|
||||
image: /images/docs/getting-started/webhooks.png
|
||||
info: Discover how to use our Webhooks.
|
||||
---
|
||||
<Frame>
|
||||
<img src="/images/docs/getting-started/webhooks.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
## Overview
|
||||
Webhooks in Twenty complement the API by enabling **real-time notifications** to your own applications when certain events happen in your CRM. Instead of continuously polling the API for changes, you can set up webhooks to have Twenty **push** data to your system whenever specific events occur (for example, when a new record is created or an existing record is updated). This helps keep external systems in sync with Twenty instantly and efficiently.
|
||||
|
||||
With webhooks, Twenty will send an HTTP POST request to a URL you specify, containing details about the event. You can then handle that data in your application (e.g., to update your external database, trigger workflows, or send alerts).
|
||||
|
||||
## Setting Up a Webhook
|
||||
To create a webhook in Twenty, use the **APIs & Webhooks** settings in your Twenty app:
|
||||
|
||||
1. **Navigate to Settings:** In your Twenty application, go to **Settings → APIs & Webhooks**.
|
||||
2. **Create a Webhook:** Under **Webhooks** click on **+ Create webhook**.
|
||||
3. **Enter URL:** Provide the endpoint URL on your server where you want Twenty to send webhook requests. This should be a publicly accessible URL that can handle POST requests.
|
||||
4. **Save:** Click **Save** to create the webhook. The new webhook will be active immediately.
|
||||
|
||||
You can create multiple webhooks if you need to send different events to different endpoints. Each webhook is essentially a subscription for all relevant events (at this time, Twenty sends all event types to the given URL; filtering specific event types may be configurable in the UI). If you ever need to remove a webhook, you can delete it from the same settings page (select the webhook and choose delete).
|
||||
|
||||
## Events and Payloads
|
||||
Once a webhook is set up, Twenty will send an HTTP POST request to your specified URL whenever a trigger event occurs in your CRM data. Common events that trigger webhooks include:
|
||||
|
||||
* **Record Created:** e.g. a new person is added (`person.created`), a new company is created (`company.created`), a note is created (`note.created`), etc.
|
||||
* **Record Updated:** e.g. an existing person's information is updated (`person.updated`), a company record is edited (`company.updated`), etc.
|
||||
* **Record Deleted:** e.g. a person or company is deleted (`person.deleted`, `company.deleted`).
|
||||
* **Other Events:** If applicable, other object events or custom triggers (for instance, if tasks or other objects are updated, similar event types would be used like `task.created`, `note.updated`, etc.).
|
||||
|
||||
The webhook POST request contains a JSON payload in its body. The payload will generally include at least two things: the type of event, and the data related to that event (often the record that was created/updated). For example, a webhook for a newly created person might send a payload like:
|
||||
|
||||
```
|
||||
{
|
||||
"event": "person.created",
|
||||
"data": {
|
||||
"id": "abc12345",
|
||||
"firstName": "Alice",
|
||||
"lastName": "Doe",
|
||||
"email": "alice@example.com",
|
||||
"createdAt": "2025-02-10T15:30:45Z",
|
||||
"createdBy": "user_123"
|
||||
},
|
||||
"timestamp": "2025-02-10T15:30:50Z"
|
||||
}
|
||||
```
|
||||
|
||||
In this example:
|
||||
|
||||
* `"event"` specifies what happened (`person.created`).
|
||||
* `"data"` contains the new record's details (the same information you would get if you requested that person via the API).
|
||||
* `"timestamp"` is when the event occurred (in UTC).
|
||||
|
||||
Your endpoint should be prepared to receive such JSON data via POST. Typically, you'll parse the JSON, look at the `"event"` type to understand what happened, and then use the `"data"` accordingly (e.g., create a new contact in your system, or update an existing one).
|
||||
|
||||
**Note:** It's important to respond with a **2xx HTTP status** from your webhook endpoint to acknowledge successful receipt. If the Twenty webhook sender does not get a 2xx response, it may consider the delivery failed. (In the future, retry logic might attempt to resend failed webhooks, so always strive to return a 200 OK as quickly as possible after processing the data.)
|
||||
|
||||
## Webhook Validation
|
||||
|
||||
To ensure the security of your webhook endpoints, Twenty includes a signature in the `X-Twenty-Webhook-Signature` header.
|
||||
|
||||
This signature is an HMAC SHA256 hash of the request payload, computed using your webhook secret.
|
||||
|
||||
To validate the signature, you'll need to:
|
||||
1. Concatenate the timestamp (from `X-Twenty-Webhook-Timestamp` header), a colon, and the JSON string of the payload
|
||||
2. Compute the HMAC SHA256 hash using your webhook secret as the key ()
|
||||
3. Compare the resulting hex digest with the signature header
|
||||
|
||||
Here's an example in Node.js:
|
||||
|
||||
```javascript
|
||||
const crypto = require("crypto");
|
||||
const timestamp = "1735066639761";
|
||||
const payload = JSON.stringify({...});
|
||||
const secret = "your-secret";
|
||||
const stringToSign = `${timestamp}:${JSON.stringify(payload)}`;
|
||||
const signature = crypto.createHmac("sha256", secret)
|
||||
.update(stringToSign)
|
||||
.digest("hex");
|
||||
```
|
||||
@@ -1,18 +0,0 @@
|
||||
---
|
||||
title: Bugs and Requests
|
||||
image: /images/user-guide/api/api.png
|
||||
info: Ask for help on GitHub or Discord
|
||||
---
|
||||
<Frame>
|
||||
<img src="/images/user-guide/api/api.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
## Reporting Bugs
|
||||
To report a bug, please [create an issue on GitHub](https://github.com/twentyhq/twenty/issues/new).
|
||||
|
||||
You can also ask for help on [Discord](https://discord.gg/cx5n4Jzs57).
|
||||
|
||||
## Feature Requests
|
||||
|
||||
If you're not sure if it's a bug, and you feel it's closer to a feature request, then you should probably [open a discussion instead](https://github.com/twentyhq/twenty/discussions/new).
|
||||
|
||||
@@ -1,27 +1,24 @@
|
||||
---
|
||||
title: Best Practices
|
||||
image: /images/user-guide/tips/light-bulb.png
|
||||
---
|
||||
<Frame>
|
||||
<img src="/images/user-guide/tips/light-bulb.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
|
||||
This document outlines the best practices you should follow when working on the backend.
|
||||
|
||||
## Follow a modular approach
|
||||
|
||||
The backend follows a modular approach, which is a fundamental principle when working with NestJS. Make sure you break down your code into reusable modules to maintain a clean and organized codebase.
|
||||
Each module should encapsulate a particular feature or functionality and have a well-defined scope. This modular approach enables clear separation of concerns and removes unnecessary complexities.
|
||||
The backend follows a modular approach, which is a fundamental principle when working with NestJS. Make sure you break down your code into reusable modules to maintain a clean and organized codebase.
|
||||
Each module should encapsulate a particular feature or functionality and have a well-defined scope. This modular approach enables clear separation of concerns and removes unnecessary complexities.
|
||||
|
||||
## Expose services to use in modules
|
||||
|
||||
Always create services that have a clear and single responsibility, which enhances code readability and maintainability. Name the services descriptively and consistently.
|
||||
Always create services that have a clear and single responsibility, which enhances code readability and maintainability. Name the services descriptively and consistently.
|
||||
|
||||
You should also expose services that you want to use in other modules. Exposing services to other modules is possible through NestJS's powerful dependency injection system, and promotes loose coupling between components.
|
||||
You should also expose services that you want to use in other modules. Exposing services to other modules is possible through NestJS's powerful dependency injection system, and promotes loose coupling between components.
|
||||
|
||||
## Avoid using `any` type
|
||||
|
||||
When you declare a variable as `any`, TypeScript's type checker doesn't perform any type checking, making it possible to assign any type of values to the variable. TypeScript uses type inference to determine the type of variable based on the value. By declaring it as `any`, TypeScript can no longer infer the type. This makes it hard to catch type-related errors during development, leading to runtime errors and makes the code less maintainable, less reliable, and harder to understand for others.
|
||||
When you declare a variable as `any`, TypeScript's type checker doesn't perform any type checking, making it possible to assign any type of values to the variable. TypeScript uses type inference to determine the type of variable based on the value. By declaring it as `any`, TypeScript can no longer infer the type. This makes it hard to catch type-related errors during development, leading to runtime errors and makes the code less maintainable, less reliable, and harder to understand for others.
|
||||
|
||||
This is why everything should have a type. So if you create a new object with a first name and last name, you should create an interface or type that contains a first name and last name that defines the shape of the object you are manipulating.
|
||||
|
||||
@@ -1,19 +1,16 @@
|
||||
---
|
||||
title: Custom Objects
|
||||
image: /images/user-guide/objects/objects.png
|
||||
---
|
||||
<Frame>
|
||||
<img src="/images/user-guide/objects/objects.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
|
||||
Objects are structures that allow you to store data (records, attributes, and values) specific to an organization. Twenty provides both standard and custom objects.
|
||||
|
||||
Standard objects are in-built objects with a set of attributes available for all users. Examples of standard objects in Twenty include Company and Person. Standard objects have standard fields that are also available for all Twenty users, like Company.displayName.
|
||||
|
||||
Custom objects are objects that you can create to store information that is unique to your organization. They are not built-in; members of your workspace can create and customize custom objects to hold information that standard objects aren't suitable for.
|
||||
Custom objects are objects that you can create to store information that is unique to your organization. They are not built-in; members of your workspace can create and customize custom objects to hold information that standard objects aren't suitable for.
|
||||
|
||||
|
||||
## High-level schema
|
||||
## High-level schema
|
||||
|
||||
<div style={{textAlign: 'center'}}>
|
||||
<img src="/images/docs/server/custom-object-schema.png" alt="High level schema" />
|
||||
@@ -1,10 +1,7 @@
|
||||
---
|
||||
title: Feature Flags
|
||||
image: /images/user-guide/table-views/table.png
|
||||
---
|
||||
<Frame>
|
||||
<img src="/images/user-guide/table-views/table.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
|
||||
Feature flags are used to hide experimental features. For Twenty, they are set on workspace level and not on a user level.
|
||||
|
||||
@@ -1,18 +1,15 @@
|
||||
---
|
||||
title: Folder Architecture
|
||||
info: A detailed look into our server folder architecture
|
||||
image: /images/user-guide/fields/field.png
|
||||
---
|
||||
<Frame>
|
||||
<img src="/images/user-guide/fields/field.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
|
||||
The backend directory structure is as follows:
|
||||
|
||||
```
|
||||
server
|
||||
└───ability
|
||||
└───constants
|
||||
└───constants
|
||||
└───core
|
||||
└───database
|
||||
└───decorators
|
||||
@@ -29,19 +26,19 @@ server
|
||||
|
||||
Defines permissions and includes handlers for each entity.
|
||||
|
||||
## Decorators
|
||||
## Decorators
|
||||
|
||||
Defines custom decorators in NestJS for added functionality.
|
||||
Defines custom decorators in NestJS for added functionality.
|
||||
|
||||
See [custom decorators](https://docs.nestjs.com/custom-decorators) for more details.
|
||||
|
||||
## Filters
|
||||
|
||||
Includes exception filters to handle exceptions that might occur in GraphQL endpoints.
|
||||
Includes exception filters to handle exceptions that might occur in GraphQL endpoints.
|
||||
|
||||
## Guards
|
||||
|
||||
See [guards](https://docs.nestjs.com/guards) for more details.
|
||||
See [guards](https://docs.nestjs.com/guards) for more details.
|
||||
|
||||
## Health
|
||||
|
||||
@@ -53,15 +50,15 @@ Defines custom objects and makes available a GraphQL API (graphql/metadata).
|
||||
|
||||
## Workspace
|
||||
|
||||
Generates and serves custom GraphQL schema based on the metadata.
|
||||
Generates and serves custom GraphQL schema based on the metadata.
|
||||
|
||||
### Workspace Directory Structure
|
||||
### Workspace Directory Structure
|
||||
|
||||
```
|
||||
workspace
|
||||
|
||||
└───workspace-schema-builder
|
||||
└───factories
|
||||
└───factories
|
||||
└───graphql-types
|
||||
└───database
|
||||
└───interfaces
|
||||
@@ -77,28 +74,28 @@ workspace
|
||||
└───interfaces
|
||||
└───workspace-query-runner
|
||||
└───interfaces
|
||||
└───utils
|
||||
└───utils
|
||||
└───workspace-datasource
|
||||
└───workspace-manager
|
||||
└───workspace-migration-runner
|
||||
└───utils
|
||||
└───workspace.module.ts
|
||||
└───workspace.factory.spec.ts
|
||||
└───workspace.factory.ts
|
||||
└───utils
|
||||
└───workspace.module.ts
|
||||
└───workspace.factory.spec.ts
|
||||
└───workspace.factory.ts
|
||||
```
|
||||
|
||||
|
||||
The root of the workspace directory includes the `workspace.factory.ts`, a file containing the `createGraphQLSchema` function. This function generates workspace-specific schema by using the metadata to tailor a schema for individual workspaces. By separating the schema and resolver construction, we use the `makeExecutableSchema` function, which combines these discrete elements.
|
||||
The root of the workspace directory includes the `workspace.factory.ts`, a file containing the `createGraphQLSchema` function. This function generates workspace-specific schema by using the metadata to tailor a schema for individual workspaces. By separating the schema and resolver construction, we use the `makeExecutableSchema` function, which combines these discrete elements.
|
||||
|
||||
This strategy is not just about organization, but also helps with optimization, such as caching generated type definitions to enhance performance and scalability.
|
||||
|
||||
### Workspace Schema builder
|
||||
|
||||
Generates the GraphQL schema, and includes:
|
||||
Generates the GraphQL schema, and includes:
|
||||
|
||||
#### Factories:
|
||||
#### Factories:
|
||||
|
||||
Specialised constructors to generate GraphQL-related constructs.
|
||||
Specialised constructors to generate GraphQL-related constructs.
|
||||
- The type.factory translates field metadata into GraphQL types using `TypeMapperService`.
|
||||
- The type-definition.factory creates GraphQL input or output objects derived from `objectMetadata`.
|
||||
|
||||
@@ -114,17 +111,17 @@ Contains the blueprints for GraphQL entities, and includes both predefined and c
|
||||
|
||||
Contains the service responsible for associating FieldMetadataType with its appropriate GraphQL scalar or query modifiers.
|
||||
|
||||
#### Storage
|
||||
#### Storage
|
||||
|
||||
Includes the `TypeDefinitionsStorage` class that contains reusable type definitions, preventing duplication of GraphQL types.
|
||||
|
||||
### Workspace Resolver Builder
|
||||
### Workspace Resolver Builder
|
||||
|
||||
Creates resolver functions for querying and mutating the GraphQL schema.
|
||||
|
||||
Each factory in this directory is responsible for producing a distinct resolver type, such as the `FindManyResolverFactory`, designed for adaptable application across various tables.
|
||||
|
||||
### Workspace Query Runner
|
||||
### Workspace Query Runner
|
||||
|
||||
Runs the generated queries on the database and parses the result.
|
||||
|
||||
@@ -1,10 +1,7 @@
|
||||
---
|
||||
title: Message Queue
|
||||
image: /images/user-guide/emails/emails_header.png
|
||||
---
|
||||
<Frame>
|
||||
<img src="/images/user-guide/emails/emails_header.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
|
||||
Queues facilitate async operations to be performed. They can be used for performing background tasks such as sending a welcome email on register.
|
||||
Each use case will have its own queue class extended from `MessageQueueServiceBase`.
|
||||
@@ -1,10 +1,7 @@
|
||||
---
|
||||
title: Backend Commands
|
||||
image: /images/user-guide/kanban-views/kanban.png
|
||||
---
|
||||
<Frame>
|
||||
<img src="/images/user-guide/kanban-views/kanban.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
|
||||
## Useful commands
|
||||
|
||||
@@ -1,10 +1,7 @@
|
||||
---
|
||||
title: Zapier App
|
||||
image: /images/user-guide/integrations/plug.png
|
||||
---
|
||||
<Frame>
|
||||
<img src="/images/user-guide/integrations/plug.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
|
||||
Effortlessly sync Twenty with 3000+ apps using [Zapier](https://zapier.com/). Automate tasks, boost productivity, and supercharge your customer relationships!
|
||||
|
||||
@@ -12,7 +9,7 @@ Effortlessly sync Twenty with 3000+ apps using [Zapier](https://zapier.com/). Au
|
||||
|
||||
Zapier is a tool that allows you to automate workflows by connecting the apps that your team uses every day. The fundamental concept of Zapier is automation workflows, called Zaps, and include triggers and actions.
|
||||
|
||||
You can learn more about how Zapier works [here](https://zapier.com/how-it-works).
|
||||
You can learn more about how Zapier works [here](https://zapier.com/how-it-works).
|
||||
|
||||
## Setup
|
||||
|
||||
@@ -26,7 +23,7 @@ yarn
|
||||
|
||||
### Step 2: Login with the CLI
|
||||
|
||||
Use your Zapier credentials to log in using the CLI:
|
||||
Use your Zapier credentials to log in using the CLI:
|
||||
|
||||
```bash
|
||||
zapier login
|
||||
@@ -67,13 +64,13 @@ yarn watch
|
||||
```bash
|
||||
yarn validate
|
||||
```
|
||||
### Deploy your Zapier app
|
||||
### Deploy your Zapier app
|
||||
```bash
|
||||
yarn deploy
|
||||
```
|
||||
### List all Zapier CLI commands
|
||||
```bash
|
||||
zapier
|
||||
```
|
||||
```
|
||||
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
---
|
||||
title: Bugs, Requests & Pull Requests
|
||||
info: Report issues, request features, and contribute code
|
||||
---
|
||||
|
||||
|
||||
## Reporting Bugs
|
||||
|
||||
To report a bug, please [create an issue on GitHub](https://github.com/twentyhq/twenty/issues/new).
|
||||
|
||||
You can also ask for help on [Discord](https://discord.gg/cx5n4Jzs57).
|
||||
|
||||
## Feature Requests
|
||||
|
||||
If you're not sure if it's a bug, and you feel it's closer to a feature request, then you should probably [open a discussion instead](https://github.com/twentyhq/twenty/discussions/new).
|
||||
|
||||
## Submit a Pull Request
|
||||
|
||||
Contributing code to Twenty starts with a pull request (PR).
|
||||
|
||||
### Before You Start
|
||||
|
||||
1. Check [existing issues](https://github.com/twentyhq/twenty/issues) for related work
|
||||
2. For new features, open an issue first to discuss
|
||||
3. Review our [Code of Conduct](https://github.com/twentyhq/twenty/blob/main/CODE_OF_CONDUCT.md)
|
||||
|
||||
### Fork and Clone
|
||||
|
||||
1. Fork the repository on GitHub
|
||||
2. Clone your fork:
|
||||
```bash
|
||||
git clone https://github.com/YOUR_USERNAME/twenty.git
|
||||
cd twenty
|
||||
```
|
||||
|
||||
3. Add upstream remote:
|
||||
```bash
|
||||
git remote add upstream https://github.com/twentyhq/twenty.git
|
||||
```
|
||||
|
||||
### Create a Branch
|
||||
|
||||
```bash
|
||||
git checkout -b feature/your-feature-name
|
||||
```
|
||||
|
||||
Use descriptive branch names:
|
||||
- `feature/add-export-button`
|
||||
- `fix/login-redirect-issue`
|
||||
- `docs/update-api-guide`
|
||||
|
||||
### Make Your Changes
|
||||
|
||||
1. Write clean, well-documented code
|
||||
2. Follow existing code style
|
||||
3. Add tests for new functionality
|
||||
4. Update documentation if needed
|
||||
|
||||
### Submit Your PR
|
||||
|
||||
1. Push your branch:
|
||||
```bash
|
||||
git push origin feature/your-feature-name
|
||||
```
|
||||
|
||||
2. Open a PR on GitHub
|
||||
3. Fill in the PR template
|
||||
4. Link related issues
|
||||
|
||||
### PR Checklist
|
||||
|
||||
- [ ] Code follows project style guidelines
|
||||
- [ ] Tests pass locally
|
||||
- [ ] Documentation is updated
|
||||
- [ ] PR description explains the changes
|
||||
|
||||
@@ -1,10 +1,7 @@
|
||||
---
|
||||
title: Best Practices
|
||||
image: /images/user-guide/tips/light-bulb.png
|
||||
---
|
||||
<Frame>
|
||||
<img src="/images/user-guide/tips/light-bulb.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
|
||||
This document outlines the best practices you should follow when working on the frontend.
|
||||
|
||||
@@ -14,7 +11,7 @@ React and Recoil handle state management in the codebase.
|
||||
|
||||
### Use `useRecoilState` to store state
|
||||
|
||||
It's good practice to create as many atoms as you need to store your state.
|
||||
It's good practice to create as many atoms as you need to store your state.
|
||||
|
||||
<Warning>
|
||||
|
||||
@@ -44,7 +41,7 @@ export const MyComponent = () => {
|
||||
|
||||
### Do not use `useRef` to store state
|
||||
|
||||
Avoid using `useRef` to store state.
|
||||
Avoid using `useRef` to store state.
|
||||
|
||||
If you want to store state, you should use `useState` or `useRecoilState`.
|
||||
|
||||
@@ -83,7 +80,7 @@ If you feel like you need to add a `useEffect` in your root component, you shoul
|
||||
You can apply the same for data fetching logic, with Apollo hooks.
|
||||
|
||||
```tsx
|
||||
// ❌ Bad, will cause re-renders even if data is not changing,
|
||||
// ❌ Bad, will cause re-renders even if data is not changing,
|
||||
// because useEffect needs to be re-evaluated
|
||||
export const PageComponent = () => {
|
||||
const [data, setData] = useRecoilState(dataState);
|
||||
@@ -106,7 +103,7 @@ export const App = () => (
|
||||
```
|
||||
|
||||
```tsx
|
||||
// ✅ Good, will not cause re-renders if data is not changing,
|
||||
// ✅ Good, will not cause re-renders if data is not changing,
|
||||
// because useEffect is re-evaluated in another sibling component
|
||||
export const PageComponent = () => {
|
||||
const [data, setData] = useRecoilState(dataState);
|
||||
@@ -151,10 +148,10 @@ They are often not necessary and will make the code harder to read and maintain
|
||||
|
||||
## Console.logs
|
||||
|
||||
`console.log` statements are valuable during development, offering real-time insights into variable values and code flow. But, leaving them in production code can lead to several issues:
|
||||
`console.log` statements are valuable during development, offering real-time insights into variable values and code flow. But, leaving them in production code can lead to several issues:
|
||||
|
||||
1. **Performance**: Excessive logging can affect the runtime performance, especially on client-side applications.
|
||||
|
||||
|
||||
2. **Security**: Logging sensitive data can expose critical information to anyone who inspects the browser's console.
|
||||
|
||||
3. **Cleanliness**: Filling up the console with logs can obscure important warnings or errors that developers or tools need to see.
|
||||
@@ -240,7 +237,7 @@ const Form = () => <EmailField value="username@email.com" />;
|
||||
|
||||
Try as much as possible to pass uninstantiated components as props, so children can decide on their own of what props they need to pass.
|
||||
|
||||
The most common example for that is icon components:
|
||||
The most common example for that is icon components:
|
||||
|
||||
```tsx
|
||||
const SomeParentComponent = () => <MyComponent Icon={MyIcon} />;
|
||||
@@ -264,7 +261,7 @@ For React to understand that the component is a component, you need to use Pasca
|
||||
Prop drilling, in the React context, refers to the practice of passing state variables and their setters through many component layers, even if intermediary components don't use them. While sometimes necessary, excessive prop drilling can lead to:
|
||||
|
||||
1. **Decreased Readability**: Tracing where a prop originates or where it's utilized can become convoluted in a deeply nested component structure.
|
||||
|
||||
|
||||
2. **Maintenance Challenges**: Changes in one component's prop structure might require adjustments in several components, even if they don't directly use the prop.
|
||||
|
||||
3. **Reduced Component Reusability**: A component receiving a lot of props solely for passing them down becomes less general-purpose and harder to reuse in different contexts.
|
||||
@@ -1,11 +1,8 @@
|
||||
---
|
||||
title: Folder Architecture
|
||||
info: A detailed look into our folder architecture
|
||||
image: /images/user-guide/fields/field.png
|
||||
---
|
||||
<Frame>
|
||||
<img src="/images/user-guide/fields/field.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
|
||||
In this guide, you will explore the details of the project directory structure and how it contributes to the organization and maintainability of Twenty.
|
||||
|
||||
@@ -1,10 +1,7 @@
|
||||
---
|
||||
title: Frontend Commands
|
||||
image: /images/user-guide/create-workspace/workspace-cover.png
|
||||
---
|
||||
<Frame>
|
||||
<img src="/images/user-guide/create-workspace/workspace-cover.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
|
||||
## Useful commands
|
||||
|
||||
@@ -75,13 +72,13 @@ The project has a clean and simple stack, with minimal boilerplate code.
|
||||
|
||||
[React Router](https://reactrouter.com/) handles the routing.
|
||||
|
||||
To avoid unnecessary [re-renders](/developers/frontend-development/best-practices-front#managing-re-renders) all the routing logic is in a `useEffect` in `PageChangeEffect`.
|
||||
To avoid unnecessary [re-renders](/developers/contribute/capabilities/frontend-development/best-practices-front#managing-re-renders) all the routing logic is in a `useEffect` in `PageChangeEffect`.
|
||||
|
||||
### State Management
|
||||
|
||||
[Recoil](https://recoiljs.org/docs/introduction/core-concepts) handles state management.
|
||||
|
||||
See [best practices](/developers/frontend-development/best-practices-front#state-management) for more information on state management.
|
||||
See [best practices](/developers/contribute/capabilities/frontend-development/best-practices-front#state-management) for more information on state management.
|
||||
|
||||
## Testing
|
||||
|
||||
@@ -1,10 +1,7 @@
|
||||
---
|
||||
title: Hotkeys
|
||||
image: /images/user-guide/table-views/table.png
|
||||
---
|
||||
<Frame>
|
||||
<img src="/images/user-guide/table-views/table.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
|
||||
## Introduction
|
||||
|
||||
@@ -38,7 +35,7 @@ The second use case can happen recursively : a dropdown in a modal for example.
|
||||
|
||||
### Listening to hotkeys in a page
|
||||
|
||||
Example :
|
||||
Example :
|
||||
|
||||
```tsx
|
||||
const PageListeningEnter = () => {
|
||||
@@ -129,7 +126,7 @@ const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => {
|
||||
};
|
||||
```
|
||||
|
||||
It's important to use this pattern when you're not sure that just using a useEffect with mount/unmount will be enough to avoid conflicts.
|
||||
It's important to use this pattern when you're not sure that just using a useEffect with mount/unmount will be enough to avoid conflicts.
|
||||
|
||||
Those conflicts can be hard to debug, and it might happen more often than not with useEffects.
|
||||
|
||||
@@ -162,7 +159,7 @@ export enum PageHotkeyScope {
|
||||
}
|
||||
```
|
||||
|
||||
Internally, the currently selected scope is stored in a Recoil state that is shared across the application :
|
||||
Internally, the currently selected scope is stored in a Recoil state that is shared across the application :
|
||||
|
||||
```tsx
|
||||
export const currentHotkeyScopeState = createState<HotkeyScope>({
|
||||
@@ -177,4 +174,4 @@ But this Recoil state should never be handled manually ! We'll see how to use it
|
||||
|
||||
We made a thin wrapper on top of [react-hotkeys-hook](https://react-hotkeys-hook.vercel.app/docs/intro) that makes it more performant and avoids unnecessary re-renders.
|
||||
|
||||
We also create a Recoil state to handle the hotkey scope state and make it available everywhere in the application.
|
||||
We also create a Recoil state to handle the hotkey scope state and make it available everywhere in the application.
|
||||
@@ -1,14 +1,11 @@
|
||||
---
|
||||
title: Style Guide
|
||||
image: /images/user-guide/notes/notes_header.png
|
||||
---
|
||||
<Frame>
|
||||
<img src="/images/user-guide/notes/notes_header.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
|
||||
This document includes the rules to follow when writing code.
|
||||
|
||||
The goal here is to have a consistent codebase, which is easy to read and easy to maintain.
|
||||
The goal here is to have a consistent codebase, which is easy to read and easy to maintain.
|
||||
|
||||
For this, it's better to be a bit more verbose than to be too concise.
|
||||
|
||||
@@ -71,11 +68,11 @@ const EmailField: React.FC<{
|
||||
```
|
||||
|
||||
```tsx
|
||||
/* ✅ - Good, a separate type (OwnProps) is explicitly defined for the
|
||||
/* ✅ - Good, a separate type (OwnProps) is explicitly defined for the
|
||||
* component's props
|
||||
* - This method doesn't automatically include the children prop. If
|
||||
* you want to include it, you have to specify it in OwnProps.
|
||||
*/
|
||||
*/
|
||||
type EmailFieldProps = {
|
||||
value: string;
|
||||
};
|
||||
@@ -100,7 +97,7 @@ const MyComponent = (props: OwnProps) => {
|
||||
```tsx
|
||||
/* ✅ - Good, Explicitly lists all props
|
||||
* - Enhances readability and maintainability
|
||||
*/
|
||||
*/
|
||||
const MyComponent = ({ prop1, prop2, prop3 }: MyComponentProps) => {
|
||||
return <OtherComponent {...{ prop1, prop2, prop3 }} />;
|
||||
};
|
||||
@@ -111,7 +108,7 @@ Rationale:
|
||||
- It helps to prevent tight coupling between components via their props.
|
||||
- Linting tools make it easier to identify misspelled or unused props when you list props explicitly.
|
||||
|
||||
## JavaScript
|
||||
## JavaScript
|
||||
|
||||
### Use nullish-coalescing operator `??`
|
||||
|
||||
@@ -126,7 +123,7 @@ const value = process.env.MY_VALUE ?? 'default';
|
||||
### Use optional chaining `?.`
|
||||
|
||||
```tsx
|
||||
// ❌ Bad
|
||||
// ❌ Bad
|
||||
onClick && onClick();
|
||||
|
||||
// ✅ Good
|
||||
@@ -155,7 +152,7 @@ type MyType = {
|
||||
|
||||
[String literals](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#literal-types) are the go-to way to handle enum-like values in TypeScript. They are easier to extend with Pick and Omit, and offer a better developer experience, specially with code completion.
|
||||
|
||||
You can see why TypeScript recommends avoiding enums [here](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#enums).
|
||||
You can see why TypeScript recommends avoiding enums [here](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#enums).
|
||||
|
||||
```tsx
|
||||
// ❌ Bad, utilizes an enum
|
||||
@@ -180,7 +177,7 @@ You should use enums that GraphQL codegen generates.
|
||||
|
||||
It's also better to use an enum when using an internal library, so the internal library doesn't have to expose a string literal type that is not related to the internal API.
|
||||
|
||||
Example:
|
||||
Example:
|
||||
|
||||
```TSX
|
||||
const {
|
||||
@@ -263,7 +260,7 @@ const StyledButton = styled.button`
|
||||
```
|
||||
## Enforcing No-Type Imports
|
||||
|
||||
Avoid type imports. To enforce this standard, an ESLint rule checks for and reports any type imports. This helps maintain consistency and readability in the TypeScript code.
|
||||
Avoid type imports. To enforce this standard, an ESLint rule checks for and reports any type imports. This helps maintain consistency and readability in the TypeScript code.
|
||||
|
||||
```tsx
|
||||
// ❌ Bad
|
||||
@@ -1,11 +1,8 @@
|
||||
---
|
||||
title: Work with Figma
|
||||
info: Learn how you can collaborate with Twenty's Figma
|
||||
image: /images/user-guide/objects/objects.png
|
||||
---
|
||||
<Frame>
|
||||
<img src="/images/user-guide/objects/objects.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
|
||||
Figma is a collaborative interface design tool that aids in bridging the communication barrier between designers and developers.
|
||||
This guide explains how you can collaborate with Figma.
|
||||
@@ -13,7 +10,7 @@ This guide explains how you can collaborate with Figma.
|
||||
## Access
|
||||
|
||||
1. **Access the shared link:** You can access the project's Figma file [here](https://www.figma.com/file/xt8O9mFeLl46C5InWwoMrN/Twenty).
|
||||
2. **Sign in:** If you're not already signed in, Figma will prompt you to do so.
|
||||
2. **Sign in:** If you're not already signed in, Figma will prompt you to do so.
|
||||
Key features are only available to logged-in users, such as the developer mode and the ability to select a dedicated frame.
|
||||
|
||||
<Warning>
|
||||
@@ -39,7 +36,7 @@ With read-only access, you can't edit the design, but you can access all feature
|
||||
|
||||
Figma's Dev Mode enhances developers' productivity by providing easy design navigation, effective asset management, efficient communication tools, toolbox integrations, quick code snippets, and key layer information, bridging the gap between design and development. You can learn more about Dev Mode [here](https://www.figma.com/dev-mode/).
|
||||
|
||||
Switch to the "Developer" mode in the right part of the toolbar to see design specs, copy CSS, and access assets.
|
||||
Switch to the "Developer" mode in the right part of the toolbar to see design specs, copy CSS, and access assets.
|
||||
|
||||
### Use the Prototype
|
||||
|
||||
@@ -1,12 +1,8 @@
|
||||
---
|
||||
title: Local Setup
|
||||
description: "The guide for contributors (or curious developers) who want to run Twenty locally."
|
||||
image: /images/user-guide/fields/field.png
|
||||
---
|
||||
|
||||
<Frame>
|
||||
<img src="/images/user-guide/fields/field.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
## Prerequisites
|
||||
|
||||
@@ -231,7 +227,7 @@ If you need a Client GUI, we recommend [redis insight](https://redis.io/insight/
|
||||
|
||||
## Step 5: Setup environment variables
|
||||
|
||||
Use environment variables or `.env` files to configure your project. More info [here](https://docs.twenty.com/developers/self-hosting/setup)
|
||||
Use environment variables or `.env` files to configure your project. More info [here](/developers/self-host/capabilities/setup)
|
||||
|
||||
Copy the `.env.example` files in `/front` and `/server`:
|
||||
```bash
|
||||
@@ -300,4 +296,4 @@ You can log in using the default demo account: `tim@apple.dev` (password: `tim@a
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
If you encounter any problem, check [Troubleshooting](https://docs.twenty.com/developers/self-hosting/troubleshooting) for solutions.
|
||||
If you encounter any problem, check [Troubleshooting](/developers/self-host/capabilities/troubleshooting) for solutions.
|
||||
@@ -0,0 +1,31 @@
|
||||
---
|
||||
title: Contribute
|
||||
description: Contribute to Twenty's open-source development.
|
||||
---
|
||||
<Frame>
|
||||
<img src="/images/user-guide/github/github-header.png" alt="AI" />
|
||||
</Frame>
|
||||
|
||||
## Overview
|
||||
|
||||
Twenty is open-source and welcomes contributions from the community. Whether you're fixing bugs, adding features, or improving documentation, your contributions help make Twenty better for everyone.
|
||||
|
||||
## Ways to Contribute
|
||||
|
||||
- **Report bugs**: Help identify and document issues
|
||||
- **Submit features**: Propose and implement new functionality
|
||||
- **Improve documentation**: Make our docs clearer and more helpful
|
||||
- **Frontend development**: Work on the React-based UI
|
||||
- **Backend development**: Contribute to the NestJS server
|
||||
|
||||
## Getting Started
|
||||
|
||||
<CardGroup cols={2}>
|
||||
<Card title="Bug Reports & Requests" icon="bug" href="/developers/contribute/capabilities/bug-and-requests">
|
||||
Report issues or request features
|
||||
</Card>
|
||||
<Card title="Frontend Development" icon="browser" href="/developers/contribute/capabilities/frontend-development">
|
||||
Contribute to the UI
|
||||
</Card>
|
||||
</CardGroup>
|
||||
|
||||
@@ -0,0 +1,141 @@
|
||||
---
|
||||
title: APIs
|
||||
description: Query and modify your CRM data programmatically using REST or GraphQL.
|
||||
---
|
||||
|
||||
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
|
||||
|
||||
Twenty was built to be developer-friendly, offering powerful APIs that adapt to your custom data model. We provide four distinct API types to meet different integration needs.
|
||||
|
||||
## Developer-First Approach
|
||||
|
||||
Twenty generates APIs specifically for your data model:
|
||||
- **No long IDs required**: Use your object and field names directly in endpoints
|
||||
- **Standard and custom objects treated equally**: Your custom objects get the same API treatment as built-in ones
|
||||
- **Dedicated endpoints**: Each object and field gets its own API endpoint
|
||||
- **Custom documentation**: Generated specifically for your workspace's data model
|
||||
|
||||
<Note>
|
||||
Your personalized API documentation is available under **Settings → API & Webhooks** after creating an API key. Since Twenty generates APIs that match your custom data model, the documentation is unique to your workspace.
|
||||
</Note>
|
||||
|
||||
## The Two API Types
|
||||
|
||||
### Core API
|
||||
Accessed on `/rest/` or `/graphql/`
|
||||
|
||||
Work with your actual **records** (the data):
|
||||
- Create, read, update, delete People, Companies, Opportunities, etc.
|
||||
- Query and filter data
|
||||
- Manage record relationships
|
||||
|
||||
### Metadata API
|
||||
Accessed on `/rest/metadata/` or `/metadata/`
|
||||
|
||||
Manage your **workspace and data model**:
|
||||
- Create, modify, or delete objects and fields
|
||||
- Configure workspace settings
|
||||
- Define relationships between objects
|
||||
|
||||
## REST vs GraphQL
|
||||
|
||||
Both Core and Metadata APIs are available in REST and GraphQL formats:
|
||||
|
||||
| Format | Available Operations |
|
||||
|--------|---------------------|
|
||||
| **REST** | CRUD, batch operations, upserts |
|
||||
| **GraphQL** | Same + **batch upserts**, relationship queries in one call |
|
||||
|
||||
Choose based on your needs — both formats access the same data.
|
||||
|
||||
## API Endpoints
|
||||
|
||||
| Environment | Base URL |
|
||||
|-------------|----------|
|
||||
| **Cloud** | `https://api.twenty.com/` |
|
||||
| **Self-Hosted** | `https://{your-domain}/` |
|
||||
|
||||
## Authentication
|
||||
|
||||
Every API request requires an API key in the header:
|
||||
|
||||
```
|
||||
Authorization: Bearer YOUR_API_KEY
|
||||
```
|
||||
|
||||
### Create an API Key
|
||||
|
||||
1. Go to **Settings → APIs & Webhooks**
|
||||
2. Click **+ Create key**
|
||||
3. Configure:
|
||||
- **Name**: Descriptive name for the key
|
||||
- **Expiration Date**: When the key expires
|
||||
4. Click **Save**
|
||||
5. **Copy immediately** — the key is only shown once
|
||||
|
||||
<VimeoEmbed videoId="928786722" title="Creating API key" />
|
||||
|
||||
<Warning>
|
||||
Your API key grants access to sensitive data. Don't share it with untrusted services. If compromised, disable it immediately and generate a new one.
|
||||
</Warning>
|
||||
|
||||
### Assign a Role to an API Key
|
||||
|
||||
For better security, assign a specific role to limit access:
|
||||
|
||||
1. Go to **Settings → Roles**
|
||||
2. Click on the role to assign
|
||||
3. Open the **Assignment** tab
|
||||
4. Under **API Keys**, click **+ Assign to API key**
|
||||
5. Select the API key
|
||||
|
||||
The key will inherit that role's permissions. See [Permissions](/user-guide/permissions-access/capabilities/permissions) for details.
|
||||
|
||||
### Manage API Keys
|
||||
|
||||
**Regenerate**: Settings → APIs & Webhooks → Click key → **Regenerate**
|
||||
|
||||
**Delete**: Settings → APIs & Webhooks → Click key → **Delete**
|
||||
|
||||
## API Playground
|
||||
|
||||
Test your APIs directly in the browser with our built-in playground — available for both **REST** and **GraphQL**.
|
||||
|
||||
### Access the Playground
|
||||
|
||||
1. Go to **Settings → APIs & Webhooks**
|
||||
2. Create an API key (required)
|
||||
3. Click on **REST API** or **GraphQL API** to open the playground
|
||||
|
||||
### What You Get
|
||||
|
||||
- **Interactive documentation**: Generated for your specific data model
|
||||
- **Live testing**: Execute real API calls against your workspace
|
||||
- **Schema explorer**: Browse available objects, fields, and relationships
|
||||
- **Request builder**: Construct queries with autocomplete
|
||||
|
||||
The playground reflects your custom objects and fields, so documentation is always accurate for your workspace.
|
||||
|
||||
## Batch Operations
|
||||
|
||||
Both REST and GraphQL support batch operations:
|
||||
- **Batch size**: Up to 60 records per request
|
||||
- **Operations**: Create, update, delete multiple records
|
||||
|
||||
**GraphQL-only features:**
|
||||
- **Batch Upsert**: Create or update in one call
|
||||
- Use plural object names (e.g., `CreateCompanies` instead of `CreateCompany`)
|
||||
|
||||
## Rate Limits
|
||||
|
||||
API requests are throttled to ensure platform stability:
|
||||
|
||||
| Limit | Value |
|
||||
|-------|-------|
|
||||
| **Requests** | 100 calls per minute |
|
||||
| **Batch size** | 60 records per call |
|
||||
|
||||
<Tip>
|
||||
Use batch operations to maximize throughput — process up to 60 records in a single API call instead of making individual requests.
|
||||
</Tip>
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
---
|
||||
title: Twenty Apps
|
||||
description: Build and manage Twenty customizations as code.
|
||||
---
|
||||
|
||||
<Warning>
|
||||
Apps are currently in alpha testing. The feature is functional but still evolving.
|
||||
</Warning>
|
||||
|
||||
## What Are Apps?
|
||||
|
||||
Apps let you build and manage Twenty customizations **as code**. Instead of configuring everything through the UI, you define your data model and serverless functions in code — making it faster to build, maintain, and roll out to multiple workspaces.
|
||||
|
||||
**What you can do today:**
|
||||
- Define custom objects and fields as code (managed data model)
|
||||
- Build serverless functions with custom triggers
|
||||
- Deploy the same app across multiple workspaces
|
||||
|
||||
**Coming soon:**
|
||||
- Custom UI layouts and components
|
||||
|
||||
|
||||
## Getting Started (Coming Soon)
|
||||
@@ -0,0 +1,113 @@
|
||||
---
|
||||
title: Webhooks
|
||||
description: Receive real-time notifications when events occur in your CRM.
|
||||
---
|
||||
|
||||
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
|
||||
|
||||
|
||||
Webhooks push data to your systems in real-time when events occur in Twenty — no polling required. Use them to keep external systems in sync, trigger automations, or send alerts.
|
||||
|
||||
## Create a Webhook
|
||||
|
||||
1. Go to **Settings → APIs & Webhooks → Webhooks**
|
||||
2. Click **+ Create webhook**
|
||||
3. Enter your webhook URL (must be publicly accessible)
|
||||
4. Click **Save**
|
||||
|
||||
The webhook activates immediately and starts sending notifications.
|
||||
|
||||
<VimeoEmbed videoId="928786708" title="Creating a webhook" />
|
||||
|
||||
### Manage Webhooks
|
||||
|
||||
**Edit**: Click the webhook → Update URL → **Save**
|
||||
|
||||
**Delete**: Click the webhook → **Delete** → Confirm
|
||||
|
||||
## Events
|
||||
|
||||
Twenty sends webhooks for these event types:
|
||||
|
||||
| Event | Example |
|
||||
|-------|---------|
|
||||
| **Record Created** | `person.created`, `company.created`, `note.created` |
|
||||
| **Record Updated** | `person.updated`, `company.updated`, `opportunity.updated` |
|
||||
| **Record Deleted** | `person.deleted`, `company.deleted` |
|
||||
|
||||
All event types are sent to your webhook URL. Event filtering may be added in future releases.
|
||||
|
||||
## Payload Format
|
||||
|
||||
Each webhook sends an HTTP POST with a JSON body:
|
||||
|
||||
```json
|
||||
{
|
||||
"event": "person.created",
|
||||
"data": {
|
||||
"id": "abc12345",
|
||||
"firstName": "Alice",
|
||||
"lastName": "Doe",
|
||||
"email": "alice@example.com",
|
||||
"createdAt": "2025-02-10T15:30:45Z",
|
||||
"createdBy": "user_123"
|
||||
},
|
||||
"timestamp": "2025-02-10T15:30:50Z"
|
||||
}
|
||||
```
|
||||
|
||||
| Field | Description |
|
||||
|-------|-------------|
|
||||
| `event` | What happened (e.g., `person.created`) |
|
||||
| `data` | The full record that was created/updated/deleted |
|
||||
| `timestamp` | When the event occurred (UTC) |
|
||||
|
||||
<Note>
|
||||
Respond with a **2xx HTTP status** (200-299) to acknowledge receipt. Non-2xx responses are logged as delivery failures.
|
||||
</Note>
|
||||
|
||||
## Webhook Validation
|
||||
|
||||
Twenty signs each webhook request for security. Validate signatures to ensure requests are authentic.
|
||||
|
||||
### Headers
|
||||
|
||||
| Header | Description |
|
||||
|--------|-------------|
|
||||
| `X-Twenty-Webhook-Signature` | HMAC SHA256 signature |
|
||||
| `X-Twenty-Webhook-Timestamp` | Request timestamp |
|
||||
|
||||
### Validation Steps
|
||||
|
||||
1. Get the timestamp from `X-Twenty-Webhook-Timestamp`
|
||||
2. Create the string: `{timestamp}:{JSON payload}`
|
||||
3. Compute HMAC SHA256 using your webhook secret
|
||||
4. Compare with `X-Twenty-Webhook-Signature`
|
||||
|
||||
### Example (Node.js)
|
||||
|
||||
```javascript
|
||||
const crypto = require("crypto");
|
||||
|
||||
const timestamp = req.headers["x-twenty-webhook-timestamp"];
|
||||
const payload = JSON.stringify(req.body);
|
||||
const secret = "your-webhook-secret";
|
||||
|
||||
const stringToSign = `${timestamp}:${payload}`;
|
||||
const expectedSignature = crypto
|
||||
.createHmac("sha256", secret)
|
||||
.update(stringToSign)
|
||||
.digest("hex");
|
||||
|
||||
const isValid = expectedSignature === req.headers["x-twenty-webhook-signature"];
|
||||
```
|
||||
|
||||
## Webhooks vs Workflows
|
||||
|
||||
| Method | Direction | Use Case |
|
||||
|--------|-----------|----------|
|
||||
| **Webhooks** | OUT | Automatically notify external systems of any record change |
|
||||
| **Workflow + HTTP Request** | OUT | Send data out with custom logic (filters, transformations) |
|
||||
| **Workflow Webhook Trigger** | IN | Receive data into Twenty from external systems |
|
||||
|
||||
For receiving external data, see [Set Up a Webhook Trigger](/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger).
|
||||
@@ -0,0 +1,33 @@
|
||||
---
|
||||
title: Extend
|
||||
description: Extend Twenty's functionality with APIs, webhooks, and custom apps.
|
||||
---
|
||||
<Frame>
|
||||
<img src="/images/user-guide/integrations/plug.png" alt="AI" />
|
||||
</Frame>
|
||||
|
||||
## Overview
|
||||
|
||||
Twenty is designed to be extensible. Use our APIs, webhooks, and app framework to integrate with your existing tools and build custom functionality.
|
||||
|
||||
## What You Can Do
|
||||
|
||||
- **APIs**: Query and modify your CRM data programmatically using REST or GraphQL
|
||||
- **Webhooks**: Receive real-time notifications when events occur in Twenty
|
||||
- **Apps**: Build custom applications that extend Twenty's capabilities - Coming soon!
|
||||
|
||||
## Getting Started
|
||||
|
||||
<CardGroup cols={2}>
|
||||
<Card title="APIs" icon="code" href="/developers/extend/capabilities/apis">
|
||||
Connect to Twenty programmatically
|
||||
</Card>
|
||||
<Card title="Webhooks" icon="bell" href="/developers/extend/capabilities/webhooks">
|
||||
Get notified of events in real-time
|
||||
</Card>
|
||||
<Card title="Apps" icon="puzzle-piece" href="/developers/extend/capabilities/apps">
|
||||
Build customizations as code (Alpha)
|
||||
</Card>
|
||||
</CardGroup>
|
||||
|
||||
|
||||
@@ -1,44 +1,23 @@
|
||||
---
|
||||
title: Overview
|
||||
description: Technical documentation for contributors and developers working with Twenty
|
||||
title: Getting Started
|
||||
description: Welcome to Twenty Developer Documentation, your resources for extending, self-hosting, and contributing to Twenty.
|
||||
---
|
||||
|
||||
import { CardTitle } from "/snippets/card-title.mdx"
|
||||
|
||||
## Getting started
|
||||
|
||||
<CardGroup cols={2}>
|
||||
<Card href="/developers/local-setup" img="/images/user-guide/fields/field.png">
|
||||
<CardTitle>Local Setup</CardTitle>
|
||||
The guide for contributors (or curious developers) who want to run Twenty locally (on laptop, PC...)
|
||||
<CardGroup cols={3}>
|
||||
<Card href="/developers/extend/extend" img="/images/user-guide/integrations/plug.png">
|
||||
<CardTitle>Extend</CardTitle>
|
||||
Build integrations with APIs, webhooks, and custom apps.
|
||||
</Card>
|
||||
|
||||
<Card href="/developers/self-hosting/docker-compose" img="/images/user-guide/integrations/plug.png">
|
||||
<CardTitle>Self-Hosting</CardTitle>
|
||||
Learn how to host Twenty on your own server
|
||||
<Card href="/developers/self-host/self-host" img="/images/user-guide/what-is-twenty/20.png">
|
||||
<CardTitle>Self-Host</CardTitle>
|
||||
Deploy and manage Twenty on your own infrastructure.
|
||||
</Card>
|
||||
|
||||
<Card href="/developers/api-and-webhooks/api" img="/images/user-guide/api/api.png">
|
||||
<CardTitle>API and Webhooks</CardTitle>
|
||||
REST and GraphQL APIs, webhooks, and integrations
|
||||
</Card>
|
||||
</CardGroup>
|
||||
|
||||
## Contributing
|
||||
|
||||
<CardGroup cols={2}>
|
||||
<Card href="/developers/bug-and-requests" img="/images/user-guide/api/api.png">
|
||||
<CardTitle>Bugs and Requests</CardTitle>
|
||||
Ask for help on GitHub or Discord
|
||||
</Card>
|
||||
|
||||
<Card href="/developers/frontend-development/frontend-commands" img="/images/user-guide/create-workspace/workspace-cover.png">
|
||||
<CardTitle>Frontend Development</CardTitle>
|
||||
Frontend commands, Figma, React Best Practices...
|
||||
</Card>
|
||||
|
||||
<Card href="/developers/backend-development/server-commands" img="/images/user-guide/kanban-views/kanban.png">
|
||||
<CardTitle>Backend Development</CardTitle>
|
||||
NestJS, Custom Objects, Queues...
|
||||
<Card href="/developers/contribute/contribute" img="/images/user-guide/github/github-header.png">
|
||||
<CardTitle>Contribute</CardTitle>
|
||||
Join our open-source community and contribute to Twenty.
|
||||
</Card>
|
||||
</CardGroup>
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
---
|
||||
title: Other methods
|
||||
image: /images/user-guide/notes/notes_header.png
|
||||
---
|
||||
<Frame>
|
||||
<img src="/images/user-guide/notes/notes_header.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
<Warning>
|
||||
This document is maintained by the community. It might contain issues.
|
||||
@@ -1,13 +1,10 @@
|
||||
---
|
||||
title: 1-Click w/ Docker Compose
|
||||
image: /images/user-guide/objects/objects.png
|
||||
---
|
||||
<Frame>
|
||||
<img src="/images/user-guide/objects/objects.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
|
||||
<Warning>
|
||||
Docker containers are for production hosting or self-hosting, for the contribution please check the [Local Setup](https://docs.twenty.com/developers/local-setup).
|
||||
Docker containers are for production hosting or self-hosting, for the contribution please check the [Local Setup](/developers/contribute/capabilities/local-setup).
|
||||
</Warning>
|
||||
|
||||
## Overview
|
||||
@@ -16,7 +13,7 @@ This guide provides step-by-step instructions to install and configure the Twent
|
||||
|
||||
**Important:** Only modify settings explicitly mentioned in this guide. Altering other configurations may lead to issues.
|
||||
|
||||
See docs [Setup Environment Variables](https://docs.twenty.com/developers/self-hosting/setup) for advanced configuration. All environment variables must be declared in the docker-compose.yml file at the server and / or worker level depending on the variable.
|
||||
See docs [Setup Environment Variables](/developers/self-host/capabilities/setup) for advanced configuration. All environment variables must be declared in the docker-compose.yml file at the server and / or worker level depending on the variable.
|
||||
|
||||
## System Requirements
|
||||
|
||||
@@ -194,8 +191,50 @@ We strongly recommend setting up Twenty behind a reverse proxy with SSL terminat
|
||||
If deploying to a stateless environment (e.g., certain cloud services), configure external storage to persist data.
|
||||
|
||||
|
||||
## Backup and Restore
|
||||
|
||||
Regular backups protect your CRM data from loss.
|
||||
|
||||
### Create a Database Backup
|
||||
|
||||
```bash
|
||||
docker exec twenty-postgres pg_dump -U postgres twenty > backup_$(date +%Y%m%d).sql
|
||||
```
|
||||
|
||||
### Automate Daily Backups
|
||||
|
||||
Add to your crontab (`crontab -e`):
|
||||
|
||||
```bash
|
||||
0 2 * * * docker exec twenty-postgres pg_dump -U postgres twenty > /backups/twenty_$(date +\%Y\%m\%d).sql
|
||||
```
|
||||
|
||||
### Restore from Backup
|
||||
|
||||
1. Stop the application:
|
||||
```bash
|
||||
docker compose stop twenty-server twenty-front
|
||||
```
|
||||
|
||||
2. Restore the database:
|
||||
```bash
|
||||
docker exec -i twenty-postgres psql -U postgres twenty < backup_20240115.sql
|
||||
```
|
||||
|
||||
3. Restart services:
|
||||
```bash
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
### Backup Best Practices
|
||||
|
||||
- **Test restores regularly** — verify backups actually work
|
||||
- **Store backups off-site** — use cloud storage (S3, GCS, etc.)
|
||||
- **Encrypt sensitive data** — protect backups with encryption
|
||||
- **Retain multiple copies** — keep daily, weekly, and monthly backups
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
If you encounter any problem, check [Troubleshooting](https://docs.twenty.com/developers/self-hosting/troubleshooting) for solutions.
|
||||
If you encounter any problem, check [Troubleshooting](/developers/self-host/capabilities/troubleshooting) for solutions.
|
||||
|
||||
|
||||
@@ -1,17 +1,13 @@
|
||||
---
|
||||
title: Setup
|
||||
image: /images/user-guide/table-views/table.png
|
||||
---
|
||||
<Frame>
|
||||
<img src="/images/user-guide/table-views/table.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
import OptionTable from '@site/src/theme/OptionTable'
|
||||
|
||||
# Configuration Management
|
||||
|
||||
<Warning>
|
||||
**First time installing?** Follow the [Docker Compose installation guide](https://docs.twenty.com/developers/self-hosting/docker-compose) to get Twenty running, then return here for configuration.
|
||||
**First time installing?** Follow the [Docker Compose installation guide](/developers/self-host/capabilities/docker-compose) to get Twenty running, then return here for configuration.
|
||||
</Warning>
|
||||
|
||||
Twenty offers **two configuration modes** to suit different deployment needs:
|
||||
@@ -1,10 +1,7 @@
|
||||
---
|
||||
title: Troubleshooting
|
||||
image: /images/user-guide/what-is-twenty/20.png
|
||||
---
|
||||
<Frame>
|
||||
<img src="/images/user-guide/what-is-twenty/20.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
@@ -71,25 +68,25 @@ This should work out of the box with the eslint extension installed. If this doe
|
||||
|
||||
In `packages/twenty-front/.env` uncomment `VITE_DISABLE_TYPESCRIPT_CHECKER=true` to disable background checks thus reducing amount of needed RAM.
|
||||
|
||||
**If it does not work:**
|
||||
**If it does not work:**
|
||||
Run only the services you need, instead of `npx nx start`. For instance, if you work on the server, run only `npx nx worker twenty-server`
|
||||
|
||||
**If it does not work:**
|
||||
**If it does not work:**
|
||||
If you tried to run only `npx nx run twenty-server:start` on WSL and it's failing with the below memory error:
|
||||
|
||||
`FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory`
|
||||
|
||||
Workaround is to execute below command in terminal or add it in .bashrc profile to get setup automatically:
|
||||
|
||||
`export NODE_OPTIONS="--max-old-space-size=8192"`
|
||||
`export NODE_OPTIONS="--max-old-space-size=8192"`
|
||||
|
||||
The --max-old-space-size=8192 flag sets an upper limit of 8GB for the Node.js heap; usage scales with application demand.
|
||||
Reference: https://stackoverflow.com/questions/56982005/where-do-i-set-node-options-max-old-space-size-2048
|
||||
|
||||
**If it does not work:**
|
||||
Investigate which processes are taking you most of your machine RAM. At Twenty, we noticed that some VScode extensions were taking a lot of RAM so we temporarily disable them.
|
||||
**If it does not work:**
|
||||
Investigate which processes are taking you most of your machine RAM. At Twenty, we noticed that some VScode extensions were taking a lot of RAM so we temporarily disable them.
|
||||
|
||||
**If it does not work:**
|
||||
**If it does not work:**
|
||||
Restart your machine helps to clean up ghost processes.
|
||||
|
||||
#### While running `npx nx start` there are weird [0] and [1] in logs
|
||||
@@ -97,16 +94,16 @@ Restart your machine helps to clean up ghost processes.
|
||||
That's expected as command `npx nx start` is running more commands under the hood
|
||||
|
||||
#### No emails are sent
|
||||
Most of the time, it's because the `worker` is not running in the background. Try to run
|
||||
Most of the time, it's because the `worker` is not running in the background. Try to run
|
||||
```
|
||||
npx nx worker twenty-server
|
||||
```
|
||||
|
||||
#### Cannot connect my Microsoft 365 account
|
||||
|
||||
Most of the time, it's because your admin has not enabled the Microsoft 365 Licence for your account. Check [https://admin.microsoft.com/](https://admin.microsoft.com/Adminportal/Home).
|
||||
Most of the time, it's because your admin has not enabled the Microsoft 365 Licence for your account. Check [https://admin.microsoft.com/](https://admin.microsoft.com/Adminportal/Home).
|
||||
|
||||
If you have an error code `AADSTS50020`, it probably means that you are using a personal Microsoft account. This is not supported yet. More info [here](https://learn.microsoft.com/fr-fr/troubleshoot/entra/entra-id/app-integration/error-code-aadsts50020-user-account-identity-provider-does-not-exist)
|
||||
If you have an error code `AADSTS50020`, it probably means that you are using a personal Microsoft account. This is not supported yet. More info [here](https://learn.microsoft.com/fr-fr/troubleshoot/entra/entra-id/app-integration/error-code-aadsts50020-user-account-identity-provider-does-not-exist)
|
||||
|
||||
#### While running `yarn` warnings appear in console
|
||||
|
||||
@@ -181,7 +178,7 @@ If you can't log in after setup:
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
Note the database:reset command will completely erase your database and recreate it from scratch.
|
||||
Note the database:reset command will completely erase your database and recreate it from scratch.
|
||||
|
||||
#### Connection Issues Behind a Reverse Proxy
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
---
|
||||
title: Upgrade guide
|
||||
image: /images/user-guide/notes/notes_header.png
|
||||
---
|
||||
<Frame>
|
||||
<img src="/images/user-guide/notes/notes_header.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
## General guidelines
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
---
|
||||
title: Self-Host
|
||||
description: Deploy and manage Twenty on your own infrastructure.
|
||||
---
|
||||
<Frame>
|
||||
<img src="/images/user-guide/what-is-twenty/20.png" alt="AI" />
|
||||
</Frame>
|
||||
## Overview
|
||||
|
||||
Twenty can be self-hosted on your own infrastructure, giving you full control over your data and deployment.
|
||||
|
||||
## Why Self-Host?
|
||||
|
||||
- **Data ownership**: Keep all CRM data on your own servers
|
||||
- **Compliance**: Meet regulatory requirements for data residency
|
||||
- **Customization**: Full access to modify and extend the platform
|
||||
|
||||
## Getting Started
|
||||
|
||||
<CardGroup cols={2}>
|
||||
<Card title="Docker Compose" icon="docker" href="/developers/self-host/capabilities/docker-compose">
|
||||
Quick setup with Docker
|
||||
</Card>
|
||||
<Card title="Cloud Providers" icon="cloud" href="/developers/self-host/capabilities/cloud-providers">
|
||||
Deploy on AWS, GCP, or Azure
|
||||
</Card>
|
||||
</CardGroup>
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
"user-guide/introduction",
|
||||
"user-guide/getting-started/what-is-twenty",
|
||||
"user-guide/getting-started/create-workspace",
|
||||
"user-guide/getting-started/getting-around-twenty",
|
||||
"user-guide/getting-started/navigate-around-twenty",
|
||||
"user-guide/getting-started/configure-your-workspace",
|
||||
"user-guide/getting-started/implementation-services",
|
||||
"user-guide/getting-started/migrating-from-other-crms",
|
||||
@@ -276,7 +276,7 @@
|
||||
"l/fr/user-guide/introduction",
|
||||
"l/fr/user-guide/getting-started/what-is-twenty",
|
||||
"l/fr/user-guide/getting-started/create-workspace",
|
||||
"l/fr/user-guide/getting-started/getting-around-twenty",
|
||||
"l/fr/user-guide/getting-started/navigate-around-twenty",
|
||||
"l/fr/user-guide/getting-started/configure-your-workspace",
|
||||
"l/fr/user-guide/getting-started/implementation-services",
|
||||
"l/fr/user-guide/getting-started/migrating-from-other-crms",
|
||||
@@ -512,7 +512,7 @@
|
||||
"l/ar/user-guide/introduction",
|
||||
"l/ar/user-guide/getting-started/what-is-twenty",
|
||||
"l/ar/user-guide/getting-started/create-workspace",
|
||||
"l/ar/user-guide/getting-started/getting-around-twenty",
|
||||
"l/ar/user-guide/getting-started/navigate-around-twenty",
|
||||
"l/ar/user-guide/getting-started/configure-your-workspace",
|
||||
"l/ar/user-guide/getting-started/implementation-services",
|
||||
"l/ar/user-guide/getting-started/migrating-from-other-crms",
|
||||
@@ -748,7 +748,7 @@
|
||||
"l/cs/user-guide/introduction",
|
||||
"l/cs/user-guide/getting-started/what-is-twenty",
|
||||
"l/cs/user-guide/getting-started/create-workspace",
|
||||
"l/cs/user-guide/getting-started/getting-around-twenty",
|
||||
"l/cs/user-guide/getting-started/navigate-around-twenty",
|
||||
"l/cs/user-guide/getting-started/configure-your-workspace",
|
||||
"l/cs/user-guide/getting-started/implementation-services",
|
||||
"l/cs/user-guide/getting-started/migrating-from-other-crms",
|
||||
@@ -984,7 +984,7 @@
|
||||
"l/de/user-guide/introduction",
|
||||
"l/de/user-guide/getting-started/what-is-twenty",
|
||||
"l/de/user-guide/getting-started/create-workspace",
|
||||
"l/de/user-guide/getting-started/getting-around-twenty",
|
||||
"l/de/user-guide/getting-started/navigate-around-twenty",
|
||||
"l/de/user-guide/getting-started/configure-your-workspace",
|
||||
"l/de/user-guide/getting-started/implementation-services",
|
||||
"l/de/user-guide/getting-started/migrating-from-other-crms",
|
||||
@@ -1220,7 +1220,7 @@
|
||||
"l/es/user-guide/introduction",
|
||||
"l/es/user-guide/getting-started/what-is-twenty",
|
||||
"l/es/user-guide/getting-started/create-workspace",
|
||||
"l/es/user-guide/getting-started/getting-around-twenty",
|
||||
"l/es/user-guide/getting-started/navigate-around-twenty",
|
||||
"l/es/user-guide/getting-started/configure-your-workspace",
|
||||
"l/es/user-guide/getting-started/implementation-services",
|
||||
"l/es/user-guide/getting-started/migrating-from-other-crms",
|
||||
@@ -1456,7 +1456,7 @@
|
||||
"l/it/user-guide/introduction",
|
||||
"l/it/user-guide/getting-started/what-is-twenty",
|
||||
"l/it/user-guide/getting-started/create-workspace",
|
||||
"l/it/user-guide/getting-started/getting-around-twenty",
|
||||
"l/it/user-guide/getting-started/navigate-around-twenty",
|
||||
"l/it/user-guide/getting-started/configure-your-workspace",
|
||||
"l/it/user-guide/getting-started/implementation-services",
|
||||
"l/it/user-guide/getting-started/migrating-from-other-crms",
|
||||
@@ -1692,7 +1692,7 @@
|
||||
"l/ja/user-guide/introduction",
|
||||
"l/ja/user-guide/getting-started/what-is-twenty",
|
||||
"l/ja/user-guide/getting-started/create-workspace",
|
||||
"l/ja/user-guide/getting-started/getting-around-twenty",
|
||||
"l/ja/user-guide/getting-started/navigate-around-twenty",
|
||||
"l/ja/user-guide/getting-started/configure-your-workspace",
|
||||
"l/ja/user-guide/getting-started/implementation-services",
|
||||
"l/ja/user-guide/getting-started/migrating-from-other-crms",
|
||||
@@ -1928,7 +1928,7 @@
|
||||
"l/ko/user-guide/introduction",
|
||||
"l/ko/user-guide/getting-started/what-is-twenty",
|
||||
"l/ko/user-guide/getting-started/create-workspace",
|
||||
"l/ko/user-guide/getting-started/getting-around-twenty",
|
||||
"l/ko/user-guide/getting-started/navigate-around-twenty",
|
||||
"l/ko/user-guide/getting-started/configure-your-workspace",
|
||||
"l/ko/user-guide/getting-started/implementation-services",
|
||||
"l/ko/user-guide/getting-started/migrating-from-other-crms",
|
||||
@@ -2164,7 +2164,7 @@
|
||||
"l/pt/user-guide/introduction",
|
||||
"l/pt/user-guide/getting-started/what-is-twenty",
|
||||
"l/pt/user-guide/getting-started/create-workspace",
|
||||
"l/pt/user-guide/getting-started/getting-around-twenty",
|
||||
"l/pt/user-guide/getting-started/navigate-around-twenty",
|
||||
"l/pt/user-guide/getting-started/configure-your-workspace",
|
||||
"l/pt/user-guide/getting-started/implementation-services",
|
||||
"l/pt/user-guide/getting-started/migrating-from-other-crms",
|
||||
@@ -2400,7 +2400,7 @@
|
||||
"l/ro/user-guide/introduction",
|
||||
"l/ro/user-guide/getting-started/what-is-twenty",
|
||||
"l/ro/user-guide/getting-started/create-workspace",
|
||||
"l/ro/user-guide/getting-started/getting-around-twenty",
|
||||
"l/ro/user-guide/getting-started/navigate-around-twenty",
|
||||
"l/ro/user-guide/getting-started/configure-your-workspace",
|
||||
"l/ro/user-guide/getting-started/implementation-services",
|
||||
"l/ro/user-guide/getting-started/migrating-from-other-crms",
|
||||
@@ -2636,7 +2636,7 @@
|
||||
"l/ru/user-guide/introduction",
|
||||
"l/ru/user-guide/getting-started/what-is-twenty",
|
||||
"l/ru/user-guide/getting-started/create-workspace",
|
||||
"l/ru/user-guide/getting-started/getting-around-twenty",
|
||||
"l/ru/user-guide/getting-started/navigate-around-twenty",
|
||||
"l/ru/user-guide/getting-started/configure-your-workspace",
|
||||
"l/ru/user-guide/getting-started/implementation-services",
|
||||
"l/ru/user-guide/getting-started/migrating-from-other-crms",
|
||||
@@ -2872,7 +2872,7 @@
|
||||
"l/tr/user-guide/introduction",
|
||||
"l/tr/user-guide/getting-started/what-is-twenty",
|
||||
"l/tr/user-guide/getting-started/create-workspace",
|
||||
"l/tr/user-guide/getting-started/getting-around-twenty",
|
||||
"l/tr/user-guide/getting-started/navigate-around-twenty",
|
||||
"l/tr/user-guide/getting-started/configure-your-workspace",
|
||||
"l/tr/user-guide/getting-started/implementation-services",
|
||||
"l/tr/user-guide/getting-started/migrating-from-other-crms",
|
||||
@@ -3108,7 +3108,7 @@
|
||||
"l/zh/user-guide/introduction",
|
||||
"l/zh/user-guide/getting-started/what-is-twenty",
|
||||
"l/zh/user-guide/getting-started/create-workspace",
|
||||
"l/zh/user-guide/getting-started/getting-around-twenty",
|
||||
"l/zh/user-guide/getting-started/navigate-around-twenty",
|
||||
"l/zh/user-guide/getting-started/configure-your-workspace",
|
||||
"l/zh/user-guide/getting-started/implementation-services",
|
||||
"l/zh/user-guide/getting-started/migrating-from-other-crms",
|
||||
@@ -3339,5 +3339,487 @@
|
||||
"twitter": "https://twitter.com/twentycrm",
|
||||
"discord": "https://discord.gg/cx5n4Jzs57"
|
||||
}
|
||||
}
|
||||
},
|
||||
"redirects": [
|
||||
{
|
||||
"source": "/developers/local-setup",
|
||||
"destination": "/developers/contribute/capabilities/local-setup"
|
||||
},
|
||||
{
|
||||
"source": "/developers/self-hosting",
|
||||
"destination": "/developers/self-host/self-host"
|
||||
},
|
||||
{
|
||||
"source": "/developers/self-hosting/docker-compose",
|
||||
"destination": "/developers/self-host/capabilities/docker-compose"
|
||||
},
|
||||
{
|
||||
"source": "/developers/self-hosting/setup",
|
||||
"destination": "/developers/self-host/capabilities/setup"
|
||||
},
|
||||
{
|
||||
"source": "/developers/self-hosting/upgrade-guide",
|
||||
"destination": "/developers/self-host/capabilities/upgrade-guide"
|
||||
},
|
||||
{
|
||||
"source": "/developers/self-hosting/cloud-providers",
|
||||
"destination": "/developers/self-host/capabilities/cloud-providers"
|
||||
},
|
||||
{
|
||||
"source": "/developers/self-hosting/troubleshooting",
|
||||
"destination": "/developers/self-host/capabilities/troubleshooting"
|
||||
},
|
||||
{
|
||||
"source": "/developers/api-and-webhooks",
|
||||
"destination": "/developers/extend/extend"
|
||||
},
|
||||
{
|
||||
"source": "/developers/api-and-webhooks/apis-overview",
|
||||
"destination": "/developers/extend/capabilities/apis"
|
||||
},
|
||||
{
|
||||
"source": "/developers/api-and-webhooks/api",
|
||||
"destination": "/developers/extend/capabilities/apis"
|
||||
},
|
||||
{
|
||||
"source": "/developers/api-and-webhooks/api-keys",
|
||||
"destination": "/developers/extend/capabilities/apis"
|
||||
},
|
||||
{
|
||||
"source": "/developers/api-and-webhooks/webhooks",
|
||||
"destination": "/developers/extend/capabilities/webhooks"
|
||||
},
|
||||
{
|
||||
"source": "/developers/api-and-webhooks/integrations",
|
||||
"destination": "/developers/extend/capabilities/apis"
|
||||
},
|
||||
{
|
||||
"source": "/developers/bugs-and-requests",
|
||||
"destination": "/developers/contribute/capabilities/bug-and-requests"
|
||||
},
|
||||
{
|
||||
"source": "/developers/frontend-development",
|
||||
"destination": "/developers/contribute/contribute"
|
||||
},
|
||||
{
|
||||
"source": "/developers/frontend-development/frontend-commands",
|
||||
"destination": "/developers/contribute/capabilities/frontend-development/frontend-commands"
|
||||
},
|
||||
{
|
||||
"source": "/developers/frontend-development/best-practices-front",
|
||||
"destination": "/developers/contribute/capabilities/frontend-development/best-practices-front"
|
||||
},
|
||||
{
|
||||
"source": "/developers/frontend-development/folder-architecture-front",
|
||||
"destination": "/developers/contribute/capabilities/frontend-development/folder-architecture-front"
|
||||
},
|
||||
{
|
||||
"source": "/developers/frontend-development/hotkeys",
|
||||
"destination": "/developers/contribute/capabilities/frontend-development/hotkeys"
|
||||
},
|
||||
{
|
||||
"source": "/developers/frontend-development/storybook",
|
||||
"destination": "/developers/contribute/capabilities/frontend-development/storybook"
|
||||
},
|
||||
{
|
||||
"source": "/developers/frontend-development/style-guide",
|
||||
"destination": "/developers/contribute/capabilities/frontend-development/style-guide"
|
||||
},
|
||||
{
|
||||
"source": "/developers/frontend-development/work-with-figma",
|
||||
"destination": "/developers/contribute/capabilities/frontend-development/work-with-figma"
|
||||
},
|
||||
{
|
||||
"source": "/developers/backend-development",
|
||||
"destination": "/developers/contribute/contribute"
|
||||
},
|
||||
{
|
||||
"source": "/developers/backend-development/server-commands",
|
||||
"destination": "/developers/contribute/capabilities/backend-development/server-commands"
|
||||
},
|
||||
{
|
||||
"source": "/developers/backend-development/best-practices-server",
|
||||
"destination": "/developers/contribute/capabilities/backend-development/best-practices-server"
|
||||
},
|
||||
{
|
||||
"source": "/developers/backend-development/custom-objects",
|
||||
"destination": "/developers/contribute/capabilities/backend-development/custom-objects"
|
||||
},
|
||||
{
|
||||
"source": "/developers/backend-development/feature-flags",
|
||||
"destination": "/developers/contribute/capabilities/backend-development/feature-flags"
|
||||
},
|
||||
{
|
||||
"source": "/developers/backend-development/folder-architecture-server",
|
||||
"destination": "/developers/contribute/capabilities/backend-development/folder-architecture-server"
|
||||
},
|
||||
{
|
||||
"source": "/developers/backend-development/queue",
|
||||
"destination": "/developers/contribute/capabilities/backend-development/queue"
|
||||
},
|
||||
{
|
||||
"source": "/developers/backend-development/zapier",
|
||||
"destination": "/developers/contribute/capabilities/backend-development/zapier"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/getting-started/what-is-twenty",
|
||||
"destination": "/user-guide/getting-started/capabilities/what-is-twenty"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/getting-started/implementation-services",
|
||||
"destination": "/user-guide/getting-started/capabilities/implementation-services"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/getting-started/glossary",
|
||||
"destination": "/user-guide/getting-started/capabilities/glossary"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/getting-started/create-workspace",
|
||||
"destination": "/user-guide/getting-started/how-tos/create-workspace"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/getting-started/navigate-around-twenty",
|
||||
"destination": "/user-guide/getting-started/how-tos/navigate-around-twenty"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/getting-started/configure-your-workspace",
|
||||
"destination": "/user-guide/getting-started/how-tos/configure-your-workspace"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/data-model/objects",
|
||||
"destination": "/user-guide/data-model/capabilities/objects"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/data-model/fields",
|
||||
"destination": "/user-guide/data-model/capabilities/fields"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/data-model/relation-fields",
|
||||
"destination": "/user-guide/data-model/capabilities/relation-fields"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/data-model/create-custom-objects",
|
||||
"destination": "/user-guide/data-model/how-tos/create-custom-objects"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/data-model/create-custom-fields",
|
||||
"destination": "/user-guide/data-model/how-tos/create-custom-fields"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/data-model/create-relation-fields",
|
||||
"destination": "/user-guide/data-model/how-tos/create-relation-fields"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/data-model/customize-your-data-model",
|
||||
"destination": "/user-guide/data-model/how-tos/customize-your-data-model"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/data-model/data-model-faq",
|
||||
"destination": "/user-guide/data-model/how-tos/data-model-faq"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/data-migration/file-formats",
|
||||
"destination": "/user-guide/data-migration/capabilities/file-formats"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/data-migration/field-mapping",
|
||||
"destination": "/user-guide/data-migration/capabilities/field-mapping"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/data-migration/uniqueness-constraints",
|
||||
"destination": "/user-guide/data-migration/capabilities/uniqueness-constraints"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/data-migration/import-relations",
|
||||
"destination": "/user-guide/data-migration/capabilities/import-relations"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/data-migration/error-handling",
|
||||
"destination": "/user-guide/data-migration/capabilities/error-handling"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/data-migration/prepare-your-csv-files",
|
||||
"destination": "/user-guide/data-migration/how-tos/prepare-your-csv-files"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/data-migration/import-companies-via-csv",
|
||||
"destination": "/user-guide/data-migration/how-tos/import-companies-via-csv"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/data-migration/import-contacts-via-csv",
|
||||
"destination": "/user-guide/data-migration/how-tos/import-contacts-via-csv"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/data-migration/import-relations-between-objects-via-csv",
|
||||
"destination": "/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/data-migration/update-existing-records-via-import",
|
||||
"destination": "/user-guide/data-migration/how-tos/update-existing-records-via-import"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/data-migration/fix-import-errors",
|
||||
"destination": "/user-guide/data-migration/how-tos/fix-import-errors"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/data-migration/export-your-data",
|
||||
"destination": "/user-guide/data-migration/how-tos/export-your-data"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/data-migration/import-data-via-api",
|
||||
"destination": "/user-guide/data-migration/how-tos/import-data-via-api"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/data-migration/migrating-from-other-crms",
|
||||
"destination": "/user-guide/data-migration/how-tos/migrating-from-other-crms"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/data-migration/migrating-from-self-hosted-to-cloud",
|
||||
"destination": "/user-guide/data-migration/how-tos/migrating-from-self-hosted-to-cloud"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/calendar-emails/mailbox",
|
||||
"destination": "/user-guide/calendar-emails/capabilities/mailbox"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/calendar-emails/calendar",
|
||||
"destination": "/user-guide/calendar-emails/capabilities/calendar"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/calendar-emails/connect-several-mailboxes-per-user",
|
||||
"destination": "/user-guide/calendar-emails/how-tos/connect-several-mailboxes-per-user"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/calendar-emails/limit-emails-imported",
|
||||
"destination": "/user-guide/calendar-emails/how-tos/limit-emails-imported"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/calendar-emails/can-i-track-email-activity-on-all-objects",
|
||||
"destination": "/user-guide/calendar-emails/how-tos/can-i-track-email-activity-on-all-objects"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/calendar-emails/can-i-send-emails-from-twenty",
|
||||
"destination": "/user-guide/calendar-emails/how-tos/can-i-send-emails-from-twenty"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/calendar-emails/can-i-book-meetings-from-twenty",
|
||||
"destination": "/user-guide/calendar-emails/how-tos/can-i-book-meetings-from-twenty"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/calendar-emails/i-dont-see-emails-on-records",
|
||||
"destination": "/user-guide/calendar-emails/how-tos/i-dont-see-emails-on-records"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/workflows/workflow-triggers",
|
||||
"destination": "/user-guide/workflows/capabilities/workflow-triggers"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/workflows/workflow-actions",
|
||||
"destination": "/user-guide/workflows/capabilities/workflow-actions"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/workflows/workflow-branches",
|
||||
"destination": "/user-guide/workflows/capabilities/workflow-branches"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/workflows/workflow-runs",
|
||||
"destination": "/user-guide/workflows/capabilities/workflow-runs"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/workflows/workflow-versions",
|
||||
"destination": "/user-guide/workflows/capabilities/workflow-versions"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/workflows/workflow-credits",
|
||||
"destination": "/user-guide/workflows/capabilities/workflow-credits"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/workflows/use-branches-in-workflows",
|
||||
"destination": "/user-guide/workflows/capabilities/use-branches-in-workflows"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/workflows/use-iterator",
|
||||
"destination": "/user-guide/workflows/capabilities/use-iterator"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/workflows/send-emails-from-workflows",
|
||||
"destination": "/user-guide/workflows/capabilities/send-emails-from-workflows"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/workflows/workflow-troubleshooting",
|
||||
"destination": "/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/workflows/workflows-faq",
|
||||
"destination": "/user-guide/workflows/how-tos/need-more-help/workflows-faq"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/workflows/professional-services",
|
||||
"destination": "/user-guide/workflows/how-tos/need-more-help/professional-services"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/ai/ai-chatbot",
|
||||
"destination": "/user-guide/ai/capabilities/ai-chatbot"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/ai/ai-agents",
|
||||
"destination": "/user-guide/ai/capabilities/ai-agents"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/ai/permissions-access-control",
|
||||
"destination": "/user-guide/ai/capabilities/permissions-access-control"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/ai/ai-faq",
|
||||
"destination": "/user-guide/ai/how-tos/ai-faq"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/views-pipelines/table-views",
|
||||
"destination": "/user-guide/views-pipelines/capabilities/table-views"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/views-pipelines/kanban-views",
|
||||
"destination": "/user-guide/views-pipelines/capabilities/kanban-views"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/views-pipelines/calendar-view",
|
||||
"destination": "/user-guide/views-pipelines/capabilities/calendar-view"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/views-pipelines/filters-and-sorting",
|
||||
"destination": "/user-guide/views-pipelines/capabilities/filters-and-sorting"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/views-pipelines/fields-and-columns",
|
||||
"destination": "/user-guide/views-pipelines/capabilities/fields-and-columns"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/views-pipelines/view-settings",
|
||||
"destination": "/user-guide/views-pipelines/capabilities/view-settings"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/views-pipelines/create-a-table-view-with-grouping",
|
||||
"destination": "/user-guide/views-pipelines/how-tos/create-a-table-view-with-grouping"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/views-pipelines/create-a-kanban-view-for-projects",
|
||||
"destination": "/user-guide/views-pipelines/how-tos/create-a-kanban-view-for-projects"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/views-pipelines/create-a-calendar-view-for-tasks-due",
|
||||
"destination": "/user-guide/views-pipelines/how-tos/create-a-calendar-view-for-tasks-due"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/views-pipelines/restrict-access-to-your-view",
|
||||
"destination": "/user-guide/views-pipelines/how-tos/restrict-access-to-your-view"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/views-pipelines/set-up-a-sales-pipeline",
|
||||
"destination": "/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/views-pipelines/show-expected-amount-in-pipeline",
|
||||
"destination": "/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/views-pipelines/track-time-in-stage",
|
||||
"destination": "/user-guide/views-pipelines/how-tos/track-time-in-stage"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/dashboards/dashboards",
|
||||
"destination": "/user-guide/dashboards/capabilities/dashboards"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/dashboards/widgets",
|
||||
"destination": "/user-guide/dashboards/capabilities/widgets"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/dashboards/dashboards-faq",
|
||||
"destination": "/user-guide/dashboards/how-tos/dashboards-faq"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/permissions-access/permissions",
|
||||
"destination": "/user-guide/permissions-access/capabilities/permissions"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/permissions-access/sso-configuration",
|
||||
"destination": "/user-guide/permissions-access/capabilities/sso-configuration"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/permissions-access/permissions-faq",
|
||||
"destination": "/user-guide/permissions-access/how-tos/permissions-faq"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/billing/pricing-plans",
|
||||
"destination": "/user-guide/billing/capabilities/pricing-plans"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/billing/workflow-credits",
|
||||
"destination": "/user-guide/billing/capabilities/workflow-credits"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/billing/billing-faq",
|
||||
"destination": "/user-guide/billing/how-tos/billing-faq"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/settings/workspace-settings",
|
||||
"destination": "/user-guide/settings/capabilities/workspace-settings"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/settings/member-management",
|
||||
"destination": "/user-guide/settings/capabilities/member-management"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/settings/profile-settings",
|
||||
"destination": "/user-guide/settings/capabilities/profile-settings"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/settings/experience-settings",
|
||||
"destination": "/user-guide/settings/capabilities/experience-settings"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/settings/domains-settings",
|
||||
"destination": "/user-guide/settings/capabilities/domains-settings"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/settings/releases-settings",
|
||||
"destination": "/user-guide/settings/capabilities/releases-settings"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/settings/settings-faq",
|
||||
"destination": "/user-guide/settings/how-tos/settings-faq"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/workflows/how-tos/send-emails-from-workflows",
|
||||
"destination": "/user-guide/workflows/capabilities/send-emails-from-workflows"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/calendar-emails/capabilities/emails-and-calendars",
|
||||
"destination": "/user-guide/calendar-emails/capabilities/mailbox"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/workflows/how-tos/crm-automations/update-companies-and-create-tasks-when-deal-closed",
|
||||
"destination": "/user-guide/workflows/how-tos/crm-automations/closed-won-automations"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/workflows/how-tos/how-to-use-branches-in-workflows",
|
||||
"destination": "/user-guide/workflows/capabilities/use-branches-in-workflows"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/workflows/getting-started/getting-started-workflows",
|
||||
"destination": "/user-guide/workflows/overview"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/views-pipelines/how-tos/create-custom-views",
|
||||
"destination": "/user-guide/views-pipelines/overview"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/views-pipelines/getting-started/view-management",
|
||||
"destination": "/user-guide/views-pipelines/overview"
|
||||
},
|
||||
{
|
||||
"source": "/user-guide/billing/capabilities/billing-and-pricing-faq",
|
||||
"destination": "/user-guide/billing/how-tos/billing-faq"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
---
|
||||
title: Create a Workspace
|
||||
description: "Follow a step-by-step guide on how to register on Twenty, choose a subscription plan, confirm your payment and set up your account."
|
||||
---
|
||||
|
||||
## Step 1: Registration
|
||||
|
||||
1. Navigate to [Twenty Sign Up](https://app.twenty.com).
|
||||
2. Select your preferred sign-up method:
|
||||
- **Continue with Google** for Google account registration.
|
||||
- **Continue with Microsoft** for Microsoft account registration.
|
||||
- Or, **Continue With Email** for email registration.
|
||||
|
||||
## Step 2: Choosing a Trial Period
|
||||
|
||||
Choose between two trial periods:
|
||||
|
||||
### 30 days
|
||||
With credit card
|
||||
|
||||
### 7 days
|
||||
Without credit card
|
||||
|
||||
Both trials include:
|
||||
- Full access
|
||||
- Unlimited contacts
|
||||
- Email integration
|
||||
- Custom objects
|
||||
- API & Webhooks
|
||||
|
||||
You can click on "Change plan" to choose a different plan or billing interval.
|
||||
|
||||
## Step 3: Payment Confirmation & Account Setup
|
||||
|
||||
Post payment approval via Stripe, you're directed to create your workspace and user profile. Remember that you can cancel your subscription anytime.
|
||||
|
||||
## Support
|
||||
|
||||
For queries or help, connect with the dedicated support team at [contact@twenty.com](mailto:contact@twenty.com) or send a message on [Discord](https://discord.gg/cx5n4Jzs57).
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
---
|
||||
title: What is Twenty
|
||||
description: "Discover Twenty, an open-source CRM, its features, benefits, system requirements, and how to get involved."
|
||||
---
|
||||
|
||||
Twenty is the leading open-source CRM, crafted by hundreds of contributors to suit your unique business needs.
|
||||
|
||||
## Vision
|
||||
|
||||
Creating a good CRM is hard because it's a balancing act.
|
||||
For each business, the requirements seem straightforward, yet everyone's needs are distinct.
|
||||
The result is a CRM that's either too basic, or one that's attempting to be a jack-of-all-trades but ending up as a master of none.
|
||||
|
||||
At first, Twenty looks like most CRMs you already know: you can track deals, organize contacts, manage tasks and notes.
|
||||
But what sets it apart is our approach to extensibility. We are building an open platform that provides the building blocks for you to solve your unique business problems.
|
||||
|
||||
We prioritize universal principles and common patterns over feature lists.
|
||||
We don't try to have all the answers and instead empower users to find what works best for them.
|
||||
Open-source is the bedrock of our approach, ensuring that Twenty evolves with its community, for its community.
|
||||
|
||||
## Benefits
|
||||
|
||||
**Customizable:** Designed to fit your business needs.
|
||||
|
||||
**Community-driven:** Built and maintained by a large open-source community.
|
||||
|
||||
**Cost-effective:** You'll never be vendor-locked, because you can always self-host.
|
||||
|
||||
## Main Features
|
||||
|
||||
**Contact Management:** Efficiently store and manage customer data.
|
||||
|
||||
**Custom Objects:** Create and customize objects to fit your business needs.
|
||||
|
||||
**Custom Fields:** Tailor data fields to capture and organize information specific to your operations.
|
||||
|
||||
**Deal Management:** Track and manage your sales opportunities through customizable Pipeline stages.
|
||||
|
||||
**Kanban & Table Views:** Make data actionable with flexible table views.
|
||||
|
||||
**Workflows:** Automate your business processes and integrate with external tools using powerful workflow automation.
|
||||
|
||||
**Email Integration:** View the emails of a specific customer or company within your workspace.
|
||||
|
||||
**Notes:** Create detailed notes for each record to share knowledge more effectively.
|
||||
|
||||
**Tasks:** Schedule tasks to track customer interactions.
|
||||
|
||||
**Permissions:** Control access and manage user roles with flexible workspace and object-level permissions.
|
||||
|
||||
**API & Webhooks:** Connect to other apps and automate workflows with API and Webhooks.
|
||||
|
||||
## Join now
|
||||
|
||||
[Register here](https://app.twenty.com) or [become a contributor on GitHub](https://github.com/twentyhq/twenty).
|
||||
|
||||
|
After Width: | Height: | Size: 403 KiB |
|
After Width: | Height: | Size: 398 KiB |
|
After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 211 KiB |
|
After Width: | Height: | Size: 214 KiB |
|
After Width: | Height: | Size: 459 KiB |
|
After Width: | Height: | Size: 321 KiB |
|
After Width: | Height: | Size: 293 KiB |
|
After Width: | Height: | Size: 372 KiB |
|
After Width: | Height: | Size: 470 KiB |
|
After Width: | Height: | Size: 473 KiB |
|
After Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 59 KiB |
|
After Width: | Height: | Size: 693 KiB |
|
After Width: | Height: | Size: 806 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 807 KiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 299 KiB |
|
After Width: | Height: | Size: 299 KiB |
|
After Width: | Height: | Size: 300 KiB |
|
After Width: | Height: | Size: 300 KiB |
|
After Width: | Height: | Size: 296 KiB |
|
After Width: | Height: | Size: 621 KiB |
|
After Width: | Height: | Size: 570 KiB |
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 322 KiB |
|
After Width: | Height: | Size: 287 KiB |
|
After Width: | Height: | Size: 175 KiB |
|
After Width: | Height: | Size: 102 KiB |
|
After Width: | Height: | Size: 469 KiB |
|
After Width: | Height: | Size: 463 KiB |
|
After Width: | Height: | Size: 298 KiB |
|
After Width: | Height: | Size: 218 KiB |
|
After Width: | Height: | Size: 162 KiB |
@@ -12,7 +12,7 @@
|
||||
"user-guide/introduction",
|
||||
"user-guide/getting-started/what-is-twenty",
|
||||
"user-guide/getting-started/create-workspace",
|
||||
"user-guide/getting-started/getting-around-twenty",
|
||||
"user-guide/getting-started/navigate-around-twenty",
|
||||
"user-guide/getting-started/configure-your-workspace",
|
||||
"user-guide/getting-started/implementation-services",
|
||||
"user-guide/getting-started/migrating-from-other-crms",
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
"user-guide/introduction",
|
||||
"user-guide/getting-started/what-is-twenty",
|
||||
"user-guide/getting-started/create-workspace",
|
||||
"user-guide/getting-started/getting-around-twenty",
|
||||
"user-guide/getting-started/navigate-around-twenty",
|
||||
"user-guide/getting-started/configure-your-workspace",
|
||||
"user-guide/getting-started/implementation-services",
|
||||
"user-guide/getting-started/migrating-from-other-crms",
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
---
|
||||
title: AI Agents
|
||||
description: Integrate AI capabilities directly into your automation workflows.
|
||||
---
|
||||
|
||||
<Note>
|
||||
This feature is in development and will be available in beta soon.
|
||||
</Note>
|
||||
|
||||
## Overview
|
||||
|
||||
Integrate AI capabilities directly into your automation workflows for intelligent data processing and decision-making.
|
||||
|
||||
## Capabilities
|
||||
|
||||
| Feature | Description |
|
||||
|---------|-------------|
|
||||
| **AI actions** | Add AI-powered steps to any workflow |
|
||||
| **Data enrichment** | Automatically enhance records with external data |
|
||||
| **Classification** | Categorize records based on content analysis |
|
||||
| **Summarization** | Generate summaries from text fields |
|
||||
| **Custom prompts** | Define exactly how AI processes your data |
|
||||
|
||||
## Use Cases
|
||||
|
||||
- **Lead scoring**: Automatically score and prioritize inbound leads
|
||||
- **Data cleanup**: Standardize company names and contact information
|
||||
- **Email drafts**: Generate follow-up emails based on meeting notes
|
||||
- **Record routing**: Assign records to the right team member based on content
|
||||
|
||||
## Related
|
||||
|
||||
- [Workflows Overview](/user-guide/workflows/overview) — automation basics
|
||||
- [AI Permissions](/user-guide/ai/capabilities/permissions-access-control) — access control for AI agents
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
---
|
||||
title: AI Chatbot
|
||||
description: An intelligent assistant that helps you interact with your CRM data using natural language.
|
||||
---
|
||||
|
||||
<Note>
|
||||
This feature is in development and will be available in beta soon.
|
||||
</Note>
|
||||
|
||||
## Overview
|
||||
|
||||
An intelligent assistant that helps you interact with your CRM data using natural language.
|
||||
|
||||
## Capabilities
|
||||
|
||||
| Feature | Description |
|
||||
|---------|-------------|
|
||||
| **Natural language queries** | Ask questions in plain English instead of building filters |
|
||||
| **Full data access** | Query records, relationships, and metrics across your workspace |
|
||||
| **Page context** | Reference "this company" or "this opportunity" based on your current view |
|
||||
| **Conversational** | Follow-up questions maintain context from previous queries |
|
||||
|
||||
## Example Interactions
|
||||
|
||||
### Finding Records
|
||||
- "Show me all opportunities over $50,000"
|
||||
- "Find contacts I haven't emailed in 2 weeks"
|
||||
- "List companies in the healthcare industry"
|
||||
|
||||
### Getting Insights
|
||||
- "What's my total pipeline value?"
|
||||
- "How many deals closed last month?"
|
||||
- "Which stage has the most stuck opportunities?"
|
||||
|
||||
### Using Page Context
|
||||
- "Summarize my interactions with this person" (on a contact page)
|
||||
- "What opportunities are linked to this company?" (on a company page)
|
||||
- "When was this deal last updated?" (on an opportunity page)
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
---
|
||||
title: Permissions & Access Control
|
||||
description: Control what AI agents can access and modify in your workspace.
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
AI agents respect your existing permission structure. This is particularly important for teams who want to control exactly what automated AI processes can access or modify in their workspace.
|
||||
|
||||
## Assign a Role to an AI Agent
|
||||
|
||||
1. Go to **Settings → 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
|
||||
|
||||
## Why Assign Roles to AI Agents?
|
||||
|
||||
| Benefit | Description |
|
||||
|---------|-------------|
|
||||
| **Security** | Limit what data AI agents can access or modify |
|
||||
| **Compliance** | Ensure AI only processes the data it needs |
|
||||
| **Control** | Prevent unintended actions from AI automations |
|
||||
| **Auditability** | Track which actions were performed by which agent |
|
||||
|
||||
<Note>
|
||||
For AI agents running within workflows, role assignment ensures the agent cannot access or modify data outside its intended scope—even if the workflow has broader permissions.
|
||||
</Note>
|
||||
|
||||
## Related
|
||||
|
||||
- [Permissions](/user-guide/permissions-access/capabilities/permissions) — detailed information on creating and managing roles
|
||||
- [AI Agents](/user-guide/ai/capabilities/ai-agents) — AI capabilities in workflows
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
---
|
||||
title: AI FAQ
|
||||
description: Frequently asked questions about AI features in Twenty.
|
||||
---
|
||||
|
||||
<AccordionGroup>
|
||||
|
||||
<Accordion title="When will AI features be available?">
|
||||
AI features are currently in development and will be released in beta soon. Stay tuned for updates!
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="What AI capabilities are planned?">
|
||||
We're building two main AI capabilities:
|
||||
|
||||
1. **AI Chatbot**: A context-aware assistant that can access your Twenty data and help you with queries
|
||||
2. **AI Agents in Workflows**: Intelligent automation that can process data, make decisions, and execute tasks within your workflows
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Will AI agents have access to all my data?">
|
||||
AI agents will operate under the permission system. You can assign specific roles to AI agents under **Settings → Roles**, giving you full control over what data they can access and what actions they can perform.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="How will AI credits work?">
|
||||
AI actions will consume workflow credits based on the complexity of the task and the AI model used. More details will be available when the features launch.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Can I use my own AI models?">
|
||||
Initially, Twenty will use built-in AI models. Support for custom or external AI models may be added in future releases based on user feedback.
|
||||
</Accordion>
|
||||
|
||||
</AccordionGroup>
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
---
|
||||
title: AI
|
||||
description: AI-powered features coming soon to Twenty.
|
||||
---
|
||||
|
||||
<Frame>
|
||||
<img src="/images/user-guide/workflows/robot.png" alt="AI" />
|
||||
</Frame>
|
||||
|
||||
## What's Coming
|
||||
|
||||
Twenty is building AI capabilities to help your team work smarter. We're focusing on two major areas:
|
||||
|
||||
### 1. AI Chatbot
|
||||
|
||||
A conversational assistant that understands your context and has access to all your Twenty data.
|
||||
|
||||
**Key capabilities:**
|
||||
- **Full data access**: Query any record, relationship, or metric in your workspace
|
||||
- **Page context awareness**: Reference "this company" or "this opportunity" based on where you are in Twenty
|
||||
- **Natural language**: Ask questions and get answers without navigating menus
|
||||
|
||||
**Example prompts:**
|
||||
- "What opportunities are closing this month?"
|
||||
- "Which deals have been in Negotiation for more than 30 days?"
|
||||
- "Summarize my interactions with this person"
|
||||
|
||||
### 2. AI Agents in Workflows
|
||||
|
||||
Extend your workflows with AI-powered actions and autonomous agents.
|
||||
|
||||
**Key capabilities:**
|
||||
- **AI actions**: Use AI to enrich data, classify records, generate summaries, and more
|
||||
- **Autonomous agents**: Let agents execute multi-step tasks within a workflow
|
||||
- **Custom prompts**: Define exactly how AI should process your data
|
||||
|
||||
**Use cases:**
|
||||
- Automatically categorize inbound leads
|
||||
- Enrich company data from public sources
|
||||
- Generate follow-up email drafts based on meeting notes
|
||||
- Score opportunities based on engagement patterns
|
||||
|
||||
## Permissions and Access Control
|
||||
|
||||
AI agents will be managed through the existing permissions system:
|
||||
|
||||
1. Go to **Settings → Roles**
|
||||
2. Configure which data each AI agent can access
|
||||
3. Set read/write permissions per object
|
||||
|
||||
This ensures AI agents respect your data governance policies and only access what they need.
|
||||
|
||||
## Stay Updated
|
||||
|
||||
We'll update this section as AI features become available. In the meantime:
|
||||
|
||||
- Follow our [GitHub](https://github.com/twentyhq/twenty) for development updates
|
||||
- Join our [Discord](https://discord.gg/twenty) to share feedback and feature requests
|
||||
@@ -0,0 +1,67 @@
|
||||
---
|
||||
title: Pricing Plans
|
||||
description: Learn about Twenty's pricing plans and how to switch between them.
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
Twenty offers flexible pricing to fit teams of all sizes, whether you prefer cloud hosting or self-hosting.
|
||||
|
||||
## Cloud Plans
|
||||
|
||||
### Pro (Cloud)
|
||||
For teams ready to scale:
|
||||
- All core CRM features
|
||||
- Email and calendar sync
|
||||
- Workflows and automations
|
||||
- Standard support
|
||||
|
||||
<Note>
|
||||
Premium features (SSO and row-level permissions) are not included in the Pro plan.
|
||||
</Note>
|
||||
|
||||
### Organization (Cloud)
|
||||
For larger teams with advanced needs:
|
||||
- Everything in Pro
|
||||
- **Premium features**: SSO integration and row-level permissions
|
||||
- Priority support
|
||||
|
||||
## Self-Hosted Plans
|
||||
|
||||
### Free (Self-Hosted)
|
||||
Host Twenty on your own infrastructure at no cost:
|
||||
- All Pro features included
|
||||
- Community support via Discord
|
||||
- Full control over your data
|
||||
|
||||
### Organization (Self-Hosted)
|
||||
For teams who need premium features while self-hosting:
|
||||
- All Pro features
|
||||
- **Premium features**: SSO integration and row-level permissions
|
||||
- Twenty team support
|
||||
- No requirement to publish custom code as open-source before distributing
|
||||
|
||||
## Premium Features
|
||||
|
||||
Premium features are only available on the Organization plans (Cloud or Self-Hosted):
|
||||
- **SSO integration**: Single Sign-On with your identity provider
|
||||
- **Row-level permissions**: Fine-grained access control at the record level
|
||||
|
||||
## Switching Plans
|
||||
|
||||
### Upgrade to Organization
|
||||
1. Go to **Settings → Billing**
|
||||
2. Click **Switch to Organization**
|
||||
3. Confirm your upgrade
|
||||
|
||||
### Downgrade to Pro
|
||||
Contact support to downgrade your plan.
|
||||
|
||||
### Switch to Yearly Billing
|
||||
1. Go to **Settings → Billing**
|
||||
2. Click **Switch to Yearly**
|
||||
3. Save with annual billing
|
||||
|
||||
### Switch to Monthly Billing
|
||||
Contact support to switch back to monthly billing.
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
---
|
||||
title: Workflow Credits
|
||||
description: Understanding workflow credits, consumption, and how to purchase more.
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
Credits power your workflow automations in Twenty. Every workflow action consumes credits based on its complexity.
|
||||
|
||||
## Credit Allocation
|
||||
|
||||
Credits are based on your billing cycle, not your plan:
|
||||
|
||||
| Billing Cycle | Credits |
|
||||
|---------------|---------|
|
||||
| Monthly | 5 million/month |
|
||||
| Yearly | 50 million/year |
|
||||
|
||||
<Note>
|
||||
The 5 million monthly credits are designed to empower you to run automations without worrying about costs. For most workflows using standard actions, this is more than enough. You'll only need additional credits when running advanced code nodes or AI-powered features.
|
||||
</Note>
|
||||
|
||||
## Credit Consumption
|
||||
|
||||
Different actions consume different amounts of credits:
|
||||
|
||||
| Action Type | Credit Usage |
|
||||
|-------------|--------------|
|
||||
| **Basic operations** (search, update, create records) | Minimal |
|
||||
| **Complex operations** (code nodes, external API calls) | More credits |
|
||||
| **AI prompts** (coming soon) | Variable based on usage |
|
||||
|
||||
Credits are deducted in real-time when workflows execute.
|
||||
|
||||
## Monitoring Usage
|
||||
|
||||
Track your credit consumption:
|
||||
1. Go to **Settings → Billing**
|
||||
2. View your current usage and remaining credits
|
||||
3. Monitor trends to plan for additional credits if needed
|
||||
|
||||
## Purchasing Additional Credits
|
||||
|
||||
Need more credits?
|
||||
1. Go to **Settings → Billing**
|
||||
2. Click on the option to purchase additional credit packs
|
||||
3. Select the amount you need
|
||||
|
||||
@@ -1,20 +1,21 @@
|
||||
---
|
||||
title: Billing and Pricing FAQ
|
||||
info: "Everything you need to know about the pricing and billing."
|
||||
image: /images/user-guide/setup/pricing.png
|
||||
sectionInfo: Understand how Twenty pricing works.
|
||||
title: Billing FAQ
|
||||
description: Frequently asked questions about Twenty pricing and billing.
|
||||
---
|
||||
<Frame>
|
||||
<img src="/images/user-guide/setup/pricing.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
## Pricing
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="Can I use Twenty for free while self-hosting?">
|
||||
Yes, you can use Twenty for free while self-hosting. You will get access to everything included in the (cloud) Pro subscription, except the support from our core-team. Support is accessible via our Discord community.
|
||||
Yes, you can use Twenty for free while self-hosting. You will get access to everything included in the Pro (Cloud) plan, except the support from our core-team. Support is accessible via our Discord community.
|
||||
|
||||
If you want to self-host and have access to the features included in the (cloud) Organization subscription, including support from our core-team, you can do so by choosing the paid Organization licences, available in self-hosting.
|
||||
If you want to self-host and need the Premium features (SSO and row-level permissions), you can choose the paid Organization (Self-Hosted) license. This also includes support from the Twenty team and removes the requirement to publish custom code as open-source before distributing.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="What are the Premium features?">
|
||||
Premium features are only available on the Organization plans (Cloud or Self-Hosted):
|
||||
- **SSO integration**: Single Sign-On with your identity provider
|
||||
- **Row-level permissions**: Fine-grained access control at the record level
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Do you offer free seats for view-only users?">
|
||||
@@ -42,7 +43,9 @@ You will find this under `Settings → Billing`.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="How many workflow credits do we have?">
|
||||
The number of credits varies based on the plan. A workspace under **trial gets 5 million credits**, one with a **Pro plan gets 10 million credits per month** and one with an **Organization plan gets 20 million credits per month**.
|
||||
The number of credits depends on your billing cycle, not your plan:
|
||||
- **Monthly subscriptions**: 5 million credits per month
|
||||
- **Yearly subscriptions**: 50 million credits per year
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="How does workflow credit consumption work?">
|
||||
@@ -78,4 +81,3 @@ You can do so under `Settings → Billing`. Then click on `View billing details`
|
||||
You can do so under `Settings → Billing`. Then click on `View billing details`. You'll see all your invoices at the bottom of the screen.
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
---
|
||||
title: Billing
|
||||
description: Understand Twenty pricing and manage your subscription.
|
||||
image: /images/user-guide/setup/pricing.png
|
||||
---
|
||||
|
||||
<Frame>
|
||||
<img src="/images/user-guide/setup/pricing.png" alt="Billing" />
|
||||
</Frame>
|
||||
|
||||
Twenty offers flexible pricing plans to fit your team's needs. Manage your subscription, track workflow credits, and access invoices all from **Settings → Billing**.
|
||||
|
||||
## What's in this section
|
||||
|
||||
<CardGroup cols={2}>
|
||||
<Card title="Pricing Plans" icon="tags" href="/user-guide/billing/capabilities/pricing-plans">
|
||||
Learn about Twenty's pricing plans and what's included.
|
||||
</Card>
|
||||
<Card title="FAQ" icon="circle-question" href="/user-guide/billing/how-tos/billing-faq">
|
||||
Frequently asked questions about pricing and billing.
|
||||
</Card>
|
||||
</CardGroup>
|
||||
|
||||
## At a glance
|
||||
|
||||
| Plan | Key Features |
|
||||
|------|--------------|
|
||||
| **Free (Self-Hosted)** | All Pro features, community support |
|
||||
| **Pro (Cloud)** | Everything apart from the Premium features (SSO and row-level permissions), standard support |
|
||||
| **Organization (Cloud)** | All from Pro + the Premium features (SSO and row-level permissions), priority support |
|
||||
| **Organization (Self-Hosted)** |All from Pro + the Premium features (SSO, row-level permissions), Twenty team support, not required to publish your custom code as open-source before distributing |
|
||||
|
||||
## Quick answers
|
||||
|
||||
**Where do I manage billing?**
|
||||
Go to **Settings → Billing** to view your plan, update payment methods, and access invoices.
|
||||
|
||||
**Can I use Twenty for free?**
|
||||
Yes! Self-host Twenty and get all Pro features at no cost.
|
||||
|
||||
**How do I upgrade?**
|
||||
Go to **Settings → Billing** and click **Switch to Organization** or **Switch to Yearly**.
|
||||
|
||||
For more questions, see the [Billing FAQ](/user-guide/billing/how-tos/billing-faq).
|
||||
@@ -0,0 +1,44 @@
|
||||
---
|
||||
title: Calendar
|
||||
description: Understanding calendar integration features in Twenty.
|
||||
---
|
||||
|
||||
**Note**: To connect your calendar and configure sync settings, visit [Email & Calendar Setup](/user-guide/calendar-emails/overview).
|
||||
|
||||
## How Calendar Integration Works
|
||||
|
||||
Twenty automatically syncs your calendar events and links them to the relevant CRM records, giving you a complete view of your meeting history with contacts and companies.
|
||||
|
||||
## Calendar Tab
|
||||
|
||||
Next to the Emails tab on records, you'll find a `Calendar` tab that contains the history of meetings scheduled with the record.
|
||||
|
||||
### Available For
|
||||
|
||||
- **People**: View all meetings scheduled with a specific contact
|
||||
- **Companies**: See all meetings related to a company and its employees
|
||||
- **Opportunities**: Access meeting history related to the company linked to this opportunity
|
||||
|
||||
### Viewing Meeting History
|
||||
|
||||
1. **Navigate to a Record**: Go to any Person, Company, or Opportunity record
|
||||
2. **Select the Calendar Tab**: Click on the `Calendar` tab next to the Emails tab
|
||||
3. **Browse Meeting History**: View all scheduled meetings and their details
|
||||
4. **Access Meeting Context**: See meeting participants, times, and related information
|
||||
|
||||
## Visibility Settings
|
||||
|
||||
Calendar data follows the same visibility settings as emails, ensuring consistent privacy controls across both communication channels.
|
||||
|
||||
## What Gets Synced
|
||||
|
||||
- **External Meetings**: All meetings with contacts outside your organization
|
||||
- **Automatic Linking**: Meetings connect to existing People and Company records based on attendee email addresses
|
||||
- **Meeting Details**: Subject, time, duration, and participants
|
||||
- **Updates**: New calendar events sync automatically
|
||||
|
||||
## What Doesn't Get Synced
|
||||
|
||||
- **Internal Meetings**: Meetings with only colleagues (same domain) remain private
|
||||
- **Private Events**: Events marked as private in your calendar
|
||||
|
||||
@@ -1,20 +1,15 @@
|
||||
---
|
||||
title: Emails and Calendars
|
||||
info: "View and manage email conversations within your CRM records."
|
||||
image: /images/user-guide/emails/emails_header.png
|
||||
sectionInfo: Centralize communications and team collaboration
|
||||
title: Mailbox
|
||||
description: Understanding email integration features in Twenty.
|
||||
---
|
||||
<Frame>
|
||||
<img src="/images/user-guide/emails/emails_header.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
**Note**: To connect your email accounts and configure sync settings, visit [Email & Calendar Setup](/user-guide/settings/email-calendar-setup).
|
||||
**Note**: To connect your email accounts and configure sync settings, visit [Email & Calendar Setup](/user-guide/calendar-emails/overview).
|
||||
|
||||
## How Email Integration Works
|
||||
|
||||
Twenty automatically links emails from your connected mailboxes to the relevant CRM records, keeping all communication history in one place.
|
||||
|
||||
### Where to Find Emails
|
||||
### Objects Where Emails Can Be Found
|
||||
|
||||
Email conversations appear in three main objects:
|
||||
|
||||
@@ -80,24 +75,3 @@ Control which email folders sync with Twenty:
|
||||
- **System Folders**: Some email folders may not be available for sync
|
||||
- **Aliases**: Only true mailboxes can be connected (not email aliases)
|
||||
|
||||
|
||||
## Calendar Integration
|
||||
|
||||
### Calendar Tab
|
||||
Next to the Emails tab, you'll find a `Calendar` tab that contains the history of meetings scheduled with the record.
|
||||
|
||||
**Available for:**
|
||||
- **People**: View all meetings scheduled with a specific contact
|
||||
- **Companies**: See all meetings related to a company and its employees
|
||||
- **Opportunities**: Access meeting history related to the company linked to this opportunity
|
||||
|
||||
**Visibility Settings**: Calendar data follows the same visibility settings as emails, ensuring consistent privacy controls across both communication channels.
|
||||
|
||||
### Viewing Meeting History
|
||||
1. **Navigate to a Record**: Go to any Person, Company, or Opportunity record
|
||||
2. **Select the Calendar Tab**: Click on the `Calendar` tab next to the Emails tab
|
||||
3. **Browse Meeting History**: View all scheduled meetings and their details
|
||||
4. **Access Meeting Context**: See meeting participants, times, and related information
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
---
|
||||
title: Can I Book Meetings from Twenty?
|
||||
description: Information about booking meetings directly from Twenty.
|
||||
---
|
||||
|
||||
## Current Status
|
||||
|
||||
**No, Twenty does not currently support booking meetings directly from the platform.**
|
||||
|
||||
Twenty's calendar integration is designed to **sync and display** your existing calendar events, not to create new ones. All meeting scheduling should be done through your native calendar application (Google Calendar, Microsoft Outlook, etc.).
|
||||
|
||||
## What You Can Do
|
||||
|
||||
- **View meeting history** on People, Companies, and Opportunities records
|
||||
- **See upcoming meetings** with contacts in your CRM
|
||||
- **Track meeting context** alongside email communications
|
||||
- **Auto-create contacts** from meeting participants
|
||||
|
||||
## How to Schedule Meetings
|
||||
|
||||
1. Use your native calendar app (Google Calendar, Outlook, etc.)
|
||||
2. Create the meeting as you normally would
|
||||
3. The meeting will automatically sync to Twenty within 5 minutes
|
||||
4. View the meeting on the relevant CRM records
|
||||
|
||||
## Future Plans
|
||||
|
||||
Meeting creation from within Twenty is on our roadmap. Join our [GitHub discussions](https://github.com/twentyhq/twenty/discussions) to share your use case and help prioritize this feature.
|
||||
@@ -0,0 +1,43 @@
|
||||
---
|
||||
title: Can I Send Emails from Twenty?
|
||||
description: Information about sending emails directly from Twenty.
|
||||
---
|
||||
|
||||
## Current Status
|
||||
|
||||
Twenty's email integration is designed to **sync and display** your email history. Emails cannot be composed or sent directly from Twenty's interface.
|
||||
|
||||
When you view an email thread on a record page and click **Reply**, you'll be redirected to the original thread in your mailbox (Gmail, Outlook, etc.). This is where you compose and send your reply.
|
||||
|
||||
## What You Can Do Today
|
||||
|
||||
- **View email history** on People, Companies, and Opportunities records
|
||||
- **Read full email threads** with contacts in your CRM
|
||||
- **Track communication context** alongside calendar events
|
||||
- **Auto-create contacts** from email interactions
|
||||
- **Reply via redirect** — click Reply to jump to your mailbox
|
||||
|
||||
## Sending Emails via Workflows
|
||||
|
||||
While you can't send emails manually from Twenty, you **can send emails automatically using Workflows**. This is useful for:
|
||||
- Automated follow-ups
|
||||
- Notifications to contacts
|
||||
- Triggered communications based on record changes
|
||||
|
||||
Emails sent via workflows go through your connected mailbox account.
|
||||
|
||||
→ Learn about the [Send Email action](/user-guide/workflows/capabilities/workflow-actions#send-email)
|
||||
|
||||
## Email Sequences and Newsletters
|
||||
|
||||
For email sequences and newsletters, we recommend using workflows to connect Twenty to a dedicated email marketing tool.
|
||||
|
||||
<Warning>
|
||||
Mass emails should not be sent directly from your mailbox to protect your domain reputation. Use a dedicated tool for bulk communications.
|
||||
</Warning>
|
||||
|
||||
→ See [How to send emails from workflows](/user-guide/workflows/capabilities/send-emails-from-workflows) for setup instructions
|
||||
|
||||
## Future Plans
|
||||
|
||||
Native email composition from within Twenty is on our roadmap. Join our [GitHub discussions](https://github.com/twentyhq/twenty/discussions) to share your use case and help prioritize this feature.
|
||||
@@ -0,0 +1,33 @@
|
||||
---
|
||||
title: Can I Track Email Activity on All Objects?
|
||||
description: Understanding email activity tracking across different objects.
|
||||
---
|
||||
|
||||
## Supported Objects
|
||||
|
||||
Email activity is currently available on **three standard objects**:
|
||||
|
||||
| Object | What You See |
|
||||
|--------|--------------|
|
||||
| **People** | All emails exchanged with that specific contact |
|
||||
| **Companies** | All emails with anyone from that company (based on email domain) |
|
||||
| **Opportunities** | Emails related to the company linked to the opportunity |
|
||||
|
||||
## Why Only These Objects?
|
||||
|
||||
People, Companies, and Opportunities are the core relationship objects where email context adds the most value. Email threads are automatically linked based on:
|
||||
- **Email address** → matched to People records
|
||||
- **Email domain** → matched to Company records
|
||||
- **Company relation** → linked to Opportunities
|
||||
|
||||
## Custom Objects
|
||||
|
||||
**Email tracking is not available on custom objects** at this time.
|
||||
|
||||
If you need email context on a custom object, consider:
|
||||
- Using a relation field to link your custom object to People or Companies
|
||||
- Viewing email history on the linked People/Company record
|
||||
|
||||
## Future Plans
|
||||
|
||||
Extending email visibility to custom objects is being considered. Share your use case on our [GitHub discussions](https://github.com/twentyhq/twenty/discussions) to help prioritize this feature.
|
||||
@@ -0,0 +1,39 @@
|
||||
---
|
||||
title: Connect Several Mailboxes per User
|
||||
description: Connect multiple email accounts for a single user.
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
Twenty supports **unlimited email accounts per user**. This is useful if you manage multiple inboxes, such as:
|
||||
- Personal work email + shared team inbox
|
||||
- Multiple client-facing email addresses
|
||||
- Different email accounts for different roles
|
||||
|
||||
## How to Add Multiple Mailboxes
|
||||
|
||||
1. Go to **Settings → Accounts**
|
||||
2. Click **Add account**
|
||||
3. Connect your additional Google or Microsoft account
|
||||
4. Configure sync settings for this mailbox
|
||||
5. Repeat for each mailbox you want to connect
|
||||
|
||||
## Managing Multiple Accounts
|
||||
|
||||
Each connected mailbox has its own settings:
|
||||
- **Email visibility**: Choose what teammates can see
|
||||
- **Contact auto-creation**: Enable/disable per mailbox
|
||||
- **Folder selection**: Choose which folders to sync (Lab feature)
|
||||
|
||||
## How Emails Appear
|
||||
|
||||
Emails from all your connected mailboxes are synced to Twenty and appear on:
|
||||
- **People records**: Based on the contact's email address
|
||||
- **Company records**: Based on the email domain
|
||||
- **Opportunities**: Based on the linked company
|
||||
|
||||
<Note>Each email shows which mailbox it was sent from/received to, so you can track which account was used for each communication.</Note>
|
||||
|
||||
## Important Notes
|
||||
|
||||
<Warning>Only true mailboxes can be connected. Email aliases that forward to another mailbox cannot be connected separately—they'll sync through the main mailbox.</Warning>
|
||||
@@ -0,0 +1,45 @@
|
||||
---
|
||||
title: I Don't See Emails on Records
|
||||
description: Troubleshooting missing emails on records.
|
||||
---
|
||||
|
||||
## Common Reasons
|
||||
|
||||
### 1. Initial Sync Still in Progress
|
||||
Email sync takes time, especially for large mailboxes.
|
||||
- **Calendar sync**: Completes in minutes
|
||||
- **Email sync**: Can take several hours for large mailboxes
|
||||
|
||||
**Solution**: Wait up to a few hours for the initial import to complete.
|
||||
|
||||
### 2. Contact Doesn't Exist in Twenty
|
||||
Emails only appear on existing People records. If the contact wasn't created yet:
|
||||
- Enable **Contact Auto-Creation** in your mailbox settings
|
||||
- Or manually create the Person record first
|
||||
|
||||
**Solution**: Go to **Settings → Accounts**, select your mailbox, and enable contact auto-creation.
|
||||
|
||||
### 3. Internal Emails Are Excluded
|
||||
Emails between colleagues (same email domain) are never synced to maintain privacy.
|
||||
|
||||
**Solution**: This is expected behavior. Only external emails are synced.
|
||||
|
||||
### 4. Email Is from a Group or Distribution List
|
||||
Group emails and distribution lists are excluded from sync.
|
||||
|
||||
**Solution**: This is expected behavior.
|
||||
|
||||
### 5. Folder Not Selected for Sync
|
||||
If you're using the Message Folder feature, some folders might be excluded.
|
||||
|
||||
**Solution**: Go to **Settings → Accounts**, select your mailbox, and check folder sync settings.
|
||||
|
||||
### 6. Wrong Email Address on Record
|
||||
The Person record might have a different email address than the one used in the email.
|
||||
|
||||
**Solution**: Add the correct email address to the Person record.
|
||||
|
||||
## Still Not Working?
|
||||
|
||||
1. Try disconnecting and reconnecting your mailbox
|
||||
2. Contact support if issues persist
|
||||
@@ -0,0 +1,52 @@
|
||||
---
|
||||
title: Limit Emails Imported
|
||||
description: Control which emails are imported into Twenty.
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
By default, Twenty syncs all external emails from your connected mailbox. You can limit what gets imported using **folder selection** and **visibility settings**.
|
||||
|
||||
## Method 1: Folder Selection (Recommended)
|
||||
|
||||
Control which email folders sync with Twenty:
|
||||
|
||||
1. Go to **Settings → Releases → Lab**
|
||||
2. Enable **Message Folder**
|
||||
3. Return to **Settings → Accounts**
|
||||
4. Select your connected email account
|
||||
5. Choose which folders to sync:
|
||||
|
||||
| Folder | Description |
|
||||
|--------|-------------|
|
||||
| **Inbox** | Primary incoming emails |
|
||||
| **Sent** | Outgoing emails you've sent |
|
||||
| **Archive** | Archived messages |
|
||||
| **Custom Folders** | Any specific folders you want |
|
||||
|
||||
6. Exclude folders you don't want synced (Spam, Trash, personal folders)
|
||||
|
||||
<Note>This gives you precise control over which emails appear in your CRM without syncing everything.</Note>
|
||||
|
||||
## Method 2: Contact Auto-Creation Settings
|
||||
|
||||
Control when contacts are created from emails:
|
||||
|
||||
1. Go to **Settings → Accounts**
|
||||
2. Select your connected mailbox
|
||||
3. Choose an option:
|
||||
- **Deactivated**: No contacts created, but emails still sync to existing contacts
|
||||
- **Sent & Received**: Create contacts from all external emails
|
||||
- **Sent Only**: Only create contacts from emails you send
|
||||
|
||||
## What's Always Excluded
|
||||
|
||||
These emails are never synced, regardless of settings:
|
||||
|
||||
- **Internal emails**: Messages between colleagues (same domain)
|
||||
- **Group emails**: Distribution lists and group messages
|
||||
- **Spam/Trash**: System folders are typically excluded
|
||||
|
||||
## Important Note
|
||||
|
||||
<Note>We don't provide a CC email address for selective syncing. Use the folder selection feature above to achieve the same level of control.</Note>
|
||||
@@ -1,11 +1,11 @@
|
||||
---
|
||||
title: Email & Calendar Setup
|
||||
info: "Connect your email and calendar accounts."
|
||||
title: Calendar & Emails
|
||||
description: Connect your email and calendar accounts to Twenty.
|
||||
image: /images/user-guide/emails/emails_header.png
|
||||
sectionInfo: Configure your Twenty workspace settings and preferences
|
||||
---
|
||||
|
||||
<Frame>
|
||||
<img src="/images/user-guide/emails/emails_header.png" alt="Header" />
|
||||
<img src="/images/user-guide/emails/emails_header.png" alt="Calendar & Emails" />
|
||||
</Frame>
|
||||
|
||||
## Connection Options
|
||||
@@ -15,14 +15,18 @@ sectionInfo: Configure your Twenty workspace settings and preferences
|
||||
2. Click **Add account**
|
||||
3. Select **Continue with Google**
|
||||
4. Authorize Twenty to access your Gmail and Google Calendar
|
||||
5. Your emails and calendar events will start syncing automatically
|
||||
5. Configure email sync settings (visibility, auto-creation) → click **Next**
|
||||
6. Configure calendar sync settings (visibility, auto-creation) → click **Add Account**
|
||||
7. Your emails and calendar events will start syncing automatically
|
||||
|
||||
### Microsoft Account (Outlook & Microsoft Calendar)
|
||||
1. Go to **Settings → Accounts**
|
||||
2. Click **Add account**
|
||||
3. Select **Continue with Microsoft**
|
||||
4. Authorize Twenty to access your Outlook and Microsoft Calendar
|
||||
5. Your emails and calendar events will start syncing automatically
|
||||
5. Configure email sync settings (visibility, auto-creation) → click **Next**
|
||||
6. Configure calendar sync settings (visibility, auto-creation) → click **Add Account**
|
||||
7. Your emails and calendar events will start syncing automatically
|
||||
|
||||
### SMTP/CalDAV Setup (Other Providers)
|
||||
For other email and calendar providers:
|
||||
@@ -58,6 +62,8 @@ Choose different levels of visibility for your emails:
|
||||
- **For messages sent only**: Create contacts only for emails you send
|
||||
- **Note**: Internal emails (same domain) are never synced to maintain privacy
|
||||
|
||||
<Note>When enabled, contacts are automatically linked to their Company records based on their email domain. If the company doesn't exist yet, Twenty creates it for you.</Note>
|
||||
|
||||
### Control which emails get sync with Message Folder Selection (Lab Feature)
|
||||
Control which email folders sync with Twenty:
|
||||
1. Go to **Settings → Releases → Lab** and enable **Message Folder**
|
||||
@@ -90,6 +96,7 @@ Choose what will be visible to other users in your workspace:
|
||||
- **Yes**: Automatically create contacts for meeting participants not in your CRM
|
||||
- **No**: Only link meetings to existing contacts
|
||||
|
||||
<Note>When enabled, contacts are automatically linked to their Company records based on their email domain. If the company doesn't exist yet, Twenty creates it for you.</Note>
|
||||
|
||||
### Control which events get sync
|
||||
- **Meeting Import**: Automatically import calendar events
|
||||
@@ -106,5 +113,11 @@ Choose what will be visible to other users in your workspace:
|
||||
|
||||
**Updates every 5 minutes**: Both email and calendar data sync automatically every 5 minutes after the initial import.
|
||||
|
||||
<Note>
|
||||
**Initial sync timing**: Calendar sync completes quickly (usually within minutes), while email sync takes longer for large mailboxes—up to a few hours depending on volume. Don't worry if you see contacts from calendar events appearing before your email contacts; this is normal behavior.
|
||||
</Note>
|
||||
|
||||
## Next Steps
|
||||
|
||||
- [Mailbox capabilities](/user-guide/calendar-emails/capabilities/mailbox)
|
||||
- [Troubleshoot missing emails](/user-guide/calendar-emails/how-tos/i-dont-see-emails-on-records)
|
||||
@@ -1,93 +0,0 @@
|
||||
---
|
||||
title: Notes
|
||||
info: Explore how to efficiently manage notes within record pages in Twenty.
|
||||
image: /images/user-guide/notes/notes_header.png
|
||||
sectionInfo: Discover how to leverage Notes and Tasks to better collaborate with your team.
|
||||
---
|
||||
|
||||
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
|
||||
|
||||
<Frame>
|
||||
<img src="/images/user-guide/notes/notes_header.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
Manage your record-linked notes efficiently using the powerful **Notes** feature. This guide walks through how to create, format, comment, and delete notes seamlessly within record pages.
|
||||
|
||||
## Common Use Cases
|
||||
|
||||
### Meeting Documentation
|
||||
- **Meeting Minutes**: Log key discussion points, decisions, and action items from client calls
|
||||
- **Call Summaries**: Record important details from sales conversations or support calls
|
||||
- **Follow-up Notes**: Document next steps and commitments made during meetings
|
||||
|
||||
### Customer Interactions
|
||||
- **Support History**: Track customer issues, solutions provided, and resolution status
|
||||
- **Sales Context**: Record customer preferences, pain points, and buying signals
|
||||
- **Relationship Building**: Note personal details about contacts to strengthen relationships
|
||||
|
||||
### Project Management
|
||||
- **Status Updates**: Document project progress and milestone achievements
|
||||
- **Issue Tracking**: Log problems encountered and solutions implemented
|
||||
- **Team Handoffs**: Share context when transferring accounts between team members
|
||||
|
||||
### Automated Note Creation
|
||||
Use [Workflows](/user-guide/workflows/getting-started-workflows) to automatically create notes:
|
||||
- **Call Recorder Integration**: Auto-generate meeting summaries from recorded calls
|
||||
- **Deal Handoff Notes**: Auto-create sales cycle summaries when handing off new customers to implementation teams
|
||||
|
||||
## Note Features
|
||||
|
||||
### Relations Field
|
||||
Notes include a **Relations** field that allows you to attach a single note to multiple records across different objects. For example, you can link one meeting note to:
|
||||
- The Person you met with
|
||||
- The Company they represent
|
||||
- The Opportunity being discussed
|
||||
- Any relevant Tasks or other records
|
||||
|
||||
This morph many relationship ensures important information is accessible from all relevant record pages.
|
||||
|
||||
### User Tagging
|
||||
**Note**: User tagging within notes is not currently available. This feature is planned for 2026, which will allow you to mention team members and trigger notifications.
|
||||
|
||||
## Creating Notes
|
||||
|
||||
Creating notes in the system is intuitive and dynamic. You can either:
|
||||
|
||||
- Navigate to the notes view and create a new record.
|
||||
- Go to a `Record page` and select the Notes tab and press the `New note` button.
|
||||
|
||||
<img src="/images/user-guide/notes/add-note.png"style={{width:'100%'}}/>
|
||||
|
||||
|
||||
### Adding Content
|
||||
|
||||
Start typing directly or press `/` to add elements like headings, files, or images instantly.
|
||||
|
||||
### Format Content
|
||||
|
||||
You can format your notes right from the editor. Use Markdown syntax, press the `/` key or click on the `+` icon on the editor to see the different block options, such as headings, tables, and lists. You can also attach images to your note.
|
||||
|
||||
Highlight the text to see more formatting options like bold, italics, and alignment options.
|
||||
|
||||
You can also change the background color and text color of each block to highlight important things in your note. To do so, hover over the block you want to format and click on the `⋮` icon besides the `+` icon. Click on `Colors` to open up all color options for both the text and the background.
|
||||
|
||||
<VimeoEmbed videoId="927896302" title="Format note content" />
|
||||
|
||||
## Viewing Notes
|
||||
|
||||
The system displays all your notes linked to a specific record under the Notes section on the corresponding `Record page`.
|
||||
|
||||
## Saving And Deleting
|
||||
|
||||
All edits and additions to the note are automatically saved.
|
||||
|
||||
To delete a note:
|
||||
|
||||
1. Open the note you wish to remove by clicking on it from within the `Record page`.
|
||||
2. Select the note you want to delete within the notes tab.
|
||||
3. Use the `Option` button in the lower right corner to prompt additional actions including delete.
|
||||
4. Complete your deletion when prompted with the confirmation modal.
|
||||
|
||||
Another way to delete a note is through the notes view like you would a regular record. Please be aware that deleting a note is permanent and can't be undone.
|
||||
|
||||
|
||||
@@ -1,111 +0,0 @@
|
||||
---
|
||||
title: Tasks
|
||||
info: Understand how to effectively manage tasks in Twenty.
|
||||
image: /images/user-guide/tasks/tasks_header.png
|
||||
sectionInfo: Discover how to leverage Notes and Tasks to better collaborate with your team.
|
||||
---
|
||||
|
||||
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
|
||||
|
||||
<Frame>
|
||||
<img src="/images/user-guide/tasks/tasks_header.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
Manage all tasks within your workspace using the **Tasks** feature. This guide will show you how to create and manage tasks, switch between upcoming and completed tasks, edit task details, and much more.
|
||||
|
||||
## Common Use Cases
|
||||
|
||||
### Sales Follow-ups
|
||||
- **Meeting Next Steps**: Create tasks for action items discussed during client calls
|
||||
- **Proposal Follow-ups**: Set reminders to check on pending proposals
|
||||
- **Contract Reviews**: Schedule tasks for contract negotiations and approvals
|
||||
|
||||
### Customer Success
|
||||
- **Onboarding Tasks**: Automatically create onboarding checklists when deals close
|
||||
- **Check-in Reminders**: Schedule regular customer health check calls
|
||||
- **Renewal Preparation**: Set tasks to prepare for contract renewals 90 days in advance
|
||||
|
||||
### Internal Project Management
|
||||
Beyond sales and customer success, Tasks support broader organizational needs:
|
||||
- **Product Development**: Track feature releases, bug fixes, and development milestones
|
||||
- **Marketing Campaigns**: Manage campaign launches, content creation, and promotional activities
|
||||
- **HR Operations**: Handle recruitment processes, employee onboarding, and performance reviews
|
||||
- **Finance Tasks**: Schedule budget reviews, invoice processing, and financial reporting
|
||||
- **Operations**: Coordinate facility management, vendor relationships, and process improvements
|
||||
|
||||
### Automated Task Creation
|
||||
Use [Workflows](/user-guide/workflows/getting-started-workflows) to automatically create tasks:
|
||||
- **Deal Won Triggers**: Auto-create onboarding tasks assigned to CS team when opportunities close
|
||||
- **Email Reminders**: Set up weekly email reminders for tasks due this week (sent every Monday)
|
||||
- **Pipeline Automation**: Create follow-up tasks when deals stall in specific stages
|
||||
- **Meeting Integration**: Auto-generate tasks from meeting recordings or calendar events
|
||||
|
||||
|
||||
## Task Features
|
||||
|
||||
### Relations Field
|
||||
Tasks include a `Relations` field that allows you to attach a single task to multiple records across different objects. For example, you can link one follow-up task to:
|
||||
- The Person you need to contact
|
||||
- The Company they represent
|
||||
- The Opportunity being pursued
|
||||
- Any relevant Notes or other records
|
||||
|
||||
This morph many relationship ensures tasks are accessible from all relevant record pages and provides complete context.
|
||||
|
||||
### User Tagging
|
||||
**Note**: User tagging within tasks is not currently available. This feature is planned for 2026, which will allow you to mention team members and trigger notifications when assigning or updating tasks.
|
||||
|
||||
## Creating Tasks
|
||||
|
||||
Creating tasks in Twenty is seamless. You can either:
|
||||
|
||||
- Go to the `Tasks`tab and press the `+` button at the top right of the page.
|
||||
- Use the search function by pressing `cmd/ctrl + k`, then select 'Create task' from the list of quick actions.
|
||||
- Go to a `Record page` and press `+` at the top right of the page, or go to the Task tab and press the `Add Task` button.
|
||||
|
||||
<VimeoEmbed videoId="928786754" title="Creating tasks" />
|
||||
|
||||
### Adding Task Content
|
||||
|
||||
Once you've created a task you can enrich it with rich content, such as Titles, Bullet points or even images. To do so, press `/` and enter the desired command.
|
||||
|
||||
## Viewing Tasks
|
||||
|
||||
The **Tasks** page displays all your tasks across your workspace. Here you can:
|
||||
|
||||
- Filter tasks assigned to a specific user by clicking the button with your name at the top right of the screen.
|
||||
- Toggle between upcoming (`To do`) and completed (`Done`) tasks to see what needs attention and what you have accomplished.
|
||||
|
||||
You can also see tasks for a given Record on its `Record page`.
|
||||
|
||||
<VimeoEmbed videoId="927908280" title="Viewing tasks" />
|
||||
|
||||
## Editing Tasks
|
||||
|
||||
To edit a task, you should click on its card. This will open a side panel offering the following features:
|
||||
|
||||
- **Assignee and Due date**: Update the assignee or edit the due date.
|
||||
- **Comments**: Work together with your team members by adding comments on tasks to give updates or feedback.
|
||||
- **Automations**: Thanks to the API and Webhooks, you can also automate task creation triggered by specific activities in your workspace.
|
||||
|
||||
## Marking Tasks as Complete
|
||||
|
||||
To mark a task as complete:
|
||||
|
||||
1. Locate the task on your `Tasks` page or within a `Record page`.
|
||||
2. Click on the circle at the left of the task card, it will change to signify completion.
|
||||
3. The task status will automatically update to `Done`.
|
||||
|
||||
This procedure will help keep an updated record of your accomplishments.
|
||||
|
||||
<VimeoEmbed videoId="927910083" title="Marking tasks as complete" />
|
||||
|
||||
## Delete a task
|
||||
|
||||
To permanently remove a task:
|
||||
|
||||
1. Open the task you want to delete by clicking on its card, either from the `Tasks` page or within a `Record page`.
|
||||
2. Click the trash icon located in the top right corner of the task details panel.
|
||||
|
||||
Please note, deleting a task is permanent and can't be undone. Consider marking tasks as `Done` if there is a chance you will need to refer to them again.
|
||||
|
||||
@@ -1,95 +0,0 @@
|
||||
---
|
||||
title: Contact and Account Management
|
||||
info: "Create and manage People and Company records to build your customer database."
|
||||
image: /images/user-guide/home/contact-and-account-management.png
|
||||
sectionInfo: "Essential CRM features for managing leads, sales, and customers"
|
||||
---
|
||||
<Frame>
|
||||
<img src="/images/user-guide/home/contact-and-account-management.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
## Getting data into your CRM
|
||||
|
||||
When you start using Twenty, you'll want to get your contacts and companies into the system. There are several ways to populate your CRM depending on your workflow and data sources.
|
||||
|
||||
### Manual entry
|
||||
|
||||
The most straightforward approach is adding records directly through the Twenty interface. Go to the `People` section and click the `+` button to add a new contact. Fill in their name, email, phone, and link them to their company. For companies, head to the `Companies` section and add the organization details: company name, domain, industry, and size.
|
||||
|
||||
The domain field is particularly important for company identification, and the email field is essential for person identification.
|
||||
|
||||
### CSV imports
|
||||
|
||||
When you have existing data from spreadsheets or other systems, CSV import is your fastest option. You can prepare your data in Excel or Google Sheets, then upload it all at once. This is particularly useful when migrating from another CRM or when someone has been tracking contacts in spreadsheets. Our [Import/Export Data](/user-guide/getting-started/import-export-data) guide walks you through the process.
|
||||
|
||||
### Automated data capture
|
||||
|
||||
For ongoing lead generation, you can set up automated workflows that bring data directly into Twenty:
|
||||
|
||||
**Website forms**: When someone fills out a form on your website, you can configure it to send the information to Twenty automatically. The form submission triggers a webhook that activates a workflow in Twenty, creating the new contact record without any manual work.
|
||||
|
||||
**Integration with other systems**: If you use other business tools, you can connect them to Twenty using API calls and workflows. This lets you automatically sync data between systems: for example, bringing in new customers from your billing system or leads from your marketing platform.
|
||||
|
||||
To learn more about setting up these automated data flows, check out our [Workflows](/user-guide/workflows/getting-started-workflows) section.
|
||||
|
||||
### Email and calendar sync
|
||||
|
||||
When you connect your mailbox and calendar to Twenty, the system can automatically create People and Companies records for people you email or meet with. If you send an email to someone who isn't already in your CRM, Twenty can create a new Person record for them. The same happens when you schedule meetings with new contacts through your calendar.
|
||||
|
||||
This is particularly useful for sales and business development teams who are constantly meeting new people. Instead of manually adding every new contact, Twenty captures them automatically as you communicate. Learn how to set this up in our [Emails and Calendars](/user-guide/collaboration/emails-and-calendars) guide.
|
||||
|
||||
### Reducing manual work
|
||||
|
||||
Even when adding data manually, you can use workflows to streamline the process. For instance, you might set up automation that assigns new contacts to team members based on their location, or that automatically creates follow-up tasks when certain types of contacts are added.
|
||||
|
||||
## Organizing your contacts
|
||||
|
||||
### Keeping data unique and clean
|
||||
|
||||
Twenty automatically enforces uniqueness to keep your data organized. Each person's email address serves as a unique identifier: you can't have two people with the same email. Similarly, company domains are unique, so you won't accidentally create duplicate companies.
|
||||
|
||||
If your business needs other fields to be unique (like phone numbers, or reference codes), you can configure this in your data model. Head to our [Data Model](/user-guide/data-model/customize-your-data-model) section to learn how to set up additional uniqueness constraints for your specific needs.
|
||||
|
||||
### Handling duplicates
|
||||
|
||||
Sometimes you'll end up with duplicate records. Twenty has a merge feature for both People and Companies: you can combine duplicate records to keep your database clean without losing any information.
|
||||
|
||||
To merge records, select 2 records, open the command menu `Cmd+K` on Mac, `Ctrl+K` on Windows and click `Merge Records`.
|
||||
|
||||
### Creating company hierarchies
|
||||
|
||||
If you work with large organizations that have subsidiaries or multiple divisions, you can create relationships between companies. Set up relationship fields between Company records to map out these connections. This helps you understand the full organizational structure you're dealing with.
|
||||
|
||||
### Customizing your views
|
||||
|
||||
Different team members might need to see different information. You can create custom views that show different columns for different purposes: maybe your sales team needs to see deal stages while your support team focuses on contact details. Learn more about this in our [View Management](/user-guide/crm-essentials/view-management) article.
|
||||
|
||||
## Working with records
|
||||
|
||||
### What you'll find in each record
|
||||
|
||||
When you open a Person or Company record, you'll see all their information organized in tabs:
|
||||
|
||||
- **Fields**: The basic information like name, email, phone, and any custom fields you've added
|
||||
- **Relations**: Shows the connections between this record and records from other objects
|
||||
- **Timeline**: A chronological view of all interactions and updates to this record
|
||||
- **Tasks**: Any follow-up tasks related to this contact
|
||||
- **Notes**: Team notes and observations about this person or company
|
||||
- **Files**: Documents and attachments related to this record
|
||||
- **Emails**: Email threads with this contact (when your team has connected their mailboxes)
|
||||
- **Calendar**: Meetings and appointments with this contact
|
||||
|
||||
The Email and Calendar tabs are particularly powerful: they automatically show all email exchanges and meetings that anyone on your team has had with this contact, as long as they've connected their mailbox to Twenty. You can learn more about setting this up in our [Emails and Calendars](/user-guide/collaboration/emails-and-calendars) guide.
|
||||
|
||||
### Adding the fields you need
|
||||
|
||||
The standard fields might not capture everything important for your business. If you need additional information: like customer segments, referral sources, or industry-specific data: you can add custom fields or modify existing ones. Head to our [Data Model](/user-guide/data-model/customize-your-data-model) section to learn how to customize your setup.
|
||||
|
||||
## Managing deleted records
|
||||
|
||||
When you delete a record in Twenty, it's not gone forever. Records are "soft deleted," which means they're hidden but can be restored if needed.
|
||||
|
||||
To access deleted records, open the command menu `Cmd+K` on Mac, `Ctrl+K` on Windows, then click `See deleted records`. From there, you can either restore records or permanently delete them if you're sure you don't need them.
|
||||
|
||||
This safety net means you can clean up your database without worrying about accidentally losing important information.
|
||||
|
||||
@@ -1,73 +0,0 @@
|
||||
---
|
||||
title: Pipeline
|
||||
info: "Track and manage your sales opportunities through customizable pipeline stages."
|
||||
image: /images/user-guide/kanban-views/kanban.png
|
||||
sectionInfo: "Essential CRM features for managing leads, sales, and customers"
|
||||
---
|
||||
|
||||
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
|
||||
|
||||
<Frame>
|
||||
<img src="/images/user-guide/kanban-views/kanban.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
## Understanding Pipelines
|
||||
|
||||
A sales pipeline tracks opportunities from initial contact to closed deal. Each stage represents a step in your sales process, and opportunities move through these stages as they progress toward closing.
|
||||
|
||||
Twenty includes standard sales stages like Prospecting, Qualification, Proposal, Negotiation, Closed. You can customize these stages to match your specific sales process.
|
||||
|
||||
## Working with Kanban Views
|
||||
|
||||
Kanban views visually map out your pipeline, where each column represents a stage and each card represents an opportunity. Each card shows key information like deal value, close date, and assigned owner at a glance. For complete details: including notes, tasks, meetings, and email history, click on any card to open the full opportunity record.
|
||||
|
||||
### Moving opportunities through your pipeline
|
||||
|
||||
You can move each opportunity between stages as it progresses through your sales process by dragging and dropping. Hold your click on a card and move it to the next stage.
|
||||
|
||||
<VimeoEmbed videoId="927888627" title="Video demonstration" />
|
||||
|
||||
### Customizing your pipeline stages
|
||||
|
||||
You can tailor your pipeline to suit your specific sales process. Stages represent values in a Select Field, so you can add, remove, or rename them as needed.
|
||||
|
||||
#### Adding stages
|
||||
|
||||
To add a stage, access the Select Field Settings by navigating to Settings → Data Model, selecting your object, and then the field your Kanban board depends on.
|
||||
|
||||
<VimeoEmbed videoId="927890428" title="Video demonstration" />
|
||||
|
||||
#### Removing stages
|
||||
|
||||
To remove a stage, hover the stage name or the `⋮` icon, click `Edit from settings` in the Select Field settings, and then click `Delete` next to the relevant stage.
|
||||
|
||||
<img src="/images/user-guide/kanban-views/edit-stage.png" style={{width:'100%'}}/>
|
||||
|
||||
### Customizing the cards
|
||||
|
||||
You can configure your Kanban board to display some fields and hide others. To hide a field, click on `Options` on the top right, then on `Fields` to bring up the list of options. Hover the field you want to hide to bring up the `-` button. Click on it to hide the field.
|
||||
|
||||
You can also rearrange the order of fields by holding down the field name and dragging it to where you want it.
|
||||
|
||||
<img src="/images/user-guide/kanban-views/filter.png" style={{width:'100%'}}/>
|
||||
|
||||
### Compact view
|
||||
|
||||
You can also hide all the fields and get an overview of all the opportunities at a glance. To do so, click on `Options` on the top right and turn on the toggle for `Compact view` after selecting layout in kanban view.
|
||||
|
||||
<img src="/images/user-guide/kanban-views/compact-view.png" style={{width:'100%'}}/>
|
||||
|
||||
## Advanced pipeline management
|
||||
|
||||
### Automation with workflows
|
||||
|
||||
Use [Workflows](/user-guide/workflows/getting-started-workflows) to automate your pipeline:
|
||||
- **Automatic stage progression**: Move deals based on activities
|
||||
- **Notifications**: Alert team members of stage changes
|
||||
- **Task creation**: Generate follow-up tasks for each stage
|
||||
|
||||
### Multiple pipelines
|
||||
|
||||
You can create different pipelines for various business lines, market segments, or specialized sales teams by creating new views. Each view can show different opportunities with specific filters and stages tailored to your needs. Learn how to create those views in our [View Management](/user-guide/crm-essentials/view-management) guide.
|
||||
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
---
|
||||
title: Sales Use Cases
|
||||
info: "Discover advanced sales capabilities that can be built using Twenty's workflow system."
|
||||
image: /images/user-guide/workflows/sales-use-cases.png
|
||||
sectionInfo: "Essential CRM features for managing leads, sales, and customers"
|
||||
---
|
||||
<Frame>
|
||||
<img src="/images/user-guide/workflows/sales-use-cases.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
## Advanced Sales Capabilities
|
||||
|
||||
GTM teams often need advanced sales capabilities like lead scoring, data enrichment, round robin, territory assignment, automated reminders, and email sequences. While these aren't built-in features in Twenty, they can all be configured and tailored to your specific needs using our flexible workflow system.
|
||||
|
||||
Visit our [Workflows section](/user-guide/workflows/getting-started-workflows) to learn how to build these automations step by step. For detailed examples, see our [Internal Automations](/user-guide/workflows/internal-automations) and [External Tool Integration](/user-guide/workflows/external-tool-integration) guides.
|
||||
|
||||
@@ -1,131 +0,0 @@
|
||||
---
|
||||
title: View Management
|
||||
info: "Create and customize views to organize your data with filters, sorting, and different layouts."
|
||||
image: /images/user-guide/table-views/table.png
|
||||
sectionInfo: "Essential CRM features for managing leads, sales, and customers"
|
||||
---
|
||||
|
||||
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
|
||||
|
||||
<Frame>
|
||||
<img src="/images/user-guide/table-views/table.png" alt="Header" />
|
||||
</Frame>
|
||||
|
||||
## Layout Options
|
||||
|
||||
You can display your data in three different layouts, each suited for different purposes. Custom layouts to customize what the page looks like for each type of record will be released in December 2025.
|
||||
|
||||
### Default View
|
||||
Each object comes with an unfiltered, unsorted, and undeletable view known as the Default view. It's named after the object's plural name, such as`All Companies`,`All People`, `All Opportunities`.
|
||||
<img src="/images/user-guide/views/default-view.png" style={{width:'100%'}}/>
|
||||
|
||||
### List Layout
|
||||
The standard table format that displays records in rows and columns. This is perfect for seeing detailed information at a glance and comparing records side by side.
|
||||
|
||||
### List Group By Layout
|
||||
Organizes your records by grouping them based on a select field. For example, you can group opportunities by stage, companies by locations, or any other select field. This helps you see patterns and organize related records together.
|
||||
|
||||
### Kanban Layout
|
||||
A visual board where each column represents a stage and each record appears as a card. This layout is ideal for managing pipelines and workflows where records move through different stages. For more details on using Kanban views for pipeline management, see our [Pipeline](/user-guide/crm-essentials/pipeline) article.
|
||||
|
||||
<VimeoEmbed videoId="927888627" title="Video demonstration" />
|
||||
|
||||
## Creating New Views
|
||||
|
||||
There are three ways to create a new view:
|
||||
|
||||
### Using the Command Menu
|
||||
Use `Cmd+K` on Mac (or `Ctrl+K` on Windows) to open the command menu, then click `Create a new view`.
|
||||
|
||||
### Using the View Dropdown Menu
|
||||
Click on the view dropdown menu (top left), then click `Add View` at the bottom. From this menu you can:
|
||||
- Choose an icon and name for your view
|
||||
- Select the layout type (List or Kanban)
|
||||
- Choose the visibility (Workspace or Unlisted)
|
||||
|
||||
<Warning>
|
||||
Important: You need to first select the List layout and then add a Group By. You cannot create a List Group By directly from there.
|
||||
</Warning>
|
||||
- For Kanban views, select which select field to use as column headers
|
||||
|
||||
<VimeoEmbed videoId="927639721" title="Video demonstration" />
|
||||
|
||||
### Creating Views from Existing Filters
|
||||
|
||||
When you modify the sorting and filtering of an existing view, a `Save as new view` button appears. This lets you create a new view based on your current customizations.
|
||||
|
||||
<VimeoEmbed videoId="927643495" title="Video demonstration" />
|
||||
|
||||
## Making Views Actionable
|
||||
|
||||
The guidance below shows you how to customize the columns of your views. We do not recommend keeping all the columns: those views can be simplified and made actionable by adding sorting conditions and displaying only certain columns that are relevant to your specific use case.
|
||||
|
||||
## Customizing Your Views
|
||||
|
||||
All layouts support the same customization options: sorting, filtering, and field selection. You can make quick one-time changes by clicking directly on the column name, or use the `Options Menu` for more comprehensive editing.
|
||||
|
||||
|
||||
### Quick Actions vs Options Menu
|
||||
|
||||
**For one-time changes**: Click directly on column headers to sort, or use the ```Move Left```, ```Move Right``` buttons.
|
||||
|
||||
**For multiple edits**: Use the `Options Menu` (top right corner) when you want to make several changes in a row. This menu gives you access to:
|
||||
- **Layout selection** (List, List Group By, Kanban)
|
||||
- **Grouping options** (for List Group By layout)
|
||||
- **Fields management** (show/hide and reorder columns)
|
||||
|
||||
### Filtering Your Data
|
||||
|
||||
You can apply filters to show only the records that match your criteria. Click `Filter` in the toolbar, select a field, choose your condition, and set the value. You can add multiple filters for advanced filtering based on several conditions.
|
||||
|
||||
|
||||
<VimeoEmbed videoId="926282262" title="Video demonstration" />
|
||||
|
||||
### Sorting Your Records
|
||||
|
||||
Control the order of your records by clicking on any column header to sort by that field. Click again to reverse the sort order. You can apply multiple sorts for complex organization.
|
||||
|
||||
|
||||
<VimeoEmbed videoId="927885588" title="Video demonstration" />
|
||||
|
||||
### Managing Fields and Columns
|
||||
|
||||
You can choose which fields to display and reorder them. For quick changes, click on a column name directly. For multiple edits, use `Options Menu → Fields` where you can:
|
||||
- Show or hide fields using the eye icon
|
||||
- Reorder fields by dragging and dropping
|
||||
- Make multiple changes efficiently in one place
|
||||
|
||||
|
||||
|
||||
## Managing Your Views
|
||||
|
||||
### View Visibility Options
|
||||
|
||||
Views can have two visibility settings:
|
||||
|
||||
- **Workspace views**: Shared with your entire team. These views appear in the main "Workspace" section of the view picker for all users.
|
||||
- **Unlisted views**: Personal views that appear only in your "My unlisted views" section. While these views are hidden from other team members' view lists, they can still be accessed by anyone with the direct link. This is perfect for ad-hoc reports, experiments, or temporary filters that shouldn't clutter the shared view list.
|
||||
|
||||
You can switch a view's visibility at any time by editing the view. When you change a Workspace view to Unlisted, it becomes a personal view and moves to your "My unlisted views" section.
|
||||
|
||||
### View Dropdown Menu Features
|
||||
|
||||
The view dropdown menu (top left) is your central hub for view management. From here you can:
|
||||
- **Edit view names and icons**: Click the three dots next to any view
|
||||
- **Change view visibility**: Switch between Workspace and Unlisted
|
||||
- **Reorder views**: Drag and drop views to organize them by priority
|
||||
- **Save views as favorites**: Favorites appear just under Settings for quick access
|
||||
|
||||
|
||||
### Editing and Deleting Views
|
||||
|
||||
To modify or remove views, open the view dropdown menu and hover over the view you want to change. Click the three dots that appear to access edit and delete options.
|
||||
|
||||
|
||||
|
||||
### Favorites and Organization
|
||||
|
||||
Views saved as favorites appear just under Settings in your navigation, giving you instant access to your most important views. Use the view dropdown menu to organize your views by dragging them into the order that works best for your workflow.
|
||||
|
||||
For more advanced data organization, see our [Data Model section](/user-guide/data-model/customize-your-data-model) to learn about customizing fields and objects.
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
---
|
||||
title: Dashboards
|
||||
description: Create and organize dashboards with tabs to visualize your CRM data.
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
Dashboards in Twenty are organized in a hierarchy: **Dashboards → Tabs → Widgets**. Each dashboard can contain multiple tabs, and each tab contains widgets (charts, numbers, iFrames).
|
||||
|
||||
## Creating a Dashboard
|
||||
|
||||
1. Go to **Dashboards** in the navigation
|
||||
2. Click **+ New Dashboard**
|
||||
3. Give your dashboard a name
|
||||
4. Start adding tabs and widgets
|
||||
|
||||
## Working with Tabs
|
||||
|
||||
Tabs help you organize your dashboard into logical sections.
|
||||
|
||||
### Creating Tabs
|
||||
1. In edit mode, click **+ Add Tab**
|
||||
2. Name your tab (e.g., "Pipeline Overview", "Team Performance")
|
||||
3. Add widgets to the tab
|
||||
|
||||
### Duplicating Tabs
|
||||
1. Click on the tab you want to duplicate
|
||||
2. Click the **Duplicate** button in the side panel
|
||||
|
||||
## Dashboard Layout
|
||||
|
||||
### Arranging Widgets
|
||||
- Drag and drop to position
|
||||
- Resize for emphasis
|
||||
- Group related charts together
|
||||
|
||||
### Duplicating a Dashboard
|
||||
1. Exit edit mode (view mode only)
|
||||
2. Open the command bar with **Cmd + K** (or **Ctrl + K** on Windows)
|
||||
3. Select **Duplicate dashboard**
|
||||
|
||||
### Best Practices
|
||||
- **Logical flow**: Arrange from overview to detail
|
||||
- **Visual hierarchy**: Larger charts for key metrics
|
||||
- **Consistent styling**: Use matching colors and fonts
|
||||
|
||||
## Visibility & Access
|
||||
|
||||
### Dashboard Visibility
|
||||
Dashboards are visible to everyone who has access to your Twenty workspace. There is no private dashboard option at the moment.
|
||||
|
||||
### Favorites
|
||||
You can add dashboards to your favorites for quick access. This is a personal setting—your favorites are not visible to other users.
|
||||
|
||||
To add a dashboard to favorites, open the dashboard and click the star icon.
|
||||
|
||||
### Timezone Behavior
|
||||
|
||||
Dashboards currently display data based on the timezone of the user viewing them. This means the same dashboard may show different metrics for team members in different regions (e.g., APAC vs. US).
|
||||
|
||||
<Note>
|
||||
**Coming soon**: We will add the ability to set a specific timezone for a dashboard, so all users see consistent data regardless of their location.
|
||||
</Note>
|
||||
|
||||
<Note>
|
||||
**Coming soon**: Dashboard-level filters will allow you to apply filters across all widgets at once, making it faster to explore your data.
|
||||
</Note>
|
||||
|
||||
@@ -0,0 +1,112 @@
|
||||
---
|
||||
title: Widgets
|
||||
description: Explore the widget types and visualization options in Twenty.
|
||||
---
|
||||
|
||||
## Available Widgets
|
||||
|
||||
Twenty provides various widget types to visualize your CRM data.
|
||||
|
||||
### Bar Charts
|
||||
Display data as horizontal or vertical bars.
|
||||
|
||||
**Best for:**
|
||||
- Comparing values across categories
|
||||
- Showing rankings
|
||||
- Tracking metrics by time period
|
||||
|
||||
**Example uses:**
|
||||
- Deals by stage
|
||||
- Revenue by sales rep
|
||||
- Contacts added per month
|
||||
|
||||
<Note>
|
||||
**Display limits**: Bar charts can show a maximum of 100 bars (horizontal) or 50 bars (vertical). If you see the warning "Undisplayed data: max X bars per chart", add filters to narrow down your data or change the grouping (e.g., group by week instead of days).
|
||||
</Note>
|
||||
|
||||
### Pie Charts
|
||||
Show proportions of a whole.
|
||||
|
||||
**Best for:**
|
||||
- Showing composition or distribution
|
||||
- Comparing parts to whole
|
||||
- Highlighting major segments
|
||||
|
||||
**Example uses:**
|
||||
- Deal distribution by source
|
||||
- Contact breakdown by industry
|
||||
- Pipeline composition by owner
|
||||
|
||||
### Line Charts
|
||||
Display trends over time.
|
||||
|
||||
**Best for:**
|
||||
- Tracking changes over time
|
||||
- Identifying trends
|
||||
- Comparing multiple metrics
|
||||
|
||||
**Example uses:**
|
||||
- Monthly deal count trend
|
||||
- Revenue growth over quarters
|
||||
- Activity levels over time
|
||||
|
||||
### Number Metrics
|
||||
Display single key values prominently.
|
||||
|
||||
**Best for:**
|
||||
- Highlighting KPIs
|
||||
- Showing totals or averages
|
||||
- Quick status checks
|
||||
|
||||
**Example uses:**
|
||||
- Total pipeline value
|
||||
- Number of open opportunities
|
||||
- Conversion rate
|
||||
|
||||
**Advanced options:**
|
||||
- **Ratio**: For Select fields, calculate ratios between values. Go to **Data on display** → select your field → enable the **Ratio** option.
|
||||
- **Prefix & Suffix**: Add custom text before or after the number (e.g., "$" prefix or "%" suffix) for better readability.
|
||||
|
||||
### iFrames
|
||||
Embed external tools and content directly in your dashboard.
|
||||
|
||||
**Best for:**
|
||||
- Displaying external reports or dashboards
|
||||
- Integrating third-party sales tools
|
||||
- Showing live content from other systems
|
||||
|
||||
**Example uses:**
|
||||
- Metrics from your Support tool
|
||||
- Metrics from your dialer
|
||||
- Live content from your Sales sequence tool
|
||||
|
||||
|
||||
<Note>
|
||||
**Coming soon**: Gauge charts and tables are not yet available but are on our roadmap.
|
||||
</Note>
|
||||
|
||||
## Configuring Widgets
|
||||
|
||||
### Data Source
|
||||
1. Select the object to visualize (Opportunities, People, etc.)
|
||||
2. Choose the metric to display (count, sum, average)
|
||||
3. Apply filters to focus on specific data
|
||||
|
||||
### Grouping
|
||||
Group data by:
|
||||
- Fields (stage, owner, industry)
|
||||
- Time periods (day, week, month, quarter)
|
||||
- Custom segments
|
||||
|
||||
### Styling
|
||||
Customize your charts with:
|
||||
- Colors and themes
|
||||
- Labels and legends
|
||||
- Size and positioning
|
||||
|
||||
### Duplicating Widgets
|
||||
|
||||
1. Click on the widget
|
||||
2. Open **Options**
|
||||
3. Click **Duplicate widget**
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
---
|
||||
title: Dashboards FAQ
|
||||
description: Frequently asked questions about dashboards in Twenty.
|
||||
---
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="Can I create private dashboards?">
|
||||
No, dashboards are currently visible to everyone with access to your Twenty workspace. Private dashboards are not yet available.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Why do my metrics look different from my colleague's?">
|
||||
Dashboards currently display data based on the viewer's timezone. If you're in different regions (e.g., APAC vs. US), you may see slightly different numbers for the same dashboard. We're working on adding a timezone setting per dashboard to ensure consistent data across teams.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Can I export my dashboard?">
|
||||
Exporting dashboards is not available at the moment. This feature is on our roadmap.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Can I share dashboards with external users?">
|
||||
No, sharing dashboards with users outside your Twenty workspace (non-Twenty users) is not currently supported.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="How do I add a dashboard to my favorites?">
|
||||
Open the dashboard you want to favorite, then click the star icon. Favorites are personal—they won't affect other users.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="What's the difference between tabs and widgets?">
|
||||
- **Tabs** organize your dashboard into sections (like pages within the dashboard)
|
||||
- **Widgets** are the individual visualizations (charts, numbers, iFrames) within each tab
|
||||
|
||||
Structure: Dashboard → Tabs → Widgets
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Why do I see 'Undisplayed data' warning on my bar chart?">
|
||||
Bar charts have display limits: 100 bars for horizontal charts, 50 for vertical. If your data exceeds this, add filters to narrow down the results or change the grouping (e.g., group by week instead of day).
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Can I filter an entire dashboard at once?">
|
||||
Dashboard-level filters are not available yet, but this feature is on our roadmap. Currently, you need to apply filters to each widget individually.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Are gauge charts or tables available?">
|
||||
Not yet. Gauge charts and tables are on our roadmap and will be added in a future release.
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="How do I duplicate a dashboard?">
|
||||
1. Make sure you're in view mode (not editing)
|
||||
2. Open the command bar with **Cmd + K** (or **Ctrl + K** on Windows)
|
||||
3. Select **Duplicate dashboard**
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="How often does dashboard data refresh?">
|
||||
Widgets update automatically as your CRM data changes:
|
||||
- Real-time updates for most metrics
|
||||
- Use the refresh button for a manual update if needed
|
||||
- Historical data is preserved for trend analysis
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
---
|
||||
title: Dashboards
|
||||
description: Learn the basics of reporting and dashboards in Twenty.
|
||||
image: /images/user-guide/reporting/pie-chart.png
|
||||
---
|
||||
|
||||
<Frame>
|
||||
<img src="/images/user-guide/reporting/pie-chart.png" alt="Dashboards" />
|
||||
</Frame>
|
||||
|
||||
## Understanding Dashboards
|
||||
|
||||
Dashboards in Twenty provide a visual way to track your key performance metrics and gain insights from your CRM data.
|
||||
|
||||
<img src="/images/user-guide/dashboard/dashboards_v2.png" alt="Dashboards" />
|
||||
|
||||
## Key Concepts
|
||||
|
||||
### Dashboards
|
||||
A dashboard is a collection of tabs that display your CRM data at a glance. You can create multiple dashboards for different purposes:
|
||||
- Sales performance
|
||||
- Team activity
|
||||
- Pipeline health
|
||||
- Custom metrics
|
||||
|
||||
### Tabs
|
||||
Tabs allow you to organize your dashboard into sections. Each tab contains one or more widgets.
|
||||
|
||||
### Widgets
|
||||
Widgets are individual visualizations that display specific data. Types include:
|
||||
- Bar charts
|
||||
- Pie charts
|
||||
- Line charts
|
||||
- Number metrics
|
||||
- iFrames
|
||||
|
||||
<Note>
|
||||
**Current limitations**:
|
||||
- Exporting dashboards and sharing with external users (non-Twenty users) are not available at the moment.
|
||||
- Gauge charts and tables are not yet available.
|
||||
</Note>
|
||||
|
||||
## Getting Started
|
||||
|
||||
### Creating Your First Dashboard
|
||||
1. Navigate to the **Dashboards** section
|
||||
2. Click **+ New Dashboard**
|
||||
3. Give your dashboard a name
|
||||
4. Add tabs to organize your content
|
||||
5. Add widgets to display your data
|
||||
6. Save
|
||||
|
||||
### Adding Widgets
|
||||
1. Open a tab on your dashboard
|
||||
2. Click **+ Add Widget**
|
||||
3. Select the widget type
|
||||
4. Choose the data source (object)
|
||||
5. Configure the widget settings
|
||||
6. Save and view your widget
|
||||
|
||||
## Best Practices
|
||||
|
||||
- **Start simple**: Begin with a few key metrics and add more over time
|
||||
- **Focus on actionable data**: Display metrics that drive decisions
|
||||
- **Regular review**: Check your dashboards regularly to spot trends
|
||||
- **Share with team**: Make dashboards visible to relevant team members
|
||||
|
||||
## Next Steps
|
||||
|
||||
- [Widgets and visualizations](/user-guide/dashboards/capabilities/widgets)
|
||||
- [Dashboards FAQ](/user-guide/dashboards/how-tos/dashboards-faq)
|
||||