Vitrina 22|52 — платформа для поиска работы, разработанная без кода

Vitrina 22|52 помогает найти работу или сотрудников в сферах Fashion, Beauty, Media и HoReCa. В первой части статьи мы расскажем о бизнесе — как пришла идея, как проверяли гипотезы, как и куда развивается рынок HR в указанных областях.

Вторая часть будет про детали технической реализации. Проект был разработан за месяц, силами одного человека, на no-code платформе Directual.

Vitrina 22|52 — платформа для поиска работы, разработанная без кода

Про бизнес

Микрофон берет основательница сервиса Vitrina 22|52 Настя Юхтмахер.

Vitrina 22|52 — платформа для поиска работы, разработанная без кода

Идея создания пришла ко мне весной прошлого года в самый разгар пандемии, когда стали закрываться рестораны, магазины, салоны и фитнес-клубы. Для рынка это означало наплыв людей, которые будут искать работу. А кроме устаревших карьерных сайтов и разношёрстных Telegram-каналов, больше, особо, искать работу негде.

Также на рынке начался тренд на удаленную работу. Это особенно актуально для направлений SMM, контент, дизайн, креатив, digital-реклама и т. д. Плюс, уже довольно давно весь бизнес fashion- и beauty-индустрий перешёл в Instagram, так же, как и «employer branding» большинства компаний. Да что уж там, все сидят в Instagram, ведь это самый главный time-killer последних лет.

Эти предпосылки подтолкнули меня запустить карьерную платформу на базе Instagram, которую можно скроллить, листать, переходить на странички брендов, ресторанов, салонов и разных компаний, а еще находить их основателей. Так идея стала приобретать какую-то форму, а точнее аккаунт в Instagram. Мы долго думали над названием, но потом абсолютно случайно появилось слово, объединяющее все эти сферы — «витрина». Дальше мы захотели придать ему карьерный смысл и отразить нашу целевую аудиторию. 22 — это график работы линейного персонала: официанты, продавцы, стилисты (2 дня через 2). 52 — это стандартный график для офисных сотрудников, с понедельника по пятницу. Получилось — «Витрина 2252».

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

Сейчас у Instagram-аккаунта уже 19 тысяч тысяч подписчиков, плюс 10 тысяч в Telegram-канале. Про нас стали рассказывать люди в своих сторис и отмечать в постах, заработало сарафанное радио. Через несколько месяцев к нам стали обращаться работодатели за размещением платных вакансий. Почти каждый день мы слышали, что люди выходят на работу благодаря нашим постам.

Например, один начинающий fashion-бренд заплатил нам за три вакансии 7500 ₽ и взял себе 3-х сотрудников. Так мы проверили базовую гипотезу и поняли, что в этой нише есть место маркетплейсу. С одной стороны, мы научились работать с нашей аудиторией (девушки, 20–27), с другой — подтвердили платежеспособный спрос от работодателей.

Мы тогда поняли, что наступал новый этап — пора было создавать цифровой продукт для этой ниши. Мы отмели сложные и дорогие варианты создания веб-портала или полноценного мобильного приложения типа «Авито». Тем более, эти инструменты уже немного устарели. Нам пришла идея, что кандидаты должны искать работу, не выходя из мессенджеров, в чат-боте!

И оказалось, что такие системы можно делать на так называемых no-code платформах. Это оказалось достаточно быстро и, что главное, гибко. Но технической части будет чуть ниже.

Монетизация «Витрины» состоит из 3 направлений: платный постинг вакансий в боте (от 3000 ₽ за вакансию), промо брендов и дополнительный рекрутинговый сервис. По-сути, мы закрываем массовый подбор кандидатов из сферы услуг, точечный подбор в креатив и офис, а также подбор команд при открытии ресторанов, магазинов и салонов.

Многие мои друзья даже не знают, что я занимаюсь этим проектом параллельно моему основному бизнесу — поиску топ-менеджеров. У нас пока не было ни пресс-релиза, ни масштабных рекламных кампаний. Мы запустили проект на своей аудитории в пилотном режиме с 16 февраля. За 10 дней набрали две тысячи пользователей. Из них 70% заполнило профили и загрузили резюме, 40% получили релевантные вакансии, из них половина отправили отклики.

Работодатели разместили 12 новых платных вакансий, остальные перекочевали из нашего Instagram-аккаунта. Мы планируем привлечь в сервис как минимум 30 тысяч кандидатов и 100 работодателей за ближайшие полгода. Stay tuned!

Про техническую реализацию

Микрофон забирает Павел Ершов, один из основателей платформы Directual.

Vitrina 22|52 — платформа для поиска работы, разработанная без кода

Разработка «без кода» (т. н. no-code, low-code, визуальная разработка) — одна из самых горячих тем в последнее время. Причины этого тренда понятны. Программистов с прямыми руками на всех не хватает, сроки горят, и продумать все заранее нельзя, нужна гибкость. Большинство no-code инструментов (Bubble, Integromat, Airtable) достаточно сильно ограничены по функциональности и, особенно, по нагрузке. Для MVP, пожалуй, подойдет, а дальше придется переписывать. Тем более, «Витрина» — проект в перспективе достаточно большой.

