К содержанию
Работа

FitPlay (Instinct Fitness) — персонализированные тренировки и питание

FitPlay — цифровой фитнес-сервис, который собирал пользователю персональную программу тренировок и вёл её вместе с ежедневным планом питания. Человек проходил анкету — пол, рост, вес, цель, ограничения — и получал последовательность занятий с календарём, рационом и отметками выполнения. Продукт начинался под брендом Instinct Fitness и позже выходил как FitPlay: это последовательные версии одного сервиса с общим бэкендом и мобильным сценарием. Персонализация здесь была не работой тренера в личной переписке, а воспроизводимым применением экспертных правил к анкете.

Главный экран проекта Нажмите, чтобы рассмотреть
FitPlay (Instinct Fitness) — персонализированные тренировки и питание 01 / 03
FitPlay (Instinct Fitness) — персонализированные тренировки и питание — Главный экран проекта
Клиент
OneCore Media
Индустрия
Wellness и персональное здоровье
Срок
8 месяцев
Команда
6 человек

Задача

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

Ручной подбор проблему снимает, но не масштабируется: на каждого нового пользователя уходит время специалиста. Нужно было развести две вещи: методику, которую пишут эксперты, и её применение к конкретной анкете, которое должна выполнять программа. При этом сервис не медицинский. Заболевания и ограничения в анкете — признаки для фильтрации контента и предупреждений, а не диагноз. Ситуация, не покрытая правилами, не должна «дорешиваться» автоматом.

Решение

Подбор в шесть шагов. Анкета проверялась на полноту и допустимость значений; применялись жёсткие ограничения и исключались несовместимые программы; цель сопоставлялась с направлением курса; выбирались уровень нагрузки и стартовая точка; формировалась последовательность занятий и связанный с ней план питания. Шестым шагом сохранялась версия выданной рекомендации.

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

Правила живут отдельно от приложения. Упражнения, курсы, уровни нагрузки, совместимость и противопоказания хранились в контентном модуле, а мобильные клиенты получали готовую персональную выдачу через API на Golang-бэкенде. Специалист обновлял методику централизованно, без релиза iOS и Android. Это же решение дало объяснимость: пользователь видел, какое направление ему предложено, а администратор мог восстановить, какие ответы анкеты привели к выбору или исключению курса.

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

Сурдоперевод внутри общей системы. Курсы Home Workout и TRX имели версии с сурдопереводом. Технически это признак доступности у курса, связь обычной и адаптированной версии, контроль наличия видео и участие адаптированного варианта в автоматической рекомендации наравне с основным. Пользователь выбирал подходящий формат внутри того же курса.

Питание, привязанное к профилю. Пять приёмов пищи в день: блюдо, рекомендуемая порция, вес ингредиентов, способ приготовления. Рацион учитывал ограничения анкеты и входил в программу вместе с занятиями.

Два платёжных канала — одна модель доступа. На сайте платежи шли через Robokassa, в приложениях — через App Store и Google Play. Бэкенд сводил статусы разных каналов к единому доступу, чтобы человек не купил один и тот же курс дважды при переходе с сайта в приложение. Фоновые задачи обрабатывали окончание подписки, повторную проверку платежа и восстановление покупки, а идемпотентная обработка событий защищала от двойной активации при повторной доставке платёжного уведомления.

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

Результат

Разрозненные видеотренировки сложились в управляемую программу. Пользователь получал маршрут занятий, дневной рацион, календарь и напоминания, видел прогресс и мог менять параметры, не теряя пройденного. Эксперты работали с методикой: правила совместимости, курсы, рецепты и вопросы анкеты настраивались в контентном модуле, и один и тот же аппарат применялся ко всем новым пользователям. Служба поддержки видела статус аккаунта и оплаты, не имея прав менять экспертные правила. Аудитория с нарушением слуха получила те же курсы, что и все, в адаптированном формате.

8 месяцев длительность проекта
6 человек команда
6 шагов этапов автоматического подбора программы
5 приёмов пищи в дневном плане питания
Первый разговор — бесплатно

Расскажите, что хотите изменить

За одну встречу уточним задачу и предложим следующий шаг.

Что будет на встрече
  1. 01 Опишите задачу своими словами
  2. 02 Уточним цель и ограничения
  3. 03 Предложим решение и следующий шаг
длительность 45–60 мин