Конверсия менеджеров: почему свежие лиды нельзя сравнивать со старыми

В отчёте отдела продаж у Анны конверсия 30%, у Бориса — 10%. Кажется, разница очевидна. Но Анна получила большинство лидов три недели назад, а Борис — позавчера. Клиенты ещё отвечают на письма, согласуют бюджет и назначают встречи. Если сравнить продажи на текущую дату, свежий поток проиграет просто потому, что ему дали меньше времени. Построим сравнение с одинаковым сроком на решение и отдельно сохраним очередь незавершённых лидов.

Выбрать событие старта и фиксированное окно

Лид появляется в CRM, затем может несколько дней ждать распределения. Для оценки скорости отдела стартом служит поступление лида. Для работы конкретного менеджера — момент назначения, если именно тогда начинается его ответственность. Выбор меняет результат: нельзя сначала держать лид в общей очереди, а затем всю задержку приписать сотруднику. В примере считаем с даты назначения и ищем оплату в первые семь суток.

Пусть отчёт строится на начало 15 октября. Лиды, назначенные 1 и 2 октября, имеют полное окно. Лиды от 12 октября пока слишком свежие. У Анны два зрелых лида, один из них оплатил на третий день. У Бориса тоже два зрелых: один оплатил на шестой день, другой на девятый. За семь дней оба менеджера имеют 50%. Поздняя продажа Бориса остаётся в CRM, но в семидневную конверсию не входит.

Не потерять лиды без результата

Основа расчёта — таблица назначений, по одной строке на согласованную единицу лида. Оплаты присоединяются к ней так, чтобы отсутствие оплаты не удаляло строку. Иначе отчёт увидит только покупателей и начнёт измерять долю среди уже завершённых продаж. Если платежей несколько, сначала выберите первый подходящий платёж; размножение одной строки на число оплат увеличит знаменатель и исказит результат.

from datetime import date
cutoff = date(2026, 10, 15)
leads = [
    ('Anna', date(2026,10,1), date(2026,10,4)),
    ('Anna', date(2026,10,2), None),
    ('Boris', date(2026,10,1), date(2026,10,7)),
    ('Boris', date(2026,10,2), date(2026,10,11)),
    ('Boris', date(2026,10,12), None)]
window = 7
result = {}
for manager, assigned, paid in leads:
    row = result.setdefault(manager, {'mature':0, 'won_in_window':0, 'pending':0})
    if (cutoff-assigned).days < window:
        row['pending'] += 1
        continue
    row['mature'] += 1
    row['won_in_window'] += int(paid is not None and 0 <= (paid-assigned).days < window)
for manager, row in result.items():
    row['conversion'] = row['won_in_window']/row['mature'] if row['mature'] else None
print(result)
assert result['Anna']['conversion'] == result['Boris']['conversion'] == 0.5
assert result['Boris']['pending'] == 1

Согласовать граничные даты

Код использует полуоткрытое окно: от назначения включительно до начала восьмого дня, то есть разница дат меньше семи. Для реальных CRM с временем события лучше считать семь полных суток по временным меткам в одной временной зоне. Если бизнес работает по календарным рабочим дням, понадобится производственный календарь. Подпись «за неделю» без этого правила способна давать разные ответы в двух отчётах.

Лиды с неполным окном попадают в pending. Для оперативного управления покажите их количество и возраст отдельно, а также текущий этап воронки. Руководителю нужно видеть, что у Бориса растёт новая очередь, даже пока её рано оценивать по продажам. Ожидание полного окна нужно для честного сравнения конверсии; для реакции на забытый лид ждать семь дней не требуется.

После выравнивания возраста остаётся состав потока

Даже одинаковое окно не делает распределение лидов случайным. Один менеджер получает входящие заявки с ценой на сайте, другой — холодные контакты; один продаёт сложный корпоративный договор, другой — стандартный пакет. Разделите отчёт по источнику и продукту либо сравните сотрудников на одинаковом распределении категорий. Малое число зрелых лидов рядом с процентом обязательно оставьте видимым: 50% из двух записей и из двухсот — разная точность оценки.

На практике полезны две соседние таблицы. Первая сравнивает зрелые назначения по неделе старта, сотруднику и источнику с фиксированной семидневной конверсией. Вторая показывает всю открытую очередь с возрастом и следующим действием. Такое разделение помогает одновременно оценивать прошлую работу и управлять сегодняшней, не наказывая менеджера за лиды, которые ещё не успели принять решение.

Продолжить работу с данными

Следующая задача — связать назначения, оплаты и источники без дублей. В «Практической аналитике данных» вы проверите детализацию и последствия объединения таблиц, разберёте клиентов и рекламные каналы, а затем оформите вывод. Это основа отчёта, в котором руководителю видно и качество потока, и работу команды. Откройте программу платного курса «Практическая аналитика данных».

Продолжить на практике

  • Практическая аналитика данных ↗

    Превратите знания SQL или Python в аналитическую работу: проверяйте данные, считайте бизнес-метрики, стройте дашборды и объясняйте выводы на трёх прикладных кейсах.