{"id":14262,"url":"\/distributions\/14262\/click?bit=1&hash=8ff33b918bfe3f5206b0198c93dd25bdafcdc76b2eaa61d9664863bd76247e56","title":"\u041f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u0435 \u041c\u043e\u0441\u043a\u0432\u0435 \u0438\u043d\u043d\u043e\u0432\u0430\u0446\u0438\u044e \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0434\u043e 1,5 \u043c\u043b\u043d \u0440\u0443\u0431\u043b\u0435\u0439","buttonText":"\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435","imageUuid":"726c984a-5b07-5c75-81f7-6664571134e6"}

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

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

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

Про бизнес

Микрофон берет основательница сервиса 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.

Разработка «без кода» (т. н. 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. Входящие сообщения, чаты и пользователи.
Так выглядит база данных в Directual

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Что дальше?

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

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

Заключение

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

0
12 комментариев
Написать комментарий...
Eduard Mirchev

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

Ответить
Развернуть ветку
Pavel Ershov
Автор

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

Ответить
Развернуть ветку
Аккаунт удален

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

Ответить
Развернуть ветку
Adam V

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

Ответить
Развернуть ветку
Платон Щукин

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

Ответить
Развернуть ветку
Алексей Степанов

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

Ответить
Развернуть ветку
Максим Лунин

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

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

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

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

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

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

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

Ответить
Развернуть ветку
Grigoriy Malyshev

без кодинга и без хттпс

Ответить
Развернуть ветку
Pavel Ershov
Автор

Почему без хттпс? Все есть

Ответить
Развернуть ветку
Grigoriy Malyshev

да, сорен, редиректа нет)

Ответить
Развернуть ветку
Grigoriy Malyshev

круто, конечно, как это все в конечном счете работает, но глядя на все эти гигантические блок-схемы хочется открыть ламповый vscode

Ответить
Развернуть ветку
Pavel Ershov
Автор

А база? Деплой? Масштабирование? Тут вы одним vscode не отделаетесь)

Ответить
Развернуть ветку
9 комментариев
Раскрывать всегда