Отчёт по срокам сделки

Отчёт по срокам сделки в MacroCRM находится в блоке Отчёты, разделе Продажи: воронка.

Этот отчёт является ключевым инструментом для глубокого анализа и оптимизации процесса продаж. Он предоставляет общую картину эффективности на каждом этапе, позволяя аналитикам и руководителям отдела продаж точно определить, какие подразделения или менеджеры закрывают сделки быстрее всего. Также он помогает выявить узкие места в воронке, отображая длительность каждого этапа — от первичной обработки до бронирования и финальной сделки. Используя такие показатели, как Общий и Средний срок сделки в сочетании с детализацией по этапам (Неразобранное, Проверка, Подбор и т.д.), вы получаете возможность принимать обоснованные решения для системного сокращения цикла продаж.

Работа с отчётом

Фильтры отчёта

  1. Дата:

  • При открытии отчёта фильтр по умолчанию выбирает тип «Дата появления заявки».

  • Нажмите на тип даты, чтобы выбрать событие, по которому будет ограничена выборка заявок (например, «Дата начала сделки»).

  1. Отдел и Менеджер (Ответственный):

  • Эти фильтры используют формат и позволяют точно отсортировать данные отчёта по конкретным отделам продаж и ответственным сотрудникам в сделке.

  1. Сотрудник сопровождения сделки и Опции:

  • Фильтрует отчёт по сопровождающему сотруднику. Для более наглядной работы с этим фильтром рекомендуется включить опцию «Группировать по сотруднику сопровождения».

  • При активации этой опции в отчёте устанавливается следующая иерархия вложенности: Сотрудник сопровождения \rightarrow Отдел продаж \rightarrow Менеджер (Ответственный).

Технический паспорт отчёта

Структура и источник данных

Отчёт представляет собой комбинацию данных по длительности этапов и количеству сделок.

Важно: точную продолжительность этапов невозможно получить напрямую через листинги или стандартные реестры системы. Для контроля и детальной проверки расчетов следует использовать MacroData.

Данные в системе

Общий срок сделок (1).

Показатель Общий срок сделок (1) представляет собой суммарную продолжительность пребывания всех завершенных заявок от до фактического перехода в статус Сделка проведена.

Принцип выбора данных в MacroData (без учёта фильтров):

Для получения этих данных необходимо связать таблицы estate_buys и estate_buys_statuses_log, чтобы найти дату перехода в финальный статус (100) и рассчитать временную разницу.

SELECT 
    T1.manager_name, 
    T1.total_seconds, 
    CASE 
        WHEN T1.total_seconds >= 31536000 
            THEN CONCAT(FLOOR(T1.total_seconds / 31536000), ' г ', FLOOR((T1.total_seconds % 31536000) / 2592000), ' мес')  
        ELSE CONCAT(T1.total_seconds, ' с') 
    END AS total_time_formatted 
FROM 
    (
        SELECT
            U.users_name AS manager_name, 
            SUM(TIMESTAMPDIFF(SECOND, EB.date_added, EBSL.log_date)) AS total_seconds 
        FROM 
            estate_buys EB 
        INNER JOIN 
            estate_buys_statuses_log EBSL 
            ON EB.id = EBSL.estate_buy_id AND EBSL.status_to = 100 AND EBSL.status_from <> 100 
        INNER JOIN 
            users U ON EB.manager_id = U.id 
        WHERE 
            EB.status = 100 
        GROUP BY 
            U.users_name 
    ) AS T1 
ORDER BY 
    T1.total_seconds DESC;

Всего сделок (2).

Количество Всего сделок (2) соответствует числу заявок, которые имеют текущий и подпадают под условия фильтрации.

Проверка данных в CRM: Для проверки перейдите в Листинг заявок и установите фильтр по дате и текущему статусу Сделка проведена. Обратите внимание, чтобы в обоих периодах был выбран одинаковый тип даты.

Принцип выбора данных в MacroData (без учёта фильтров):

SELECT 
    U.users_name AS manager_name, 
    COUNT(EB.id) AS "Всего сделок" 
