Всем привет! 20 сентября я писал здесь про свой агрегатор IT‑вакансий: Откликов все больше, ответов все меньше. Что показали 16 000 вакансий в моей базе. Та статья была про данные, парсеры и Postgres. А в комментариях, кроме багов (о них ниже), спрашивали другое. Зачем дублировать hh. Не ханипот ли это для сбора резюме.

Вопросы нормальные, я сам задаю их себе периодически:)

Поэтому эта статья про то, что вокруг кода. Откуда приходят люди, что они делают на сайте и почему с работодателями все сложнее, чем с кандидатами. Абсолютные цифры трафика я не публикую, но все доли и сравнения ниже посчитаны по настоящим данным из базы и Метрики. По ним хорошо видно, какие каналы у проекта работают на текущий момент, а какие нет.

Коротко для тех, кто ту статью не видел. Workaem собирает IT‑вакансии с карьерных сайтов компаний, ATS‑досок, hh (только бигтех + СНГ вакансии), телеграм‑каналов и пары агрегаторов. Склеивает дубли, считает, насколько вакансия живая, и показывает вилку на фоне рынка. Ссылки ведут на оригинал, откликается человек сам.

Что сделала одна статья

Сайт открылся в середине июля. За 12 дней после статьи на Хабре на нем зарегистрировалось в два с половиной раза больше людей, чем за два месяца до нее. Если считать по дням, регистраций стало в 13 раз больше.

Статья вышла в воскресенье, а в понедельник случился рекорд по регистрациям за всю историю сайта. Потом спад, а ровно через неделю, тоже в понедельник, вторая волна, и рекорд повторился. Откуда она, точно не знаю. Переходы с Хабра в те дни снова выросли, так что, похоже, статья попала в какую‑то подборку.

Отсюда я сделал далеко идущий вывод, что в понедельник людям особенно хочется сменить работу:)

Волны волнами, но мне интереснее, что осталось после них. К прежнему уровню поток не вернулся: регистраций в обычный день по‑прежнему в разы больше, чем до статьи, а прямых заходов стало раза в три больше. Видимо, люди сохраняют сайт и возвращаются.

Для сравнения. За пять дней до этого я выкладывал статью про игру, которую написал на выходных. Просмотров она собрала нормально, 8,7 тысячи, а на основной сайт почти не вела. Люди пришли поиграть, и это нормально, игра вообще не про поиск работы. Вывод таков: на сайт приводит статья про сам сайт.

Каталог вакансий сам по себе ничего не объясняет: человек открывает его, видит ленту, которая с первого взгляда ничем не отличается от любой другой, и закрывает, потому что у него уже есть hh и пара телеграм‑каналов, а зачем ему еще один сайт, на главной странице толком не расскажешь. Статья это объясняет. И читают ее айтишники, среди которых всегда кто‑то ищет работу. Денег это не стоит, только времени на текст.

Откуда приходят люди

Сначала про аналитику, потому что на нее я наступил сам. Метрика у меня загружается только после согласия на куки, и регистраций она видит меньше половины. Если у вас тоже стоит баннер с согласием, имейте в виду, что абсолютные числа в отчетах занижены, у меня больше чем вдвое. С долями между источниками, надеюсь, получше, на них дальше и смотрю. Хотя блокировщики у читателей Хабра наверняка стоят чаще, чем у людей из Google, так что доля Хабра скорее занижена.

Среди внешних источников Хабр первый, это ожидаемо. Дальше интереснее: ChatGPT привел почти вдвое больше людей, чем поиск Яндекса, а следом за ним идет Perplexity. Я сначала не поверил, но ChatGPT так и стоит в источниках. Скорее всего, люди спрашивают у ассистента, где искать работу в IT, и он отвечает ссылкой.

Из поиска, кстати, регистрируются охотнее. Из Google регистрируется примерно каждый восьмой, с Хабра каждый шестнадцатый. Разница понятная: кто загуглил вакансии конкретной компании, тот уже ищет работу, и ему не надо объяснять, зачем каталог.

Комментарии оказались лучшим тестированием

Двадцать три комментария, и в них четыре бага, которые я сам не видел.

Пустая форма поиска все равно что‑то искала. Сокращения вроде «техпис» поиск не понимал. После подтверждения почты человека перекидывало на 0.0.0.0:3000, внутренний адрес контейнера, то есть первое, что видел новый пользователь, была ошибка. Хорошо, что кто‑то об этом написал, а не просто молча ушел.

А самый интересный был про C, C++ и C#. На все три запроса поиск выдавал одно и то же, 1 514 вакансий. Оказалось, полнотекстовый разбор выбрасывает плюсы и решетку еще до словаря:

select websearch_to_tsquery('russian', 'C++'), websearch_to_tsquery('russian', 'C#');
-- 'c' | 'c'

