Реализация бота для трекинга привычек в мобильном приложении
Пользователь отметил выполнение привычки три раза подряд, потом забыл на неделю. Streak сломался — мотивация упала. Главная задача трекера привычек — не дать этому случиться. Напоминание в нужный момент важнее красивого дизайна.
Логика напоминаний — сложнее, чем просто 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 прямо в уведомлении. Нажал — streak зафиксирован, приложение обновится при следующем открытии.
В мобильном приложении push-уведомления с actionable notifications: на iOS через UNNotificationAction с идентификатором mark_done, на Android через RemoteInput или просто action button в NotificationCompat. Пользователь отмечает выполнение прямо из шторки уведомлений, не открывая приложение.
Обработка action на 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)
}
}
Streak и геймификация
Streak — ключевая мотивационная механика. Логика: выполнил сегодня — streak +1, пропустил день — streak сбрасывается (или даётся один «grace day» как в Duolingo).
При достижении вех (7 дней, 30 дней, 100 дней) приложение отправляет «поздравительный» push с анимацией на экране. На Flutter это lottie анимация, запускаемая при обработке специального payload в FCM.
Разработка бота + мобильного приложения трекера привычек — 3–5 недель в зависимости от набора механик геймификации.







