> ## Documentation Index
> Fetch the complete documentation index at: https://docs.twenty.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Отслеживать как долгое время осталось на каждом этапе

> Отслеживайте скорость сделок, фиксируя момент входа сделок на каждый этап.

<Tip>
  Это пример создания [полей формулы](/l/ru/user-guide/workflows/how-tos/crm-automations/formula-fields) с помощью рабочих процессов — в частности вычислений дат.
</Tip>

Отслеживание моментов входа сделок на каждый этап помогает выявлять узкие места и измерять скорость сделок.

В этом руководстве показано, как настроить пользовательские поля и рабочий процесс для автоматической фиксации момента перехода сделки на каждый этап и вычисления количества дней, проведённых на предыдущем этапе.

## Шаг 1: Создайте пользовательские поля

Для каждого этапа вам нужны два типа полей:

* **Поля «Дата и время»**: фиксируют, когда сделка вошла на каждый этап
* **Числовые поля**: хранят, сколько дней сделка провела на каждом этапе

### Создайте поля «Последний вход»

1. Перейдите в **Настройки → Модель данных → Сделки**
2. Для каждого этапа нажмите **+ Добавить поле** и настройте:
   * **Имя**: Последний вход в \[название этапа] (например, «Последний вход — Новый», «Последний вход — Квалификация»)
   * **Тип**: Дата и время
   * **Описание**: Метка времени, когда сделка вошла на этот этап
3. Нажмите **Сохранить**

Создайте эти поля:

* Последний вход — Новый
* Последний вход — Квалификация
* Последний вход — Встреча
* Последний вход — Предложение
* Последний вход — Переговоры
* Последний вход — Закрыта — выиграна
* Последний вход — Закрыта — проиграна

### Создайте поля «Дней на этапе»

1. Для каждого этапа нажмите **+ Добавить поле** и настройте:
   * **Имя**: Дней на \[название этапа] (например, «Дней на Новом», «Дней на Квалификации»)
   * **Тип**: Число
   * **Описание**: Количество дней, проведённых на этом этапе
2. Нажмите **Сохранить**

Создайте эти поля:

* Дней на Новом
* Дней на Квалификации
* Дней на Встрече
* Дней на Предложении
* Дней на Переговорах

<Note>
  Поля «Дней на этапе» не нужны для этапов «Закрыта — выиграна» и «Закрыта — проиграна», так как это финальные этапы.
</Note>

### Необязательно: сделайте поля только для чтения

Если вы не хотите, чтобы пользователи вручную редактировали эти вычисляемые поля:

1. Перейдите в **Настройки → Участники → Роли**
2. Выберите роль для настройки
3. Найдите объект «Сделки»
4. Сделайте поля «Последний вход» и «Дней на этапе» доступными только для чтения

## Шаг 2: Создайте рабочий процесс

Один рабочий процесс решает обе задачи:

* Записывает метку времени при входе на новый этап
* Вычисляет количество дней, проведённых на предыдущем этапе

### Создайте рабочий процесс

1. Перейдите в **Рабочие процессы**
2. Нажмите **+ Новый рабочий процесс**
3. Назовите его «Отслеживание времени по этапам»

### Настройте триггер

1. Добавьте триггер **Record Updated**
2. Выберите **Сделки** как объект
3. Фильтр: обновлено поле **Этап**

### Добавьте ветви для каждого этапа

<Note>
  Чтобы создать новую ветвь, щёлкните правой кнопкой мыши на холсте рабочего процесса и нажмите **Новое действие**. Затем свяжите это действие с предыдущим узлом, перетащив стрелку от предыдущего узла к новому действию.
</Note>

***

**Ветвь 1: Этап = Новый (первый этап)**

Поскольку это первый этап, мы записываем только метку входа — предыдущего этапа для расчёта нет.

1. Добавьте узел **Filter**: Этап = Новый
2. Добавьте действие **Code**:

```javascript theme={null}
export const main = async (): Promise<object> => {
  return { now: new Date().toISOString() };
};
```

3. Добавьте действие **Update Record**:
   * Запись: инициировавшая триггер сделка
   * Поле: Последний вход — Новый
   * Значение: `now` из узла Code

***

**Ветвь 2: Этап = Квалификация**

При переходе к «Квалификации» запишите время входа И рассчитайте дни, проведённые на «Новом».

1. Добавьте узел **Filter**: Этап = Квалификация
2. Добавьте действие **Code**:

```javascript theme={null}
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. Настройте вход узла Code: сопоставьте `lastEnteredPreviousStage` с полем **Последний вход — Новый**
4. Добавьте действие **Update Record**:
   * Запись: инициировавшая триггер сделка
   * Поля для обновления:
     * Последний вход — Квалификация = `now`
     * Дней на Новом = `daysInPreviousStage`

***

**Ветвь 3: Этап = Встреча**

При переходе к «Встрече» запишите время входа И рассчитайте дни, проведённые на «Квалификации».

1. Добавьте узел **Filter**: Этап = Встреча
2. Добавьте действие **Code**:

```javascript theme={null}
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. Настройте вход узла Code: сопоставьте `lastEnteredPreviousStage` с полем **Последний вход — Квалификация**
4. Добавьте действие **Update Record**:
   * Запись: инициировавшая триггер сделка
   * Поля для обновления:
     * Последний вход — Встреча = `now`
     * Дней на Квалификации = `daysInPreviousStage`

***

**Продолжите для оставшихся этапов:**

| Этап                | Записи                               | Вычисляет           |
| ------------------- | ------------------------------------ | ------------------- |
| Предложение         | Последний вход — Предложение         | Дней на Встрече     |
| Переговоры          | Последний вход — Переговоры          | Дней на Предложении |
| Закрыта — выиграна  | Последний вход — Закрыта — выиграна  | Дней на Переговорах |
| Закрыта — проиграна | Последний вход — Закрыта — проиграна | Дней на Переговорах |

Ветви не обязаны сходиться — каждая выполняется независимо, когда выполняется условие её этапа.

## Шаг 3: Проанализируйте время на этапе

Имея метки времени и количество дней, вы можете анализировать скорость сделок.

### Создайте представление «Медленные сделки»

1. Создайте табличное представление «Сделки»
2. Добавьте столбцы: Название, Этап, Дней на \[предыдущем этапе], Сумма
3. Отсортируйте по полю «Дней на этапе» (по убыванию)
4. Отфильтруйте по полю «Этап», чтобы сосредоточиться на одном этапе

Сделки вверху провели больше всего времени на предыдущем этапе.

### Используйте агрегации

В канбан-представлении вашей воронки:

1. Нажмите на число рядом с названием этапа
2. Выберите **Среднее**
3. Выберите поле «Дней на этапе»

Это покажет среднее время, которое сделки проводят на каждом этапе.

## Резюме

| Компонент                     | Назначение                                              |
| ----------------------------- | ------------------------------------------------------- |
| **Поля «Последний вход»**     | Хранят момент входа сделки на каждый этап               |
| **Поля «Дней на этапе»**      | Хранят количество дней, проведённых на каждом этапе     |
| **Рабочий процесс**           | Записывает метку времени И вычисляет дни за один проход |
| **Представления и агрегации** | Анализируйте скорость сделок и выявляйте узкие места    |

## Связанные материалы

* [Рабочие процессы](/l/ru/user-guide/workflows/overview) — основы автоматизации
* [Как создать пользовательские поля](/l/ru/user-guide/data-model/how-tos/create-custom-fields) — настройка полей
* [Канбан-представления](/l/ru/user-guide/views-pipelines/capabilities/kanban-views) — агрегации
