Цена отклика живёт на неделе и на ID
Цену отклика я считаю по конкретному ID вакансии и по одной неделе. Среднее по кабинету эту цену прячет. Бюджет съедает объявление, которое уже никого не приводит, а отчёт выглядит «в среднем нормально».
Сейчас эта цифра собирается на двух продуктах. HR Rocket считает медиапланы HR-рекламы на hh.ru и Avito. HR Stats смотрит рынок. Статья про первую сторону: как из еженедельных выгрузок кабинетов получается число, по которому можно снять или оставить бюджет.
Скоринг кандидатов в HR Rocket не входит. Продукт считает прогноз откликов, CPL и расклад бюджета по объявлениям. Ранжирование резюме — другая задача, в эту дробь её не кладу.
Цифры ниже трёх видов. Механика и методология — свои, из продового BI. Кейсы HoReCa и ритейла — с публичного лендинга hr-rocket.ru на срез 09.09.2026. Это продуктовые кейсы. Личный P&L и выгрузка клиента из них не следуют. Демо Свода Avito + hh.ru на этом сайте на синтетических данных: механика как в проде, имена клиентов и абсолютные объёмы не публикую, NDA.
Что в дроби, и что в неё не кладут
CPL здесь — cost per lead в узком смысле HR-рекламы: стоимость одного отклика. Стоимость найма в эту дробь не входит. Стоимость приглашения тоже.
CPL = бюджет за период / число откликов за тот же период.
Если откликов ноль, а бюджет больше нуля, это дыра. «CPL = 0» из такой строки не делаю. В отчёте она остаётся отдельным сигналом. В среднее её не прячу.
| Метрика | Что это | Что путают |
|---|---|---|
| Бюджет / неделя | Списание кабинета на объявление или группу | «Потратили в этом месяце» без недели и ID |
| Отклики / неделя | Отклики на этот ID за ту же неделю | Сумма откликов по бренду, без канала и профиля |
| CPL отклик | Бюджет ÷ отклики | Cost-per-hire, цена приглашения, цена просмотра |
| Доля в продвижении | Какие вакансии сейчас тянут бюджет | «У нас всё продвигается» без списка ID |
CPL без разреза бесполезен. Один и тот же «нормальный» CPL по компании может скрывать дешёвый канал в одном городе и дорогой мусор в другом. Поэтому держу четыре оси: канал (hh / Avito) × город × профиль вакансии × неделя.
Профиль — класс роли. Подпись рекрутера в названии классом не становится. Кассир, сборщик, ночная смена, кадровик. Названия в выгрузках пляшут: регистр, дефисы, «УБОРЩИК / ЦА», стажировка в скобках. Без классификации свод склеивает разные роли, и CPL врёт.
Смежный этаж — воронка найма: что происходит с человеком после отклика. Здесь только цена входа. Дешёвый отклик с нулевой конверсией в инвайт медиапланом не лечится.
Зачем неделя
Кабинеты Avito и hh.ru удобно выгружать раз в неделю. Месячный итог сглаживает то, что HRD как раз нужно увидеть: переиздание, смену менеджера, вход в рекламную кампанию, двухнедельное списание.
Неделя даёт три вещи.
Сопоставимость. Стратегию меняют с конкретной недели. Месяц смешивает пилот и фон.
Атрибуция кампании. Период кампании редко совпадает с неделей день в день. Клею их по максимальному пересечению календарных дней, таймзона Москвы. При равенстве беру более раннюю неделю. На домашней неделе вакансии — не больше одной подписи.
Шум биллинга. Списание раз в две недели выглядит как «бюджет упал», хотя рычаг никто не трогал.
Публичный стек: SQL, Python, ETL. Пилот-отчёт часто отдаю в xlsx. Города сворачиваются, под метрикой пометка «цель достигнута / нет».
Из грязного xlsx в строку
Пайплайн начинается с xlsx из личных кабинетов. Имя файла несёт период. Даты внутри хуже: у одного клиента ISO YYYY-MM-DD, у другого день стоит первым. Реальный баг: ISO без явного формата парсилась как dayfirst, 9 июня становилось 6 сентября, флаг «новая публикация» уходил в ноль по каналу. CPL при этом «считался». Считался на чужой неделе.
Дальше классификация профиля: ключевое слово, стоп-слово, порядок проверки, дефолт «Без профиля». На контрольной партии 4 недель точность была 99,7% (638 из 640 строк). Своя продовая методика. Бенчмарк рынка и цифра с лендинга из неё не следуют. Две ошибки обычно на пограничных заголовках вроде «кассир на склад, ночные смены». Такие строки оставляю в хвосте на разбор.
К выгрузке джойнится флаг: объявление уже в автоматизации продвижения или ещё нет. Без него нельзя ответить, платим ли мы за то, что алгоритм уже крутит, или за витрину.
Новая пара «клиент × канал» ручной миграции не требует. Точные размеры таблиц не публикую. Порядок величины, с округлением из-за NDA: порядка 150–200 тыс. строк на канал у крупного клиента. Это не «у всех» и не маркетинговый объём.
Свод A/B
Когда говорят «у нас просело», почти всегда сравнивают разные множества. Свод это держит.
Две панели фильтров, A и B. Строки — метрики: бюджет, отклики, CPL, показы, просмотры, контакты, доля в продвижении. Столбцы — недели. Рядом таблица Δ(A−B). Тот же приём, что сводная в Excel. Сначала фиксирую, что сравниваю. Потом смотрю дельту. Карточки тут ни при чём.
| Панель A | Панель B | Зачем |
|---|---|---|
| hh.ru, профиль «кассир», все города | Avito, тот же профиль | Сравнение канала при одном профиле |
| Город пилота, недели до старта | Тот же город, недели пилота | Pre/post без подмены состава |
| Вакансии в продвижении | Вакансии вне продвижения | Органика и платный рычаг отдельно |
| Один менеджер | Соседний менеджер, тот же профиль | Два человека на одном профиле |
Если в A сидят три города, а в B вся сеть, дельта бессмысленна. Свод это не запрещает. Он показывает, что множества разные. В презентацию с такой дельтой не ухожу.
На демо Свода те же колонки и тот же приём A/B. Данные там синтетические. Смотреть стоит механику: как фильтры собирают множество, как считается Δ, как неделя становится столбцом. Цифры «как у клиента» там не живут.
WoW: какая причина у сдвига
Неделя к неделе без причины — ещё один отчёт, который никто не читает. WoW-модуль отвечает на вопрос: какая причина у изменения отклика по этой вакансии и по этому менеджеру.
Причины, которые различаю на практике:
- бюджет или доп. продвижение включили или сняли;
- вакансия вошла в рекламную кампанию или вышла из неё;
- переиздание, новый ID или новая публикация;
- сменился менеджер, город, профиль, вилка, опыт;
- архивация;
- сдвиг внутри воронки объявления: показы → просмотры → контакты → отклики.
Два правила, без которых модуль врёт.
Причинное исключение. Если бюджет вырос, а отклики упали, рост бюджета причиной падения быть не может. Корреляция «мы же вливали деньги» закрыта явным списком противоречащих рычагов. Иначе каждый менеджер объяснит просадку чем угодно, кроме своей гипотезы.
Фильтр шума. ±1 отклик движением не считаю. Текущую неделю сравниваю и с прошлой, и со скользящей медианой за 4 недели. Так отделяется «качнуло, как обычно» от сдвига, на который стоит тратить планёрку.
Отдельно эхо списаний. Если ряд бюджета выглядит как 0 → оплата → 0, это биллинг. Решение «срезали продвижение» из такого ряда не читаю.
На менеджере свожу топ-3 профиля с наибольшим вкладом в изменение и человеческую формулировку причины. HRD не обязан читать 400 строк вакансий. Ему нужен список. Кассиры в Туле просели, потому что сняли кампанию. Сборщики в Рязани выросли, потому что переиздали и подняли вилку.
Тот же класс задач, что конкурентный анализ рынка труда: сначала разложить объект, вакансию или компанию, потом сравнить сопоставимое. CPL без профиля и WoW без исключения — родственники одной ошибки.
Пилот: baseline, три стратегии, разница-в-разницах
Медиаплан в продукте стоит на трёх слоях: потребность клиента, картина рынка, статистика по ID вакансии из кабинетов hh и Avito. Имена стратегий и доли бюджета — в статье про медиаплан на неделю. Здесь другой слой: пилот. Порог цены отклика задаю я. Число откликов считает модель. Ноутбук с обучением к вердикту не пристёгнут.
До любого пилота считается baseline: метрики клиента до старта. Без точки «до» любой рост можно списать на сезон, открытие магазинов или просто на удачную неделю.
Часть пилотов идёт с контрольной группой. Практически это три корзины городов.
| Корзина | Что с ней делают | Зачем |
|---|---|---|
| Test | Новая стратегия или лимит CPL | Измеряем эффект |
| Control | Старые правила | Вычитаем общий рынок |
| Monitor | Не трогаем | Проверяем, не качнулся ли рынок сам |
Разница-в-разницах на пальцах: рост метрики в тесте минус рост в контроле. Если отклики в тесте +20%, а в контроле +8%, эффект пилота порядка 12 п.п. Двадцать процентов теста целиком эффектом не называю: контроль забирает сезон и общий спрос. Цифры в примере учебные. Монитор нужен, чтобы не объявить победу, когда вся страна внезапно начала откликаться на линейный найм.
Целевые пороги задаются заранее. Например, рост откликов пилота не ниже X%, рост CPL пилота не выше Y%. После расчёта автоматический вердикт: цель достигнута или нет. Пороги в демо синтетические. Клиентские пороги не публикую.
Отчёт уходит в Excel: группировка по городам, сворачиваемые строки, короткий текст под каждой метрикой. Файл можно положить на стол без устного перевода сводной.
Как это устроено в интерфейсе — на Своде Avito + hh.ru: вкладки свода, классификатора, WoW с выбором недель «было / стало» и пилота с разницей-в-разницах. Ещё раз: данные демо синтетические, клиентские имена и объёмы под NDA.
Какие цифры можно показывать
С лендинга HR Rocket на 09.09.2026, как продуктовые кейсы, не как личная отчётность по клиенту:
| Кейс лендинга | Отклики | CPL |
|---|---|---|
| HoReCa | +61% | −47% |
| Ритейл | +43% | −65% |
Названия сетей, франшиз и банков сюда не подставляю.
Свои цифры без клиента:
- классификация профиля 99,7% (638/640) на контрольной партии 4 недель;
- порядок 150–200 тыс. строк на канал у крупного клиента, округление из-за NDA;
- механика свода, WoW и разницы-в-разницах в публичном демо повторяет продовую логику.
Чего нет: точный CPL клиента, выручка, число вакансий в проде, «средний CPL рынка» с hrstats.ru. Сайт HR Stats — SPA. Витринные проценты оттуда не выдумываю.
Как кладу это на стол
Разговор обычно короткий.
- CPL по каналу и профилю за последние недели. Квартальное среднее в этот список не входит.
- Три вакансии, которые съели бюджет при слабом отклике, и три, которые тянут воронку дешевле.
- Причина WoW: конкретный рычаг или его отсутствие. «Рынок просел» без рычага не принимаю.
- Если спорим про стратегию: baseline, тест, контроль, разница-в-разницах, порог.
Если после этого спрашивают, сколько платят конкуренты за кассира в этом городе, это уже конкурентный анализ рынка труда. Если спрашивают, что с инвайтом после отклика, это воронка найма. Если спрашивают, чем это считается, когда кабинета мало, это стек: Excel, SQL, DataLens.
Культуру «data-driven» внедрять не прошу. Прошу не смешивать три разные дроби и не решать по месячному среднему, когда рычаг живёт на неделе.
Открыть Свод · Avito + hh.ru. Синтетика, та же механика, что в проде. Живая вилка по рынку — соседняя статья и другое демо.
Дальше по теме
Открыть Свод · Avito + hh.ru