snapshot of https://github.com/twentyhq/twenty.git (main, 2026-09-17; blobs > 131072B omitted)
Some checks failed
App Prod-Parity E2E Dispatch / dispatch (push) Failing after 10s
CD Storybook UI / build (push) Failing after 3m25s
CD Storybook UI / dispatch (push) Has been skipped
CD deploy main / website-changed-files (push) Successful in 18m8s
CI Agent Skills / changed-files-check (push) Successful in 18m9s
CI Create App E2E minimal / changed-files-check (push) Successful in 24s
CI Create App / changed-files-check (push) Successful in 26s
CI Docs / changed-files-check (push) Successful in 26s
CI Emails / changed-files-check (push) Successful in 28s
CI Example App Hello World / changed-files-check (push) Successful in 23s
CI Front / changed-files-check (push) Has been skipped
CI Example App Postcard / changed-files-check (push) Successful in 27s
CI UI / changed-files-check (push) Has been skipped
CI Utils Test / changed-files-check (push) Successful in 45s
CI Twenty Apps / discover (push) Successful in 1m3s
CD deploy main / deploy-main (push) Failing after 3s
CI Agent Skills / agent-skills-validate (push) Has been skipped
CI Create App / create-app-test (lint) (push) Has been skipped
CI Emails / emails-test (push) Has been skipped
CI Front / front-task (lingui:compile) (push) Has been skipped
CI Front / front-task (lint) (push) Has been skipped
CI Example App Postcard / example-app-postcard (push) Has been skipped
CI UI / ui-task (lint) (push) Has been skipped
CI UI / ui-task (pack-size) (push) Has been skipped
CI UI / ui-task (size) (push) Has been skipped
CI UI / ui-task (test) (push) Has been skipped
CI UI / ui-task (typecheck) (push) Has been skipped
CI Utils Test / utils-test (push) Has been skipped
CI Twenty Apps / ${{ matrix.app.name }} (push) Has been skipped
CI Emails / ci-emails-status-check (push) Successful in 2s
CI Example App Hello World / ci-example-app-hello-world-status-check (push) Successful in 2s
CI Example App Postcard / ci-example-app-postcard-status-check (push) Successful in 3s
CI UI / ui-sb-test (push) Has been skipped
CI Utils Test / ci-utils-test-status-check (push) Successful in 2s
CI Twenty Apps / ci-twenty-apps-status-check (push) Successful in 2s
CI UI / ci-ui-status-check (push) Successful in 2s
CI Desktop / desktop (push) Failing after 1m8s
Push docs to Crowdin / Push documentation to Crowdin (push) Failing after 55s
Push translations to Crowdin / Extract and upload translations (push) Failing after 5s
Push website translations to Crowdin / Extract and upload website translations (push) Failing after 5s
CI Create App / create-app-test (test) (push) Has been skipped
CI Create App / create-app-test (typecheck) (push) Has been skipped
CI Docs / docs-lint (push) Has been skipped
CI Example App Hello World / example-app-hello-world (push) Has been skipped
CI Front / front-task (lingui:extract) (push) Has been skipped
CI Front / front-task (test) (push) Has been skipped
CI Front / front-task (typecheck) (push) Has been skipped
CI UI / ui-sb-build (push) Failing after 1m32s
CI Twenty Apps / ${{ matrix.app.name }} (${{ matrix.server-source }}) (push) Has been skipped
CI Agent Skills / agent-skills-publish (push) Has been skipped
CI Create App / ci-create-app-status-check (push) Successful in 2s
CI Agent Skills / agent-skills-remote-source (push) Has been skipped
CI Create App E2E minimal / create-app-e2e-minimal (push) Has been cancelled
CI E2E Main / e2e-test (push) Has been cancelled
CI Front / front-sb-build (push) Has been cancelled
CI Front / front-build (push) Has been cancelled
CI Create App E2E minimal / ci-create-app-e2e-minimal-status-check (push) Has been cancelled
CI E2E Main / ci-e2e-main-status-check (push) Has been cancelled
CI E2E Main / notify-main-ci-failure (push) Has been cancelled
CI E2E Main / qa-scout-comment (push) Has been cancelled
CI Front / front-sb-test (push) Has been cancelled
CI Front / front-sb-screenshots (push) Has been cancelled
CI Front / ci-front-status-check (push) Has been cancelled
DPA Sub-Processor Sync / sync-subprocessors (push) Failing after 3s
AI Catalog Sync / sync-catalog (push) Failing after 3s

