Клиенты публикуют задачи, специалисты берут их в работу
Двусторонний маркетплейс услуг: клиенты публикуют заказы, специалисты откликаются, обе стороны оставляют отзывы, а продвижение оплачивается через Stripe.
Задача
Клиентам нужен надёжный способ найти специалиста, специалистам — стабильный поток заказов. Платформа должна была строить доверие с обеих сторон и зарабатывать без платы за вход.
Результат
Отдельные кабинеты клиента и специалиста, заказы с категориями и файлами, каталог с поиском, взаимные рейтинги и платное продвижение. Интерфейс на трёх языках.
Ключевые функции
Кабинеты клиента и специалиста
Заказы с файлами
Каталог и поиск специалистов
Взаимные отзывы и рейтинги
Платное продвижение (Stripe)
Загрузка медиа
Три языка
Ролевой доступ
Как это построено
Двусторонний маркетплейс услуг: клиенты публикуют задание, проверенные специалисты отвечают предложениями, а после работы обе стороны оценивают друг друга. Вот решения, которые его сформировали.
3
Роли пользователей
4
Статусы заказа
3
Тарифы подписки
UA·RU·EN
Языки
Две стороны, смоделированные раздельно
Клиент и специалист — не один пользователь с флагом роли. Общих данных у них почти нет: у специалиста профиль, портфолио, подписка и рейтинг; у клиента — заказы. Мы смоделировали их отдельными сущностями за единым уровнем сессионной авторизации.
Права остаются однозначными: эндпоинт принадлежит одной стороне, а не «пользователю, который может быть любым». Публичный профиль тоже отделён от записи аккаунта — чтобы рейтинг и подписка, которые переписываются постоянно, не задевали строку, от которой зависит авторизация.
Цикл маркетплейса
Сделку несут четыре статуса. Клиент публикует OPEN-заказ: категория, город, дедлайн, файлы. Специалисты присылают отклики — предложения на него. Клиент принимает одно, переводя заказ в IN_PROGRESS, далее COMPLETED или CANCELLED.
Отклики — отдельные записи, а не прямое назначение, поэтому клиент сравнивает нескольких специалистов, а не получает одного назначенного.
Обе стороны цикла, как их объясняет сам продукт
Как находят нужного специалиста
Поиск работает по осям «что» и «где». Заказы и профили привязаны к категории и городу, поэтому сантехник из Львова не появится в заказе по Одессе.
Отдельного поискового движка нет. На таком объёме каталога индексированные запросы в PostgreSQL по категории, городу и рейтингу быстрее в разработке и дешевле в эксплуатации, чем добавление Meilisearch, — и держат выдачу согласованной с данными. Тариф подписки учитывается в ранжировании: именно это делает платное продвижение стоящим денег, не давая ему перекрыть релевантность.
Поиск построен на двух осях, которые важны: услуга и город
Удержать сделку на платформе
Самая сложная коммерческая проблема маркетплейса услуг — когда стороны знакомятся один раз, а дальше работают мимо платформы. Контактные данные, отмеченные клиентом как конфиденциальные, получает только тот специалист, которого он выбрал, — а не все, кто откликнулся. Именно это правило сохраняет стимул оставаться в системе после первого сообщения.
Репутация в обе стороны
Отзывы работают в обоих направлениях. Односторонняя оценка защищает только покупателя, но здесь специалист рискует не меньше — неявки, споры об объёме, неоплата. Видимая история с обеих сторон делает платформу безопасной не только чтобы покупать, но и чтобы работать.
Монетизация без платы за доступ
Опубликовать заказ и откликнуться — бесплатно. Специалисты платят за охват: тарифы подписки и платное продвижение через Stripe. Плата за лид облагала бы именно то поведение, которого маркетплейсу нужно больше.
Состояние подписки ведёт Stripe через webhooks — ACTIVE, PAST_DUE, UNPAID, CANCELED — и проверки доступа читают этот живой статус, поэтому неудавшийся платёж сужает охват, а не оставляет платную функцию открытой.
Три тарифа подписки, биллинг через Stripe
Чего требовал продакшен
Уведомления — это события, а не вызовы: каждое действие выпускает событие, а обработчики превращают его в запись в приложении и письмо, поэтому бизнес-логика не умеет отправлять почту. Жалобы проходят настоящую машину состояний с обработкой в админке — без модерации маркетплейс услуг наполняется спорами, которые не может решить. Рейт-лимитинг, HTTP-защита, подтверждение почты и медиа в Cloudinary были с первого деплоя.
Результат
Живой маркетплейс услуг с полным циклом — опубликовать, откликнуться, нанять, выполнить, оценить, оплатить — с монетизацией подписками, модерацией и тремя языками, в продакшене на services-helper.com.