Интернет-магазин ортодонтических материалов: витрина на Next.js, админка с аналитикой продаж и API на NestJS, сделанные для профессионального покупателя, который точно знает, что ему нужно. Вот решения, которые его сформировали.
Каталог для тех, кто знает артикул
Покупатель здесь — врач-ортодонт, а не случайный посетитель. Категории и подкатегории несут производителя и страну происхождения, потому что практика покупает конкретный брекет конкретного производителя, и похожее — это не замена.
Поэтому каталог построен вокруг этих осей, а не вокруг витринного мерчандайзинга, а поиск существует, чтобы подтвердить уже сделанный выбор.
Вход по коду, а не по паролю
Клиенты входят одноразовым кодом из SMS или почты, с опцией пароля для тех, кто его хочет. В клинике закупает тот, кто сегодня за стойкой; общий пароль через неделю оказался бы на бумажке возле монитора.
Отправитель SMS спрятан за интерфейсом с реализациями для консоли, HTTP-провайдера и Twilio, так что в разработке работает тот же код, не тратя денег на сообщения.
Четыре состояния — и это намеренно
Заказ бывает новым, в обработке, выполненным или отменённым. Магазин такого размера ведут люди, которые и так знают клиента; восемь состояний дали бы панель, полную строк, которые никто не двигает.
Кешбэк начисляется, когда заказ становится выполненным, и меняется атомарно в записи клиента, так что баланс не поедет, если два заказа закроются одновременно.
Скидки, которые выдерживают реальность
Скидки бывают в процентах или фиксированные, а промокоды — отдельная сущность со своими правилами, потому что сезонная акция и оговорённая цена для постоянной клиники — разные вещи, заканчивающиеся в разное время.
Держать их отдельно означает, что завершение акции никогда не заденет условий, которые пообещали давнему клиенту.
Админка, которая отвечает на вопросы
Бэкофис — отдельное React-приложение с графиками продаж, так что владелец видит, что движется, ничего не выгружая. API описано в Swagger, под рейт-лимитом и с разделённой аутентификацией клиента и администратора, так что взломанная клиентская сессия не доберётся до данных самого магазина.
Результат
Работающий магазин для профессионального рынка — каталог, корзина, заказы, кешбэк и промокоды, с админкой, которую владелец ведёт сам, и документированным API под всем этим.