This commit is contained in:
upstream-mirror
2026-09-17 23:28:13 +05:00
commit e7da97194a
32688 changed files with 4208681 additions and 0 deletions

View File

@@ -0,0 +1,59 @@
---
title: Create a Calendar View for Tasks Due
description: Visualize your tasks and deadlines on a calendar.
---
<img src="/images/user-guide/views/calendar-view-zoom.png" style={{width:'100%'}}/>
## Prerequisites
Your Tasks object needs a **Due Date** field (Date or Date & Time type).
## Steps
1. Navigate to **Tasks**
2. Click the view dropdown → **+ Add view**
3. Name your view (e.g., "Tasks Calendar")
4. Click **Create**
5. Click **Options** and select **Calendar** as the layout
6. Choose **Due Date** as the date field
7. Click **Save**
## Configure Your Calendar
### Display Fields on Events
1. Click **Options → Fields**
2. Click the **eye icon** to show/hide fields
3. Drag to reorder
Recommended fields to display:
- **Title** — task name
- **Assignee** — who's responsible
- **Status** — current progress
### Filter Your Calendar
Create focused views:
- **My Tasks**: Filter by Assignee = Me
- **This Week**: Filter by Due Date = This week
- **Overdue**: Filter by Due Date < Today, Status ≠ Done
## Other Calendar Use Cases
| Object | Date Field | Purpose |
|--------|------------|---------|
| Opportunities | Close Date | Track expected closes |
| Custom Events | Event Date | Plan activities |
| Projects | Deadline | Monitor project timelines |
## Tips
- **Review weekly**: Start each week by checking your calendar view
- **Combine with table view**: Use calendar for overview, table for details
- **Set visibility**: Keep personal task calendars as Unlisted
## Related
- [Calendar View](/user-guide/views-pipelines/capabilities/calendar-view) — all calendar features
- [Filters and Sorting](/user-guide/views-pipelines/capabilities/filters-and-sorting) — filter your calendar

View File

@@ -0,0 +1,71 @@
---
title: Create a Kanban View for Projects
description: Track projects through stages using a visual board.
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
Use a Kanban view to visualize your projects (or any object with stages) as cards moving through columns.
<VimeoEmbed videoId="927888627" title="Video demonstration" />
## Prerequisites
Your object needs a **Select field** to use as columns (e.g., Status, Stage, Phase).
If you don't have one:
1. Go to **Settings → Data Model**
2. Select your object
3. Add a Select field with your stage options
## Steps
1. Navigate to your object (e.g., Projects, Tasks)
2. Click the view dropdown → **+ Add view**
3. Name your view (e.g., "Project Board")
4. Click **Create**
5. Click **Options** and select **Kanban** as the layout
6. The view uses your Select field for columns automatically
7. Click **Save**
## Configure Your Board
### Show Key Fields on Cards
1. Click **Options → Fields**
2. Find fields in the "Hidden Fields" section
3. Click the **eye icon** to display them on cards
4. Drag to reorder
<img src="/images/user-guide/kanban-views/filter.png" style={{width:'100%'}}/>
### Enable compact view
For a high-level overview:
1. Click **Options**
2. Turn on **Compact view**
Cards show only the record name.
<img src="/images/user-guide/kanban-views/compact-view.png" style={{width:'100%'}}/>
### Add Aggregations
Show counts or totals at the top of each column:
1. Click the number next to a column name
2. Select an aggregation (Count, Sum, etc.)
3. Choose a field if needed
## Moving Cards
Drag and drop cards between columns to update their status.
<VimeoEmbed videoId="927888627" title="Video demonstration" />
## Example: Task Board
| Column (Status) | Cards |
|-----------------|-------|
| **To Do** | New tasks |
| **In Progress** | Active work |
| **Review** | Awaiting approval |
| **Done** | Completed |
## Related
- [Kanban Views](/user-guide/views-pipelines/capabilities/kanban-views) — aggregations, compact view, stages
- [How to Set Up a Sales Pipeline](/user-guide/views-pipelines/how-tos/set-up-a-sales-pipeline) — Kanban for Opportunities