Теперь такие запросы идут мимо полнотекстового индекса, по названию с границами слова и по тегу. Получилось 258 вакансий на C++, 190 на C# и 15 на C, три разных списка. Попутно вылезла русская «С». В русской раскладке «С++» набирается кириллицей, и в названиях вакансий так тоже пишут: из 107 вакансий, найденных по названию, таких 28. А для одиночной «С» кириллицу пришлось наоборот запретить. Это предлог, и он стоит во многих названиях вроде «Senior Go Developer (с опытом в fintech)».

Все четыре бага я закрыл на следующий день. Кто помог найти и сообщил, огромная благодарность!

Еще попросили фильтр по аккредитованным IT‑компаниям. Он появился через несколько дней, вместе с отметкой аккредитации прямо в ленте. И посоветовали взять вакансии из базы Роструда. Я честно проверил.

По десяти IT‑запросам там нашлось 4 129 вакансий, из них 1 498 с непустым описанием и без пересечения с моим каталогом. Я уже обрадовался, а потом посмотрел на работодателей. Общих компаний с моим каталогом три из 1 678. Это совсем другой рынок: бюджетные учреждения, зарплаты 28–60 тысяч, а в описании должностная инструкция под копирку. В каталоге это были бы полторы тысячи строк, которые лезут в поиск и подборки и ничего не дают человеку, который ищет работу в разработке. Не взял, но результат записал, чтобы через полгода не проверять заново.

Отдельно про комментарий о ханипоте. Человек предположил, что сайт собирает резюме, а работодатели про него и не знают. Предположение логичное отчасти: со стороны непонятно, кто стоит за сайтом и куда уходят данные. В комментариях я тогда ответил, повторю коротко и здесь. У каждой вакансии видно, откуда она пришла, ссылка ведет на оригинал вакансии, а в базу кандидатов попадают только те, кто сам сделал профиль публичным в личном кабинете. По умолчанию он закрыт.

Пока читатели искали баги в поиске, в день публикации я нашел у себя дыру похуже. Бесплатные лимиты на ИИ считались по журналу вызовов, а строка в журнал пишется уже после ответа модели. Между проверкой и записью оставалось окно в несколько секунд, и двадцать одновременных запросов на сопроводительное письмо увидели бы «использовано 0» и прошли бы все. Обычная гонка. Я про такие знал и все равно пропустил. Теперь попытка бронируется до запроса к модели, в одной транзакции под блокировкой на пользователя:

perform pg_advisory_xact_lock(hashtext(p_user::text));

select count(*) into v_count from ai_run_claims
 where user_id = p_user and feature = p_feature
   and created_at >= now() - interval '30 days';
if v_count >= p_monthly_limit then return 'monthly'; end if;

insert into ai_run_claims(user_id, feature) values (p_user, p_feature);
return 'ok';

Если модель не ответила, бронь снимается, и бесплатная попытка не сгорает.

Минус шесть тысяч вакансий

И еще одно, о чем меня никто не просил. Через два дня после статьи я сам убрал из каталога около шести тысяч вакансий.

К тому моменту активных было около четырнадцати тысяч, а не шестнадцать, как в прошлой статье: каталог все время дышит, за месяц в архив уходит тринадцать тысяч вакансий. И почти половина активных оказалась такими, куда человеку из России или СНГ просто не попасть. Офис в Буэнос‑Айресе без релокации. Американский стартап, который нанимает только тех, кто уже в Штатах. «Remote, US», где remote означает «удаленно, но из США». Число на главной от них было красивое, а толку никакого.

Теперь правило одно на весь каталог. Вакансия попадает, если работа в СНГ, Грузии, на Кипре, в Сербии, Черногории или ОАЭ. Или если работодатель прямо обещает релокацию или визу, тогда страна неважна, это и есть способ уехать. Или если это удаленка у русскоязычной компании. Остальное отсекается еще при записи.

Часть ушедших была как раз с западных ATS‑досок. Из трехсот с лишним компаний, которые я забирал через Greenhouse, Ashby и Lever, подавляющее большинство американские. Поэтому вакансий напрямую с сайтов компаний сейчас меньше, чем в прошлый раз: почти 4 900 против 6 500.

Дальше каталог начал расти, но уже другими вакансиями. За следующую неделю я подключил еще больше двухсот компаний из России, СНГ, Сербии и с Кипра. Большинство через ATS с публичной лентой: там новая компания стоит одной строки в конфиге, а под собственный карьерный сайт приходится писать отдельный парсер. Самих ATS‑платформ добавилось девять, и у каждой свои причуды. SmartRecruiters, например, отвечает 200 даже на несуществующую компанию, просто с пустым списком.