Сегодня это тысячи а, в перспективе, и десятки тысяч пользователей, которые активно взаимодействуют с чат-ботом и веб-приложением. Например, популярная no-code база данных Airtable тут сразу отпадает, там ограничение на всю базу — 50k записей. Неплохой workflow-движок Integromat под такой нагрузкой будет тупить и стоить несколько тысяч $ в месяц. Тем не менее, с задачей хорошо справляется наша low-code платформа Directual (выставлялись на Трибуне в прошлом году).

Дальше я расскажу, из чего технически состоит приложение Vitrina и как это делалось на Directual. Для общего понимания возможностей платформы можно посмотреть двухминутное видео:

Переходим к деталям. Опишу основные этапы разработки и«узкие места», с которыми пришлось немного повозиться.

Архитектура базы данных

Структура базы данных несложная. Посмотрим на ключевые таблицы (в терминологии Directual — структуры):

  • Пользователи. Все вместе, в зависимости от того, что указано в поле «role», они участвуют в тех или иных процессах. Роли три: админ, работодатель и кандидат;
  • Справочники. Города и функции (поделены на две группы — для вакансий по графику 2/2 и для вакансий по графику 5/2);
  • Вакансии, отклики, вопросы;
  • Структуры Telegram. Входящие сообщения, чаты и пользователи.
Vitrina 22|52 — платформа для поиска работы, разработанная без кода
Так выглядит база данных в Directual
Так выглядит база данных в Directual

Телеграм-бот

Регистрацию пользователей совмещаем с подтверждением телефона следующим образом. Человек пишет в чат-бота. Если мы не находим его среди пользователей приложения, просим прислать контакт (это фича Телеграма — запрос контакта). Сохраняем номер телефона, создаем пользователя и просим написать боту пароль для авторизации в веб-части. Пароль на лету шифруем.

По умолчанию в платформе стоит шифрование md5, но лучше выбрать в настройках что-то посерьезнее, например bcrypt. Когда пользователь авторизовался, он может общаться с ботом и входить в личный кабинет в вебе (о веб-части расскажу ниже).

Сценарий для проверки аутентификации (1-й шаг) и приоритетного разбора системных команд боту
Сценарий для проверки аутентификации (1-й шаг) и приоритетного разбора системных команд боту

Когда объект сообщения попадает в сценарий-роутер, мы проверяем значение поля context, в котором мы храним текущий момент диалога (иногда используем несколько полей для хранения контекста диалога, если есть хитрые разветвления).

Сценарий-роутер
Сценарий-роутер

Роутер вызывает тот или иной сценарий, в зависимости от контекста. Например, ниже скриншот сценария для создания пользователя в таблице и сохранение зашифрованного пароля на нем (вторая развилка на скриншоте роутера выше).

Vitrina 22|52 — платформа для поиска работы, разработанная без кода

Стоит отдельно отметить, что сценарии Directual никаким образом не заточены под создание ботов. По большому счету, это просто обработка объектов. А эти объекты могут быть сообщениями от тележки, от датчика на кухне или события с сайта — это не важно. Дальше, например, мы будем обрабатывать сообщения от API Альфа-банка, чтобы изменять статус вакансий на «оплачено» и публиковать их.

Веб-интерфейс для личного кабинета

Чат-бот отлично справляется с простыми сценариями взаимодействия, с нотификациями (например, «Вам подобрана новая вакансия! Откликаемся? — Да/Нет»). Но нужен еще и нормальный личный кабинет, где можно отредактировать профиль, посмотреть все подходящие вакансии или кандидатов. Эта часть тоже делается на платформе. На конструкторе веб-портала — это свежий функционал Directual, запущенный только в конце прошлого года. Эту часть платформы, кстати, мы выложили в open source.

Ключевая идея создания фронта в том, что любой интерфейс работает через API-точки доступа до данных (т. н. эндпоинты). В них мы настраиваем какие пользователи имеют доступ до тех или иных данных, на чтение и на запись. Этот API-интерфейс уже отдает или забирает данные — не важно, создан фронт-энд на внутреннем конструкторе, или любом другом решении, в том числе разработан традиционно. Давайте посмотрим как это работает.

Страницы приложения, сделанные на конструкторе Directual
Страницы приложения, сделанные на конструкторе Directual

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

Страница “Профиль кандидата” и ее настройка в платформе (справа)
Страница “Профиль кандидата” и ее настройка в платформе (справа)

На странице «Профиль кандидата» мы используем компонент формы, с опцией редактирования объекта. В данном случае, объект — сам пользователь. API-эндпоинт для этой страницы выглядит следующим образом:

Конфигурирование API-точки доступа
Конфигурирование API-точки доступа

Ключевые моменты на скрине выше следующие:

  • Точка доступа открыта только для авторизованных пользователей (условие на сессию — id is not null);
  • Мы в явном виде указали поля, доступные на чтение/запись (так как мы хотим в нашей форме редактировать объект);
  • В фильтре стоит условие id=={{id}}. Это значит, что пользователь через этот API сможет получить только один объект, у которого id совпадает с id пользователя. То есть, он получит самого себя! Часто еще в фильтрах указывают поле, отвечающее за статус объекта (например, «новый”, «оплаченный», “в архиве» и т. д.).

