Всем привет! 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