Совпадение навыков не объясняет инвайт

Рекрутер пишет «выбран другой кандидат» — и мозг достраивает: не хватило стека. Я проверил это на своих заявках. Средний match-score у инвайтов и у отказов один и тот же: 49 против 49. Навыки в резюме почти не разделяют исход. Разделяют тайминг, конкуренция и вилка, которой нет в тексте вакансии.

Я — Артём Стельмахов, HR-аналитик. Цифры ниже — не рынок РФ и не бенчмарк hh. Это моя воронка: бот откликов, PostgreSQL, срез 2026-09-09. История бота в основном BA/SA, пивот в HR-аналитика свежий. Метод тот же, что я применяю к воронке найма: этапы, time-in-stage, причины отказа, скоринг «резюме vs вакансия». Резюме — на сайте и на HeadHunter.

Воронка, на которой я это увидел

События apply / invite / reject в hh_events, июнь 2024 — сентябрь 2026.

ЭтапКол-воДоля от заявок
Заявки3 875100%
Инвайты3148.1%
Отказы1 87948.5%
Без ответа~1 68243.4%

Рыночный ориентир «отклик → найм» для профессиональных ролей — 0.5–2% (HrPanda 2026). Это другой этап. Мои 8.1% — «отклик → инвайт», ближе к переходу «скрининг → интервью», не к выходу на работу. Сравнивать эти два процента как одну конверсию нельзя.

Дедуп по вакансии, последняя тысяча в ATS-срезе hh_vacancies: applied 577 / invitation 38 / rejected 385. Конверсия 3.8%, доля отказов 38.5%. Это уже не все события бота, а срез по уникальным вакансиям. Обе цифры — мои, не рынок.

Инвайт в 8.1% не доказывает, что резюме «сильное». Он доказывает, что воронку можно посчитать на своих данных так же, как HR-аналитик считает её на данных компании.

Время решения: инвайт приходит в тот же день

Метрика time-in-stage — join заявки с первым инвайтом или отказом по той же вакансии.

ПереходNСреднееМедиана
Отклик → инвайт1911.9 дня0 дней
Отклик → отказ1 1404.6 дня1.2 дня

Если зовут — часто в тот же день. Если отказывают текстом — медиана чуть больше суток. Долгое «на рассмотрении» обычно не рассмотрение, а молчание: 43.4% заявок так и остаются без статуса. Это не гипотеза про рынок. Это распределение по моим событиям.

Для HR-аналитики внутри компании вывод тот же: среднее врёт, медиана показывает, где воронка живая. Кандидат, который ждёт неделю, уже не в процессе. Он в хвосте без ответа.

Теги отказа: навыки — не главное узкое место

Из 1 377 отказов текст от рекрутера пришёл только в 193 случаях (14%). Остальное — автостатус без сообщения. Это тоже инсайт: большинство работодателей фидбэк не пишет. Теги ниже — только по этим 193 текстам, LLM-классификация, одно сообщение может нести несколько тегов. Сумма долей больше 100%, теги не исключают друг друга.

ТегКол-воДоля от 193Что это значит
competition_timing18294%Не успел, закрыли, выбрали другого
polite_no_reason17691%Вежливый отказ без причины
salary_unknown17189%В вакансии нет вилки — высокий риск разъехаться в деньгах
fit_stack4724%Не совпал стек
auto_template4624%Шаблон ATS
fit_product_ba3619%Вакансия ближе к продуктовому BA, чем к системному
geo_format3016%Офис, гибрид, город
letter_wrong_proof2312%В письме не тот кейс под роль
human_recruiter63%Живой текст, не бот
fit_domain32%Не тот домен

fit_stack — 24%. Не ноль, но не то место, куда смотрит интуиция. 94% текстов несут конкуренцию и тайминг. 89% — вакансию без зарплаты. Эти два тега часто сидят в одном письме вместе с «вежливым отказом без причины». Поэтому «нас не устроил стек» — удобная история, которую данные не подтверждают.

Я не утверждаю, что рынок так устроен для всех. Я утверждаю, что в моей размеченной выборке из 193 текстов узкое горло не в навыках. Если бы я правил только стек и ждал рост инвайтов, я правил бы не ту ступень.

Match-score 49 = 49

Скоринг computeMatchScore плюс LLM-разбор: резюме против текста вакансии. Выборка — 1000 последних вакансий, endpoint deep-analytics.

Средний балл инвайтов: 49. Средний балл отказов: 49.

Если бы исход объяснялся набором ключевых слов, эти два средних разъехались бы. Они не разъехались. Совпадение навыков — слабый предиктор. Это стыкуется с тегами: fit_stack на четверти текстов, competition_timing почти на всех.

