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