View File

@@ -0,0 +1,51 @@
---
title: Create a Table View with Grouping
description: Organize your records into collapsible groups by field value.
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
Group your table view by a Select field to organize records into collapsible sections.
<img src="/images/user-guide/table-views/table-group-by.png" style={{width:'100%'}}/>
## Steps
1. Navigate to the object (People, Companies, etc.)
2. Click the view dropdown → **+ Add view**
3. Name your view (e.g., "Companies by Type")
4. Click **Create**
5. Click **Options → Group**
6. Choose a Select field to group by
7. Click **Save**
## Configure Group Order
Under **Options → Group → Sort**, choose how groups are ordered:
| Option | Description |
|--------|-------------|
| **Alphabetical** | A to Z |
| **Reverse alphabetical** | Z to A |
| **Manual order** | Drag groups to reorder under "Visible groups" |
Click the **eye icon** next to a group to hide it from the view.
<Note>
**For best performance, limit to 10-15 visible groups.** If you need more, consider using a Dashboard instead.
</Note>
## Example: Companies by Industry
1. Go to **Companies**
2. Create a new view named "By Industry"
3. Click **Options → Group**
4. Select the **Industry** field
5. Save
Now your companies are organized by industry, making it easy to focus on one segment at a time.
## Related
- [Table Views](/user-guide/views-pipelines/capabilities/table-views) — all table view features
- [Filters and Sorting](/user-guide/views-pipelines/capabilities/filters-and-sorting) — combine grouping with filters

View File

@@ -0,0 +1,32 @@
---
title: Restrict Access to Your View
description: Control who can see your custom views.
---
Each view (except the default "All [Object Name]" views) has its own visibility setting.
## Steps
1. Open the view you want to restrict
2. Click **Options** in the top right
3. Click **Visibility**
4. Select **Unlisted**
Your view is now visible only to you.
## Visibility Options
| Setting | Who Can See |
|---------|-------------|
| **Workspace** | All workspace members |
| **Unlisted** | Only you |
## Notes
- The default "All [Object Name]" views cannot be made unlisted
- Unlisted views don't appear in other users' view dropdowns
- You can change visibility back to Workspace at any time
## Related
- [View Settings](/user-guide/views-pipelines/capabilities/view-settings) — all view configuration options

View File

@@ -0,0 +1,108 @@
---
title: Set Up a Sales Pipeline
description: Configure your sales pipeline to track opportunities through stages.
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
A sales pipeline in Twenty is a Kanban view of your Opportunities object, where each column represents a stage in your sales process.
## Step 1: Configure Your Stages
Stages are defined in the Opportunities object's **Stage** field.
1. Go to **Settings → Data Model**
2. Select **Opportunities**
3. Find and click the **Stage** field
4. Add, remove, or rename stages to match your process
<VimeoEmbed videoId="927890428" title="Video demonstration" />
### Recommended Stages
| Stage | Purpose |
|-------|---------|
| **New** | Fresh opportunities just identified |
| **Qualified** | Confirmed as a good fit |
| **Meeting** | Engaged in discussions |
| **Proposal** | Proposal sent |
| **Negotiation** | Working on terms |
| **Closed Won** | Deal successful |
| **Closed Lost** | Deal unsuccessful |
<Note>
**5-7 stages is optimal.** Too many stages make the pipeline hard to scan; too few lose visibility into deal progress.
</Note>
## Step 2: Create a Pipeline View
1. Go to **Opportunities**
2. Click the view dropdown → **+ Add view**
3. Name it "Sales Pipeline"
4. Click **Create**
5. Open **Options** and select **Kanban** as the layout
The view automatically uses the Stage field for columns.
## Step 3: Configure Your View
### Show Key Fields
1. Click **Options → Fields**
2. Look for fields in the "Hidden Fields" section
3. Click the **eye icon** to display: Company, Amount, Close Date, Owner
### Enable Aggregations
Show totals at the top of each column:
1. Click the number displayed next to a Stage name at the top of a column
2. Select the aggregation type (Count, Sum, Average, etc.)
3. Choose the field to aggregate (e.g., Amount)
**Example:** Show total deal value per stage by aggregating the Amount field with Sum.
### Use compact view (optional)
For a high-level overview with minimal card content:
1. Click **Options**
2. Turn on the toggle for **Compact view**
## Step 4: Create Personal and Team Views
### "My Pipeline"
- **Filter**: Owner = Me
- **Visibility**: Unlisted (personal view)
### "Team Pipeline"
- **Filter**: None (show all)
- **Visibility**: Workspace (shared view)
### "Closing This Month"
- **Type**: Table
- **Filter**: Close Date = This month, Stage ≠ Closed Won, Stage ≠ Closed Lost
- **Sort**: Close Date ascending
## Working with Opportunities
### Creating Opportunities
- Click **+ New** in the Opportunities view
- Or click **+** in a specific stage column
### Moving Through Stages
Drag and drop opportunity cards between columns to update their stage.
<VimeoEmbed videoId="927888627" title="Video demonstration" />
## Best Practices
### Pipeline Hygiene
- Update deals daily as they progress
- Move or close stale deals promptly
- Keep close dates realistic
### Stage Discipline
- Define clear criteria for each stage
- Move deals promptly when criteria are met
- Don't let deals sit in stages too long
## Related
- [Kanban Views](/user-guide/views-pipelines/capabilities/kanban-views) — aggregations and compact view
- [Filters and Sorting](/user-guide/views-pipelines/capabilities/filters-and-sorting) — creating filtered views