Сейчас в каталоге 9 300 с лишним вакансий. Это, кстати, и ответ на вопрос про дублирование hh. Оттуда у меня только крупные работодатели и вакансии стран СНГ, примерно четверть каталога, а остальные три четверти я беру не с hh. Шестнадцати тысяч из прошлой статьи больше нет, и мне так спокойнее.

Поисковики не верят новому домену

Домену два с половиной месяца, и для поисковика это никто. Тут, по‑моему, ничего толком не ускоришь, нужны время, ссылки и люди, которые приходят и не уходят сразу.

Но часть проблем я создал себе сам, и все они про карту сайта. Next.js с generateSitemaps отдает только части карты, /sitemap/0.xml и дальше, а индекс‑файл не создает вовсе, хотя комментарий у меня в коде уверенно утверждал обратное. Первый месяц robots.txt ссылался на /sitemap.xml, которого не существовало. В середине августа я сделал свой индекс на /sitemap-index.xml и поправил robots.txt, а про Search Console забыл. Там карта была отправлена все на тот же /sitemap.xml и до 7 сентября висела со статусом «Не удалось получить». Свой роут на /sitemap.xml Next отдавать отказался, падал на конфликте с метаданными, так что помог только редирект в конфиге. Сразу после него число страниц со статусом «Обнаружена» в Search Console резко подскочило.

Нашел я это не сразу. Когда полез разбираться, почему в индексе так мало страниц, сначала долго искал проблему в скорости сервера: замеры с моего Мака показывали по 17–49 секунд на ответ. Оказалось, это fail2ban на моей же виртуалке притормаживал меня самого после пары десятков запросов подряд, а снаружи сайт все это время отвечал за доли секунды. Так я узнал, что fail2ban у меня работает:)

А 6 сентября, за день до починки, вакансии еще и переехали на новые адреса со слагами вместо id, так что Google пришлось заново обходить весь каталог. Потом десять дней я чистил индекс от страниц, куда Google вообще не стоило пускать.

На 21 сентября в Search Console было 6,2 тысячи страниц в индексе и 19,4 тысячи в статусе «Обнаружена, не проиндексирована». То есть Google про эти страницы знает, просто еще до них не дошел. Кликов из поиска с начала сентября стало примерно втрое больше.

Что должно помочь. У Google есть Indexing API, и официально он работает только для двух типов страниц: вакансий и прямых трансляций. Агрегатору вакансий тут повезло. Новые и закрытые вакансии теперь уходят в Google сразу, не дожидаясь обхода по карте сайта. Квота по умолчанию 200 адресов в сутки, я попросил у них 2 000, пока жду ответа.

В Bing по запросу «агрегатор IT вакансий» и его вариантам Workaem уже на 3–8 месте, рядом с сайтами, которым полтора и два с половиной года. В Google и Яндексе по тем же запросам заметно ниже. Похоже, дело в возрасте домена и ссылках, а не в верстке. И раз поиск ChatGPT во многом опирается на Bing, отсюда, наверное, и тот трафик из ChatGPT, который обогнал Яндекс. В прошлой статье я писал, что не понимаю, читает ли кто‑то мой llms.txt. Понятнее не стало. Но люди из ИИ‑ассистентов приходят регулярно, значит, кто‑то там про сайт знает.

По каким запросам приходят из Google, тоже забавно. Кроме названия сайта там много названий компаний: «такая‑то компания отзывы», «такая‑то вакансии». Человек выбирает, идти ли в компанию, и попадает на ее страницу у меня, где собраны ее вакансии, зарплаты и стек.

Яндекс отклонил все 266 вакансий

Разметку JobPosting для блока вакансий в выдаче Яндекс не использует, туда попадают только через YML‑фид в Вебмастере. Требования к фиду жесткие: обязательны зарплата в рублях, логотип и работодатель, а вакансии собираются в наборы минимум по три. Вилку у меня указывает примерно одна вакансия из семи, а с рублями, логотипом и наборами на весь каталог в фид прошло 266.

Фид я собрал за день. Модерация отклонила все 266 тоже за день, причина одна на всех: «кнопка „Откликнуться“ ведет на другой сайт».

Сначала я подумал, что это замечание и его можно исправить. Потом дошло, что для агрегатора это приговор. Агрегатор по определению ведет на другой сайт, в этом весь его смысл. А в блок вакансий Яндекса, судя по отказу, пускают только тех, у кого отклик происходит на самой площадке, то есть джоб‑борды со своими вакансиями.

Фид я сузил до вакансий, которые работодатели размещают у меня напрямую. Вернусь с ним в Вебмастер, когда таких наберется на полноценные наборы.

Работодатели, курица и яйцо

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

Первая компания разместила у меня вакансию напрямую через два дня после статьи, и я подозреваю, что это не совпадение. Разрывать этот круг, похоже, удобнее всего как раз со стороны статей: многие из читателей Хабра сами кого‑то нанимают или хотя бы влияют на найм в своей команде.