Топ гэпов по той же тысяче — про историю бота, не про HR-аналитика. До пивота корзина была BA/SA. Таблицу ниже нельзя читать как «чего не хватает HR-аналитику». Её можно читать как «какой метод я применяю».

Навык из вакансии, которого нет в резюмеВсегоВ отказахВ инвайтах
Системный анализ195835
Бизнес-анализ146577
Аналитическое мышление119507
Постановка задач разработчикам89363
Разработка технических заданий72342
Apache Kafka64300
REST55262
User Story55220
API53232
Анализ данных50201

Kafka в 30 отказных вакансиях и в нуле инвайтов выглядит как стоп. На фоне 49 = 49 это локальный шум по одному навыку, не закон воронки. Системный анализ «не хватает» и там, куда меня звали: 5 инвайтов при 83 отказах. Гэп есть в обеих корзинах. Значит, наличие строки в резюме не есть причина инвайта.

Метод полезен тем, кто нанимает, ровно в эту сторону. Skill-matrix «есть / нет» объясняет, кого отсеет автофильтр ATS. Она плохо объясняет, кого позовут, когда автофильтр уже пройден. Дальше работают очередь, скорость чужого отклика и вилка, которой нет в тексте.

Месяцы и тонкий срез по HR-аналитику

Помесячно конверсия скачет. Это не «рынок умер в мае». Это мои фильтры, письма и объём.

МесяцЗаявкиИнвайтыКонверсия
2026-03569529.1%
2026-04505448.7%
2026-051 204615.1%
2026-06233104.3%
2026-07215104.7%
2026-08255155.9%

Май раздул заявки и уронил долю. Июнь–август — меньше объёма, конверсия ползёт вверх: 4.3% → 4.7% → 5.9%. Я связываю это с итерациями фильтров и писем, не с «рынком в целом». Доказательства на уровне A/B у меня нет: это наблюдение на своих рядах.

Срез именно по HR-аналитик вакансиям пока тонкий: 13 объявлений с явным HR-профилем, 8 applied, 5 rejected, 0 invitation. Пивот свежий, инвайтов ещё нет — это ожидаемо, не провал стека. Сами тексты полезны как словарь: Excel + Power Query / Pivot, SQL, один BI (DataLens / Power BI / Tableau как альтернативы), иногда 1С:ЗУП и C&B. Отказ при точном совпадении стека уже был — вакансия «Передовые Платежные Решения», Excel + SQL + DataLens, отказ без причины. Это тот же паттерн, что и 94% competition_timing в размеченных текстах.

Что из этого следует — и чего не следует

Следует: не чинить только навыки, если воронка уже считает 49 = 49. Чинить скорость, фильтр по вилке, точность письма под роль. letter_wrong_proof — 12% размеченных отказов: это место, где я могу повлиять сам. salary_unknown — 89%: я не заставлю работодателя открыть вилку, но могу не тратить заявку на объявление без денег, если мой коридор известен.

Не следует: переносить 8.1% и 49 = 49 на чужую ATS. Бот откликается иначе, чем человек. Корзина до пивота — BA/SA. Теги стоят на 193 текстах из 1 377 отказов. Оставшиеся 86% отказов без текста я не разметил и не додумал.

Не следует и обратное: «навыки не важны». fit_stack на 24% — реальный слой. Гео и формат — 16%. Domain gate вроде 1С:ЗУП на корпоративных HR-ролях я в этой статье не пересчитываю: его нет в моей BA/SA-истории как массового тега, но в живых HR-вакансиях 2026 он есть. Про него — в тексте про стек, честно: ЗУП и Hay я не администрировал.

Для нанимающей стороны практический вывод простой. Если воронка «отклик → скрининг» плохая, сначала проверьте очередь и прозрачность вилки, не только чек-лист навыков. Если инвайт не растёт после расширения skill-matrix в вакансии, возможно, вы чините не ту ступень. Свою воронку я разбираю так же: этап, время, причина, и только потом совпадение слов.

Демо, где эта логика собрана в интерфейс, а не в таблицу статьи: разобрать воронку на демо. Цикл рядом: воронка найма и метрики, кто такой HR-аналитик, стек HR-аналитика.

Оговорка. Все абсолюты (3 875 заявок, 314 инвайтов, 8.1%, 49 vs 49, теги на 193 текстах, помесячные ряды) — моя БД бота откликов, срез 2026-09-09. История выборки в основном BA/SA до пивота в HR-аналитика. Бенчмарк 0.5–2% «отклик → найм» — HrPanda 2026, другой этап воронки. Демо на /recruiting-roi — синтетика.

Ещё из цикла