Документация MACRO

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

>-

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

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

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

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

  1. Отдел и Менеджер (Ответственный):
  • Эти фильтры используют формат мультиселекта и позволяют точно отсортировать данные отчёта по конкретным отделам продаж и ответственным сотрудникам в сделке.
  1. Сотрудник сопровождения сделки и Опции:
  • Фильтрует отчёт по сопровождающему сотруднику. Для более наглядной работы с этим фильтром рекомендуется включить опцию «Группировать по сотруднику сопровождения».
  • При активации этой опции в отчёте устанавливается следующая иерархия вложенности: Сотрудник сопровождения $$\rightarrow$$ Отдел продаж $$\rightarrow$$ Менеджер (Ответственный).

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

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

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

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

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

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

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

Принцип выбора данных в 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) соответствует числу заявок, которые имеют текущий статус «Сделка проведена»Статус 100 в MacroData и подпадают под условия фильтрации.

Проверка данных в 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;

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

Чтобы рассчитать среднее время для любого другого статусаПроверка (10), Подбор (20) и т.д., выполните следующие три шага:

  1. Измените псевдоним столбца: Замените AS "Неразобранное" на нужное название статуса (например, AS "Проверка").
  2. Измените фильтр статуса: Замените EBSL_ENTRY.status_to = 5 на требуемый номер статуса (например, 10).
  3. Измените логику расчета времени.

⚠️ Внимание: Для всех статусов, кроме «Неразобранное» (5), измените формулу TIMESTAMPDIFF в подзапросе SD, заменив EB_SUB.date_added на дату входа в статус (EBSL_ENTRY.log_date):

  • Для Неразобранного (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;