FROM 
    users U 
INNER JOIN 
    estate_buys EB ON U.id = EB.manager_id 
WHERE  
    EB.status = 100 
GROUP BY 
    U.id, U.users_name 
ORDER BY 
    "Всего сделок" DESC;

Проверка длительности этапов (4-9).

Статусы Неразобранное, Проверка, Подбор, Отложено, Бронь, Сделка в работе (4-9) отражают среднее время пребывания заявки в каждом из этих статусов в .

Принцип выбора данных в MacroData на примере статуса Неразобранное (4):

SELECT 
    U.users_name AS manager_name, 
    ROUND(AVG(SD.duration_seconds)) AS "Неразобранное" 
FROM 
    users U 
INNER JOIN 
    estate_buys EB ON U.id = EB.manager_id 
INNER JOIN 
    ( 
        SELECT 
            EBSL_ENTRY.estate_buy_id, 
            TIMESTAMPDIFF(SECOND, EB_SUB.date_added, ( 
                SELECT MIN(EBSL_EXIT.log_date) 
                FROM estate_buys_statuses_log EBSL_EXIT 
                WHERE EBSL_EXIT.estate_buy_id = EBSL_ENTRY.estate_buy_id 
                AND EBSL_EXIT.log_date > EBSL_ENTRY.log_date 
            )) AS duration_seconds 
        FROM 
            estate_buys_statuses_log EBSL_ENTRY 
        INNER JOIN 
            estate_buys EB_SUB ON EBSL_ENTRY.estate_buy_id = EB_SUB.id 
        WHERE 
            EBSL_ENTRY.status_to = 5  
            AND EB_SUB.status = 100  
    ) AS SD ON EB.id = SD.estate_buy_id 
WHERE 
    EB.status = 100 
GROUP BY 
    U.id, U.users_name 
ORDER BY 
    "Неразобранное" DESC;

Адаптация запроса для других статусов.

Чтобы рассчитать среднее время для любого , выполните следующие три шага:

  1. Измените псевдоним столбца: Замените AS "Неразобранное" на нужное название статуса (например, AS "Проверка").

  2. Измените фильтр статуса: Замените EBSL_ENTRY.status_to = 5 на требуемый номер статуса (например, 10).

  3. Измените логику расчета времени.

  • Для Неразобранного (5): \rightarrow TIMESTAMPDIFF(SECOND, EB_SUB.date_added, ...)

  • Для Проверки (10) и всех остальных: \rightarrow TIMESTAMPDIFF(SECOND, EBSL_ENTRY.log_date, ...)

Расчётные данные

Средний срок сделки (3).

Средний срок сделки (3) — это результат деления Общего срока сделок (1) на Всего сделок (2). Запрос выводит все три столбца для проверки.

Принцип выбора данных в MacroData (без учёта фильтров):

SELECT 
    U.users_name AS manager_name, 
    T1.total_seconds AS "Общее время (сек)", 
    T1.total_deals AS "Всего сделок", 
    T1.avg_sec_to_deal AS "Средний срок сделки (сек)" 
FROM 
    users U 
INNER JOIN 
    ( 
        SELECT 
            EB.manager_id, 
            SUM(TIMESTAMPDIFF(SECOND, EB.date_added, EBSL.log_date)) AS total_seconds, 
            COUNT(EB.id) AS total_deals, 
            ROUND(SUM(TIMESTAMPDIFF(SECOND, EB.date_added, EBSL.log_date)) / COUNT(EB.id)) AS avg_sec_to_deal 
        FROM 
            estate_buys EB 
        INNER JOIN 
            estate_buys_statuses_log EBSL 
            ON EB.id = EBSL.estate_buy_id AND EBSL.status_to = 100 AND EBSL.status_from <> 100 
        WHERE 
            EB.status = 100 
        GROUP BY 
            EB.manager_id 
    ) AS T1 ON U.id = T1.manager_id 
ORDER BY 
    T1.avg_sec_to_deal DESC;

Last updated