View File

@@ -0,0 +1,147 @@
---
title: Show Expected Amount in Your Pipeline
description: Calculate and display weighted deal values based on stage probability.
---
The Expected Amount is a calculated value: **Amount × Probability**. This helps you forecast revenue by weighting deals based on how likely they are to close.
<Tip>
This is an example of creating [Formula Fields](/user-guide/workflows/how-tos/crm-automations/formula-fields) using workflows.
</Tip>
This guide walks you through setting up the custom fields and workflows needed to calculate and display expected amounts in your pipeline.
## Step 1: Create Custom Fields
You need two custom fields on the Opportunities object.
### Create the Probability Field
1. Go to **Settings → Data Model → Opportunities**
2. Click **+ Add Field**
3. Configure:
- **Name**: Probability
- **Type**: Number
- **Description**: Stage-based probability (0-100%)
4. Click **Save**
### Create the Expected Amount Field
1. Click **+ Add Field**
2. Configure:
- **Name**: Expected Amount
- **Type**: Currency
- **Description**: Calculated: Amount × Probability
3. Click **Save**
### Optional: Make Fields Read-Only for Users
If you don't want users manually editing these calculated fields:
1. Go to **Settings → Members → Roles**
2. Select the role to configure
3. Find the Opportunities object
4. Set **Probability** and **Expected Amount** fields to read-only
This ensures only the workflows can update these values.
## Step 2: Create Workflow #1 — Update Probability on Stage Change
This workflow automatically sets the Probability when an opportunity moves to a new stage.
### Create the Workflow
1. Go to **Workflows**
2. Click **+ New Workflow**
3. Name it "Update Probability on Stage Change"
### Configure the Trigger
1. Add a **Record Created or Updated** trigger
2. Select **Opportunities** as the object
3. Filter on: **Stage** field is updated
### Add Branches for Each Stage
Create a branch for each stage with its probability:
| Stage | Probability |
|-------|-------------|
| New | 10% |
| Qualified | 25% |
| Meeting | 40% |
| Proposal | 60% |
| Negotiation | 80% |
| Closed Won | 100% |
| Closed Lost | 0% |
<Note>
To create a new branch, right click on the workflow canvas and click **New action**. Then, link this action to the previous node by dragging the arrow from the previous node to this new action.
</Note>
For each stage:
1. Add a **Filter** node: Stage = [stage name]
2. Add an **Update Record** action:
- Record: The triggering Opportunity
- Field: Probability
- Value: [probability for that stage]
### Calculate Expected Amount
After the branches rejoin:
1. Add a **Filter** node: Amount is not empty
2. Add an **Update Record** action:
- Record: The triggering Opportunity
- Field: Expected Amount
- Value: Amount × Probability
## Step 3: Create Workflow #2 — Recalculate on Amount Change
This workflow updates the Expected Amount when the deal Amount changes.
### Create the Workflow
1. Go to **Workflows**
2. Click **+ New Workflow**
3. Name it "Recalculate Expected Amount on Amount Change"
### Configure the Trigger
1. Add a **Record Created or Updated** trigger
2. Select **Opportunities** as the object
3. Filter on: **Amount** field is updated
### Add the Logic
1. Add a **Filter** node: Amount is not empty
2. Add an **Update Record** action:
- Record: The triggering Opportunity
- Field: Expected Amount
- Value: Amount × Probability
## Step 4: Display in Your Pipeline
Now show the Expected Amount totals in your Kanban view:
1. Open your **Sales Pipeline** Kanban view
2. Click the **number** next to any Stage name at the top of a column
3. Select **Sum**
4. Choose **Expected Amount**
Each column now shows the total weighted pipeline value for that stage.
## Summary
| Component | Purpose |
|-----------|---------|
| **Probability field** | Stores the stage-based win probability |
| **Expected Amount field** | Stores Amount × Probability |
| **Workflow #1** | Updates Probability when Stage changes, then recalculates Expected Amount |
| **Workflow #2** | Recalculates Expected Amount when Amount changes |
| **Aggregation** | Displays Sum of Expected Amount per stage |
## Related
- [Formula Fields](/user-guide/workflows/how-tos/crm-automations/formula-fields) — create calculated fields using workflows
- [Kanban Views](/user-guide/views-pipelines/capabilities/kanban-views) — column aggregations
- [How to Create Custom Fields](/user-guide/data-model/how-tos/create-custom-fields) — field configuration

