Реалізація бота для відстеження звичок у мобільному додатку
Користувач позначив звичку як виконану три рази поспіль, потім забув на тиждень. Серія зламалась — мотивація впала. Головне завдання трекера звичок — не дати цьому статися. Нагадування у правильний момент важливіше, ніж гарний дизайн.
Логіка нагадувань — складніша, ніж просто cron
Наївна реалізація: cron кожен день о 20:00 — «Не забудьте виконати звички». Працює погано: всі сповіщення приходять одночасно, користувачі звикають їх ігнорувати.
Правильно: кожна звичка має свій розклад. «Зарядка» — 7:00, «Читання» — 21:30, «Медитація» — 8:00 та 22:00. Плюс розумне нагадування: якщо до 19:00 звичка не виконана, приходить нагадування (лише якщо користувач увімкнув цю опцію).
Серверний планувальник (Bull Queue) створює завдання на день наперед для кожної звички кожного користувача. При масштабі 10 000 користувачів з 5 звичками — 50 000 завдань на день. Redis справляється; Bull обробляє чергу стабільно.
Часовий пояс користувача зберігається в профілі та враховується при плануванні — всі розрахунки в UTC, відображення у локальному часі.
Мобільний додаток + Telegram-бот
Два канали взаємодії: мобільний додаток (основний інтерфейс) та Telegram-бот (швидка позначка без відкриття додатка).
У Telegram достатньо однієї кнопки: «✅ Виконано» — inline keyboard прямо в сповіщенні. Натиснув — серія зафіксована, додаток оновиться при наступному відкритті.
У мобільному додатку push-сповіщення з actionable notifications: на iOS через UNNotificationAction з ідентифікатором mark_done, на Android через RemoteInput або кнопку дії в NotificationCompat. Користувач позначає виконання прямо зі штори сповіщень, без відкриття додатка.
Обробка дії на iOS:
UNUserNotificationCenter.current().delegate = self
func userNotificationCenter(_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse) async {
if response.actionIdentifier == "mark_done" {
let habitId = response.notification.request.content
.userInfo["habit_id"] as? String
await HabitService.markCompleted(habitId: habitId)
}
}
Серія та гейміфікація
Серія — ключова мотиваційна механіка. Логіка: виконав сьогодні — серія +1, пропустив день — серія скидається (або один «день пробачення» як у Duolingo).
При досягненні рубежів (7 днів, 30 днів, 100 днів) додаток відправляє «вітальне» push зі анімацією на екрані. На Flutter це lottie анімація, запущена при обробці спеціального payload у FCM.
Розробка бота + мобільного додатка трекера звичок — 3–5 тижнів залежно від набору механік гейміфікації.







