Напоминание в Telegram и вход без пароля: как это работает в PULSE
Как PULSE научился напоминать о чек-ине в Telegram и пускать в кабинет по одноразовой ссылке — без единого пароля с телефона.
PULSE — трекер здоровья и энергии для тех, кто ведёт сразу несколько проектов одновременно (подробнее о том, зачем это вообще нужно, мы писали в посте о выгорании основателя). Механика продукта простая: каждый день — быстрый чек-ин, пара показателей, минута времени. Но простая механика не спасает от главной проблемы любого трекера: если про него забыть на неделю, данные становятся бесполезны, а привычка так и не формируется. Нужно было напоминание, которое реально доходит, а не тонет среди push-уведомлений браузера, которые почти никто не разрешает.
Чего не хватало
До этой задачи у PULSE не было способа достучаться до пользователя вне сайта. Email легко пропустить, да и заводить отдельную рассылку ради одного напоминания в день — избыточно. У продукта уже был свой Telegram-бот, но он использовался для диалогового флоу, а не для сервисных сообщений. И самое главное: chat_id пользователей нигде не хранился. Бот в принципе не знал, кому из зарегистрированных на сайте людей он мог бы написать. Получалось, что канал для напоминаний вроде бы уже существовал в виде готового бота, но был бесполезен без связки конкретного пользователя сайта с конкретным чатом в Telegram — эту связку и нужно было построить первой.
Deep-link вместо ручной привязки
Решение — стандартный для Telegram-ботов приём: кнопка «Подключить Telegram» в профиле на сайте открывает бота с параметром, который содержит одноразовый токен привязки. Токен превращается в chat_id, chat_id сохраняется в профиле — и с этого момента бот знает, кому писать. Важное ограничение, которое сознательно соблюли: под эту команду сделали узкое исключение в общем обработчике сообщений бота, не трогая остальной диалоговый флоу. Бот как отвечал на прочие сообщения, так и отвечает — просто научился понимать ещё одну команду.
Вход по одной ссылке — без пароля
Второй кусок задачи — не просто текстовое напоминание, а рабочая ссылка прямо в сообщении. Нажал в Telegram — попал в свой кабинет на сайте, без ввода логина и пароля с телефона. Для этого добавили одноразовые magic-токены и отдельный маршрут для входа по ним: ссылка срабатывает один раз, после использования протухает. Это тот же паттерн passwordless-входа, который снимает частую боль мобильных напоминаний — вводить пароль с телефона по ссылке из мессенджера неудобно, а жертвовать безопасностью ради удобства не хотелось. Поэтому одноразовость — не опция, а обязательное условие: токен либо ещё не использован и открывает кабинет, либо уже использован и не открывает ничего. Разделение на два токена — один для привязки бота, другой для самого входа — тоже осознанное решение: связка аккаунта с чатом и разовый вход в кабинет живут разное время и решают разные задачи, смешивать их в один механизм было бы проще написать, но сложнее было бы потом отлаживать.
Что в итоге поехало в продакшен
Напоминания рассылает отдельный скрипт по расписанию: системный таймер раз в минуту проверяет, кому пора напомнить, и учитывает время, которое пользователь сам выбрал в профиле — там же, в модалке профиля, появился и селектор времени напоминания рядом с кнопкой подключения бота. Перед выкаткой добавили 7 новых тестов на весь этот флоу — итого 26 тестов в проекте, все зелёные. Отдельно прогнали ручной сквозной тест на живом сервере, не по кусочкам, а целиком: привязка бота, выбор времени, срабатывание таймера, переход по magic-ссылке, проверка, что повторно она уже не срабатывает.
Заодно всплыла мелочь в сторону: собственный сканер безопасности портфеля начал ругаться на тестовые токены-литералы в новых тестах, как на утечку секретов. Разобрали и почистили этот false positive — иначе через пару таких случаев появляется соблазн игнорировать предупреждения сканера вообще, а это уже реальный риск.
Что дальше
Код и инфраструктура полностью готовы и включены, но последний шаг — за пользователем: нужно самому подключить Telegram в профиле и на практике убедиться, что напоминание приходит в выбранное время. Это тот случай, когда вся автоматика уже отработана и покрыта тестами, а финальная проверка всё равно держится на живом человеке, а не на CI.
Если тоже ведёте несколько проектов и трудно удерживать привычку регулярно отслеживать своё состояние — PULSE как раз для этого: ежедневный чек-ин, дашборд энергии и теперь напоминание в Telegram, которое не потеряется среди прочих уведомлений.
Рассылка новых статей
Выберите, куда присылать новые статьи и разборы — без спама, только новые материалы.
Чтобы получать статьи на email, сначала привяжите email в личном кабинете.
Чтобы получать статьи в Telegram, войдите через Telegram-кнопку на странице входа.
Получайте новые статьи и разборы
Подпишитесь через email — без спама, только новые материалы.