Реалізація системи квестів/місій для геймифікації мобільного додатку
Квести — це досягнення з наративом і послідовністю. «Виконайте 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 -- для квестів з розгалуженням
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 дозволяє зберігати різнорідний прогрес кроків без нормалізації. На PostgreSQL JSONB з GIN-індексацією ефективна для запитів.
Типи квестів для різних сценаріїв
Квести onboarding направляють нових користувачів через ключові функції продукту. «Налаштуйте профіль → додайте першу запис → запросіть друга → встановіть ціль». Виконуються один раз. Критичні для показника активації.
Щоденні/щотижневі місії (is_repeatable = true) дають регулярні причини повернутися. Три нові місії кожного понеділка на тиждень. Випадковий вибір з пулу, але зважений за поведінкою користувача: просто для новачків, складніше для ветеранів. Потребує mission_pool з вагами та логікою вибору.
Сюжетні квести утворюють ланцюг з 5–10 кроків, що розкриваються поступово. Наступний крок видимий лише після завершення попереднього. Створює довгострокову мету.
Квести з розгалуженням дозволяють користувачам обрати шлях на роздоріжжі. «Вам ближче кардіо чи силові тренування?» — вибір визначає подальші кроки. Реалізується через QuestStep.is_optional + логіка вибору в UserQuestProgress.step_progress.
Оновлення прогресу
Event-driven, синхронно з іншою логікою геймифікації. При отриманні події workout_completed:
- Нараховуємо XP користувачу
- Оновлюємо прогрес досягнень
- Оновлюємо прогрес активних квестів з відповідним trigger_event
- Перевіряємо завершення кроків і самого квеста
- Повертаємо клієнту
GamificationUpdate { xp_gained, level_up, achievements_unlocked, quest_step_completed, quest_completed }
Усе в одній транзакції. Клієнт отримує готовий набір подій для анімації.
UX квестів
Карта квеста: смужка прогресу з кроками, опис поточного кроку, нагорода. Не показуйте всі кроки відразу для сюжетних квестів — відкривайте наступний при завершенні поточного (таємниця мотивує).
При завершенні кроку — inline святкування: зелена галочка з анімацією, короткий haptic, + XP toast. При завершенні квеста — повноекранне або bottom sheet з анімацією, нагорода, CTA «Розпочати наступний квест».
Список квестів розділений на вкладки: «Активні», «Доступні», «Завершені». Показуйте завершені квести — користувачі повинні бачити свій прогрес.
Щоденні місії як механіка утримання
Три випадкові місії щодня, згенеровані вранці (cron job о 00:00 за місцевим часом користувача). Легка, середня та важка складність. Рівень завершення перших двох — високий. Третя — stretch goal, але досяжна.
Server push о 10:00 «Нові місії готові» — м'яке нагадування. Не кожен день — через день, якщо користувач був активний вчора.
Часові оцінки
Базові квести onboarding + щоденні місії — 3–5 днів (клієнт) + 5–7 днів (backend). Повна система з сюжетними квестами, розгалуженням, рандомізацією місій та аналітикою рівня завершення — 3–4 тижні. Ціна розраховується індивідуально.







