Реализация системы квестов/миссий для геймификации мобильного приложения
Квесты — это достижения с нарративом и последовательностью. «Выполни 3 тренировки на этой неделе» — достижение. «Пройди путь новичка: первая тренировка → 3 тренировки за неделю → 7-дневный стрик → первый личный рекорд» — квест с прогрессией. Разница в удержании: квест создаёт сюжет, в котором пользователь — главный герой.
Структура квеста
Квест состоит из шагов (QuestStep), выполняемых последовательно или параллельно. Каждый шаг — это условие над событиями пользователя:
Quest:
id, title, description, icon
type: ENUM(linear, parallel, branching)
is_repeatable: BOOL -- ежедневные/еженедельные миссии
expires_at: nullable TIMESTAMP
xp_reward, badge_id
QuestStep:
id, quest_id, step_order
title, description
trigger_event: VARCHAR -- "workout_completed"
trigger_condition: JSON -- {"count": 3, "period": "week"}
is_optional: BOOL -- для branch-квестов
xp_partial_reward
UserQuestProgress:
user_id, quest_id, current_step, status: ENUM(not_started, in_progress, completed)
started_at, completed_at
step_progress: JSON -- {"step_1": {"completed": true}, "step_2": {"count": 2}}
step_progress как JSON позволяет хранить гетерогенный прогресс по шагам без нормализации. На Postgres JSONB с GIN-индексом — эффективно для поиска.
Типы квестов для разных сценариев
Onboarding квесты — направляют нового пользователя по ключевым шагам продукта. «Настрой профиль → добавь первую запись → пригласи друга → установи цель». Выполняются один раз. Критически важны для activation rate.
Ежедневные/еженедельные миссии (is_repeatable = true) — регулярный повод возвращаться. Каждый понедельник три новые миссии на неделю. Рандомизация из пула, но с учётом поведения пользователя: новичку — простые, ветерану — посложнее. Нужен mission_pool с весами и логикой выбора.
Сюжетные квесты — цепочка из 5–10 шагов, раскрываются постепенно. Следующий шаг виден только после завершения предыдущего. Создаёт долгосрочную цель.
Branch квесты — пользователь выбирает путь на развилке. «Тебе ближе кардио или силовые?» — выбор определяет следующие шаги. Реализуется через QuestStep.is_optional + логика выбора в UserQuestProgress.step_progress.
Обновление прогресса
Event-driven, синхронно с остальной gamification логикой. При получении события workout_completed:
- Начисляем XP пользователю
- Обновляем прогресс достижений
- Обновляем прогресс активных квестов с matching trigger_event
- Проверяем завершение шагов и самого квеста
- Возвращаем клиенту
GamificationUpdate { xp_gained, level_up, achievements_unlocked, quest_step_completed, quest_completed }
Всё в одной транзакции. Клиент получает готовый набор событий для анимации.
UX квестов
Карточка квеста: прогрессбар с шагами, описание текущего шага, награда. Не показывай все шаги сразу для сюжетных квестов — открывай следующий при завершении текущего (mystery мотивирует).
При завершении шага — inline celebration: зелёная галочка с анимацией check, brief haptic, + XP toast. При завершении квеста — full-screen или bottom sheet с анимацией, награда, CTA «Начать следующий квест».
Список квестов разделён на вкладки: «Активные», «Доступные», «Завершённые». Завершённые квесты видимы — пользователь должен видеть свой путь.
Ежедневные миссии как retention механика
Три случайные миссии каждый день, сгенерированные утром (cron job 00:00 по локальному времени пользователя). Простая, средняя и сложная по сложности. Completion rate первых двух — высокий. Третья — стрetch цель, но достижимая.
Серверный push в 10:00 «Новые миссии готовы» — мягкое напоминание. Не каждый день — через день, если пользователь заходил вчера.
Ориентиры по срокам
Базовые onboarding квесты + ежедневные миссии — 3–5 дней (клиент) + 5–7 дней (бэкенд). Полная система с сюжетными квестами, ветвлением, рандомизацией миссий и аналитикой completion rate — 3–4 недели. Стоимость рассчитывается индивидуально.