View File

@@ -0,0 +1,226 @@
---
title: Track How Long Opportunities Stay in Each Stage
description: Monitor deal velocity by tracking when opportunities enter each stage.
---
<Tip>
This is an example of creating [Formula Fields](/user-guide/workflows/how-tos/crm-automations/formula-fields) using workflows — specifically date calculations.
</Tip>
Tracking when opportunities enter each stage helps you identify bottlenecks and measure deal velocity.
This guide walks you through setting up custom fields and a workflow to automatically record when an opportunity moves to each stage, and calculate how many days it spent in the previous stage.
## Step 1: Create Custom Fields
You need two types of fields for each stage:
- **Date & Time fields**: Record when the opportunity entered each stage
- **Number fields**: Store how many days the opportunity spent in each stage
### Create the "Last Entered" Fields
1. Go to **Settings → Data Model → Opportunities**
2. For each stage, click **+ Add Field** and configure:
- **Name**: Last Entered [Stage Name] (e.g., "Last Entered New", "Last Entered Qualified")
- **Type**: Date & Time
- **Description**: Timestamp when opportunity entered this stage
3. Click **Save**
Create these fields:
- Last Entered New
- Last Entered Qualified
- Last Entered Meeting
- Last Entered Proposal
- Last Entered Negotiation
- Last Entered Closed Won
- Last Entered Closed Lost
### Create the "Days in Stage" Fields
1. For each stage, click **+ Add Field** and configure:
- **Name**: Days in [Stage Name] (e.g., "Days in New", "Days in Qualified")
- **Type**: Number
- **Description**: Number of days spent in this stage
2. Click **Save**
Create these fields:
- Days in New
- Days in Qualified
- Days in Meeting
- Days in Proposal
- Days in Negotiation
<Note>
You don't need "Days in" fields for Closed Won and Closed Lost since those are final stages.
</Note>
### Optional: Make Fields Read-Only
If you don't want users manually editing these calculated fields:
1. Go to **Settings → Members → Roles**
2. Select the role to configure
3. Find the Opportunities object
4. Set the "Last Entered" and "Days in" fields to read-only
## Step 2: Create the Workflow
This single workflow handles both tasks:
- Records the timestamp when entering a new stage
- Calculates days spent in the previous stage
### Create the Workflow
1. Go to **Workflows**
2. Click **+ New Workflow**
3. Name it "Track Stage Time"
### Configure the Trigger
1. Add a **Record Updated** trigger
2. Select **Opportunities** as the object
3. Filter on: **Stage** field is updated
### Add Branches for Each Stage
<Note>
To create a new branch, right click on the workflow canvas and click **New action**. Then, link this action to the previous node by dragging the arrow from the previous node to this new action.
</Note>
---
**Branch 1: Stage = New (first stage)**
Since this is the first stage, only the entry timestamp is recorded — there's no previous stage to calculate from.
1. Add a **Filter** node: Stage = New
2. Add a **Code** action:
```javascript
export const main = async (): Promise<object> => {
return { now: new Date().toISOString() };
};
```
3. Add an **Update Record** action:
- Record: The triggering Opportunity
- Field: Last Entered New
- Value: `now` from Code node
---
**Branch 2: Stage = Qualified**
When moving to Qualified, record entry time AND calculate days spent in New.
1. Add a **Filter** node: Stage = Qualified
2. Add a **Code** action:
```javascript
export const main = async (params: {
lastEnteredPreviousStage: Date;
}): Promise<object> => {
const { lastEnteredPreviousStage } = params;
const now = new Date();
const entryDate = new Date(lastEnteredPreviousStage);
const diffTime = Math.abs(now.getTime() - entryDate.getTime());
const daysInPreviousStage = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
return {
now: now.toISOString(),
daysInPreviousStage: daysInPreviousStage
};
};
```
3. Configure the Code node input: map `lastEnteredPreviousStage` to the **Last Entered New** field
4. Add an **Update Record** action:
- Record: The triggering Opportunity
- Fields to update:
- Last Entered Qualified = `now`
- Days in New = `daysInPreviousStage`
---
**Branch 3: Stage = Meeting**
When moving to Meeting, record entry time AND calculate days spent in Qualified.
1. Add a **Filter** node: Stage = Meeting
2. Add a **Code** action:
```javascript
export const main = async (params: {
lastEnteredPreviousStage: Date;
}): Promise<object> => {
const { lastEnteredPreviousStage } = params;
const now = new Date();
const entryDate = new Date(lastEnteredPreviousStage);
const diffTime = Math.abs(now.getTime() - entryDate.getTime());
const daysInPreviousStage = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
return {
now: now.toISOString(),
daysInPreviousStage: daysInPreviousStage
};
};
```
3. Configure the Code node input: map `lastEnteredPreviousStage` to the **Last Entered Qualified** field
4. Add an **Update Record** action:
- Record: The triggering Opportunity
- Fields to update:
- Last Entered Meeting = `now`
- Days in Qualified = `daysInPreviousStage`
---
**Continue for remaining stages:**
| Stage | Records | Calculates |
|-------|---------|------------|
| Proposal | Last Entered Proposal | Days in Meeting |
| Negotiation | Last Entered Negotiation | Days in Proposal |
| Closed Won | Last Entered Closed Won | Days in Negotiation |
| Closed Lost | Last Entered Closed Lost | Days in Negotiation |
The branches do not need to rejoin—each runs independently when its stage condition is met.
## Step 3: Analyze Time in Stage
With timestamps and day counts recorded, you can now analyze deal velocity.
### Create a "Slow Deals" View
1. Create a Table view of Opportunities
2. Add columns: Name, Stage, Days in [previous stage], Amount
3. Sort by "Days in" field (descending)
4. Filter by Stage to focus on one stage at a time
Deals at the top spent the most time in the previous stage.
### Use Aggregations
In your pipeline Kanban view:
1. Click the number next to a Stage name
2. Select **Average**
3. Choose a "Days in" field
This shows the average time deals spend in each stage.
## Summary
| Component | Purpose |
|-----------|---------|
| **Last Entered fields** | Store when opportunity entered each stage |
| **Days in fields** | Store how many days spent in each stage |
| **Workflow** | Records timestamp AND calculates days in one pass |
| **Views & Aggregations** | Analyze deal velocity and identify bottlenecks |
## Related
- [Workflows](/user-guide/workflows/overview) — automation basics
- [How to Create Custom Fields](/user-guide/data-model/how-tos/create-custom-fields) — field configuration
- [Kanban Views](/user-guide/views-pipelines/capabilities/kanban-views) — aggregations