Недавно здесь была статья о том, что найм умирает, и под ней пятьсот комментариев. Мне со стороны каталога кажется, что найм просто забит. На вакансию сотни откликов, заметная часть сгенерирована, а кандидат при этом месяцами ждет ответа. И тут новая площадка обещает работодателю «больше кандидатов». Да у него их и так завал, ему бы лишних отсеять.

Поэтому предлагать работодателю, по‑моему, надо что‑то другое, чем охват. Что у меня есть сейчас. Разместить вакансию бесплатно, до пяти одновременно, на 30 дней, и не перепечатывать ее руками: вставляете текст целиком, как он у вас написан, и поля заполняются сами, а описание остается вашим, я его не переписываю. Подтвердить компанию через корпоративную почту и получить отметку на вакансиях. Gmail и прочие бесплатные ящики не принимаются, домен gmail.com ничего не говорит о компании. И даже с подтвержденной почтой отметку я ставлю руками. Почта говорит только о том, что человек из компании, а живая ли вакансия, из нее не видно. Так что про ханипоты я теперь думаю с обеих сторон.

И третье, пока только гипотеза. Кандидаты у меня видят вилку на фоне рынка и историю вакансии, и мне хочется верить, что откликаются они осознаннее, чем кнопкой в бесконечной ленте. Проверю, когда прямых вакансий станет больше.

Честно, я не знаю наверняка, что заставляет работодателя прийти на новую площадку. А страницы компаний, на которые люди попадают из Google, надеюсь, рано или поздно увидит кто‑то из самих компаний.

Соцсети, в которых нельзя звать на сайт

Раз уж про каналы. Недавно я решил начать вести соцсети и первым делом полез читать законы.

С 1 сентября 2025 года рекламу в Instagram и Threads (принадлежат Meta, которая признана в России экстремистской и запрещена) размещать нельзя, это ч. 10.7 ст. 5 закона «О рекламе», штраф для компании до полумиллиона рублей. При этом свой аккаунт, где компания рассказывает о себе, рекламой не считается, но только пока в постах нет призывов и продвижения. У Telegram и YouTube реклама формально тоже под запретом, но ФАС в марте объявила переходный период без штрафов до конца 2026 года. Совсем спокойно разве что в VK и Дзене.

В итоге я делаю короткие мультики про людей, которые ищут работу в IT. Без ссылок и без «переходи», просто истории: человек на двадцать третьей вкладке с вакансиями или продакт, который ищет работу прямо с пляжа. Иногда что‑то полезное, вроде признаков мертвой вакансии. Музыка в роликах своя, сгенерированная. За чужой трек бренду грозит снятие ролика, а то и иск, и рисковать этим ради фоновой мелодии глупо.

Сработает ли это, не знаю. Первые посты выйдут в начале октября. Если будет что рассказать, расскажу в одной из следующих статьей.

Что люди делают на сайте на самом деле

Последнее, и для меня самое отрезвляющее. На сайте 16 ИИ‑инструментов: разбор резюме, сопроводительные письма, тренировка собеседования, агент, который по ночам ищет вакансии под резюме, и так далее. Я был уверен, что люди придут за ними.

А пришли за поиском. Поиском обычным языком пользуются примерно столько же, сколько всеми остальными ИИ‑инструментами вместе взятыми. Это когда пишешь «удаленка на Go, senior, от 300 000», а модель раскладывает фразу в фильтры ленты. Три бага из четырех в комментариях тоже были про поиск.

То есть люди приходят искать вакансии. Сначала нормальный поиск, а все остальное потом, если вообще. Звучит вроде очевидно, но дошло до меня только по цифрам, и большая часть того, что я делал последние две недели, это поиск, фильтры и новые источники.

Раз уж люди приходят к вакансиям, на самой странице вакансии теперь есть разбор, стоит ли откликаться. Считает его код, а не модель.

Что в итоге

Если бы можно было вернуться в июль, кое‑что я бы сделал иначе.

Написал бы на Хабр сразу, не дожидаясь, пока все доделаю. Я бы до сих пор доделывал.

Проверил бы карту сайта в первый же день, и не в браузере, а так, как ее видит поисковик: открыть ровно тот адрес, что указан в robots.txt и отправлен в панель, и посмотреть код ответа. Первый месяц карты не было вовсе, а в Search Console она висела с ошибкой до сентября.

И не строил бы шестнадцать ИИ‑инструментов до того, как поиск стал нормальным.

А то, что агрегатору в блок вакансий Яндекса дороги нет, лучше узнавать до фида, а не после:)

Спасибо что дочитали! Буду рад любой обратной связи! И как всегда вопрос, на этот раз не про код. Где вы сейчас ищете работу, кроме hh, и спрашиваете ли об этом ИИ?

Проект называется Workaem, живет на workaem.com