По похожему принципу можем настроить отображение пачки объектов в компоненте карточек. Более того, на карточках можно настроить «действия» — это, например, кнопки одобрения или отклонения отклика на вакансию.

Отображение объектов в виде карточек. Фото, кстати, мы затягиваем из Телеграма.
Отображение объектов в виде карточек. Фото, кстати, мы затягиваем из Телеграма.

Еще немного сценариев. Подбор вакансий, пуши и оплата

Вернемся от веб-страниц к сценариям. Нам нужно регулярно мэтчить кандидатов с вакансиями и отправлять пуши в бота. Сценарий для подбора работает по расписанию, раз в час в дневное время, и ищет пересечения по функциям, городам и зарплате.

Сценарий подбора вакансий
Сценарий подбора вакансий

Тут мы столкнулись с необходимостью часть сценария сделать на JavaScript — пересечение двух массивов с функциями (на скрине выше это шаг JS SDK). В документации по платформе есть шаблоны под такие случаи, и код можно взять из такой шпаргалки.

Следующий неочевидный момент был в оповещении пользователей. Мы сделали сценарий так, что при распределении новой вакансии (на самом деле создание«отклика» со статусом suggested) пользователю приходит push с возможностью откликнуться прямо из бота. Но сообщения приходили все пачкой в перемешку — не понятно на какую вакансию в итоге откликается пользователь. А хотелось бы строго по очереди.

Для таких целей есть тонкие настройки сценариев, такие как режим однопоточности (обработка только одного объекта в рамках всего сценария, остальные ждут у входа) или lock объекта по какому-то ключу. В нашем случае мы включили однопоточность, и все заработало корректно.

Оплату делали через Альфа-банк. В момент формирования вакансии запускается сценарий, который запрашивает API банка и получает ответ в JSON-формате, специальный шаг JSON парсит его и сохраняет ссылку на оплату.

Vitrina 22|52 — платформа для поиска работы, разработанная без кода

Сообщения из Альфы приходят в платформу на Webhook, и мы его разбираем отдельным сценарием. Если оплата неудачная, генерируем новую ссылку и пушим пользователя опять. Если успешная, разбираемся что за тариф был оплачен и публикуем вакансию. Дальше она будет распределяться подходящим кандидатам.

Что дальше?

Как и любой стартап, Vitrina 22|52 будет развиваться непредсказуемо. Многое из того, что основатели придумают, уже можно реализовать на Directual. Многое — можно будет. Например, в первый же день запуска появилось два новых блока: массовые опросы пользователей и возможность админам быстро отвечать на вопросы саппорта из бота. В этот же день и запилили эти фичи.

P.S. Сегодня Directual вышел на Product Hunt. Будем признательны за апвоуты и комментарии!

Заключение

Мы живем в удивительное время, когда такие качества как скорость и гибкость нельзя переоценить. Как в построении карьеры, так и в создании цифровых продуктов. Vitrina 22|52 отражает это в полной мере.

1515
12 комментариев

вот так ноу-код. Зато много блок-съема-код

3
Ответить

на таком ноу-коде можно космолёт собрать)

3
Ответить

Комментарий недоступен

Ответить

Отличный кейс. Побольше бы таких кейсов!

2
Ответить

Что там стоит Вашими руками запилить MVP на это Вашем ноу-коде? С нищебродами работаете?

1
Ответить

Даже не отвечают)

1
Ответить

Все это круто выглядит, если чисто технически. Но вот канал в Telegram (и аккаунт в Instagram тоже) теперь превратился просто в источник для перехода в бот. Ни на что нельзя откликнуться, не используя бота. Предугадываю большой отток читателей. И в Telegram, и в Instagram. Обычно так не делают непосредственно на основном проекте. Именно по причине, что читатели не могут взаимодействовать только с ботом. Им нужно чуть больше свободы. Самим выбрать, куда писать. Самим подбирать вакансии. 

Отдельно боты делают для каких-то конкретных задач. Или бот + канал. Но так чтобы бот внутри основного канала - очень рискованно. 

Общая концепция проекта приятная. Все стильно, гармонично. Но вот эта штука с ботом... Вряд ли удачная, если честно. 

Что касается статьи - статья не про Vitrina, а про Directual, что немного странно. Про проект почти ничего, зато про бота - все. Бот это не весь проект, а только отдельная разработка. Лучше было бы рассказать, как привлекали первых читателей, где покупали рекламу, как продвигались. С ноля собрать 10 000 читателей без рекламы в HR-проекте - это почти нереально. 

Это так, из того - что бросилось в глаза) За проектом поглядываю) Но как только появился бот и исчезли контакты для откликов - отписался. Ибо смысла не вижу. Думаю, также рассуждают многие коллеги по медиа (и сами фрилансеры). 

Но в любом случае желаю удачи. 

P.s. Вариант совместных текстов для обоюдного пиара двух проектов сразу - задумка интересная. Но переборщили со вторым) 

1
Ответить