Слогер Создать блог
Разработка

Как не потерять пользователя на подтверждении email: разбор состояния pending_email

Почему бинарный флаг регистрации ломает UX и как простое сохранение промежуточного статуса в конфиг решает проблему.

Пользователь первый раз запустил приложение, ввёл email, получил письмо с подтверждением — и закрыл приложение, не кликнув по ссылке. Через минуту он открывает его снова. Логично ожидать экран «письмо отправлено, проверьте почту». Вместо этого приложение снова просит email. Если ввести его повторно — сервер создаст новый токен, и ссылка в старом письме перестанет работать. Когда человек наконец кликает по ней, получает «invalid link». Это классическая ловушка бинарного состояния.

Как выглядит ловушка

Цикл повторялся без шансов на выход:

  1. Ввод email → отправляется письмо с подтверждением.
  2. Пользователь закрывает приложение до клика.
  3. При следующем запуске снова показывается экран первого запуска.
  4. Повторный ввод email → сервер генерирует новый токен.
  5. Клик по ссылке из старого письма → «invalid link».

Корень проблемы — в том, как приложение хранило состояние регистрации. Оно было бинарным: «не зарегистрирован» или «зарегистрирован». Промежуточного состояния «письмо отправлено, но не подтверждено» просто не существовало. Поэтому любой перезапуск возвращал пользователя к началу.

Если состояние — не ноль и не единица, а несколько шагов с возможностью прерваться, бинарный флаг неизбежно отбрасывает человека назад.

Решение: сохранить pending_email

Фикс простой — в момент успешной отправки письма сохранить адрес в локальный конфиг app_config.json как pending_email. Тогда процесс регистрации получает третье состояние: «отправили, ждём подтверждения».

Важная деталь: сохранять адрес нужно только когда сервер ответил status: ok. Если отправить письмо не удалось, писать pending_email нельзя — пользователь будет вечно ждать письмо, которое не существует.

Сохранение оборачивается в try/except и не влияет на основной поток. Если записать в конфиг не получилось — приложение всё равно выполнило главную цель: отправило письмо. pending_email — это лишь страховка для возобновления.

Возврат к нужному экрану при старте

Теперь при запуске приложение проверяет статус. Если это первый запуск и в конфиге лежит pending_email, пользователь сразу попадает на экран «письмо отправлено, нажмите кнопку после перехода по ссылке». Вводить email заново не нужно.

И главное: экран ожидания не делает никаких обращений к серверу. Он просто берёт адрес из конфига и показывает его пользователю. Никакого нового токена.

Если бы при возобновлении приложение вызвало тот же endpoint регистрации, сервер опять выдал бы свежий токен — и первая ссылка снова умерла бы. Поэтому возобновление — это чисто зеркалирование локального состояния на экран.

Ручная отправка — отдельная история

Для случая, когда пользователь сам хочет переотправить письмо, на экране есть кнопка «Resend email». Это явное действие, поэтому генерация нового токена там допустима.

Ключевое различие: автоматическое возобновление не трогает токен, а ручная отправка обновляет его. Если перепутать эти два пути, вы вернёте ту же ловушку.

Когда очищать pending_email

Как только пользователь прошёл по ссылке и подтвердил email, pending_email нужно удалить. В тот же момент в конфиг записывается флаг email_registered и сам адрес как registered_email.

Так замыкается цикл состояний: не зарегистрирован → отправлено письмо (появляется pending_email) → подтверждено (удаляется pending_email, появляется registered_email). Где бы пользователь ни закрыл приложение, следующий запуск вернёт его на правильный шаг.

Сравнение подходов

СценарийБинарный флагpending_email
Закрыл приложение после отправки письмаПри следующем запуске — экран ввода emailЭкран «проверьте почту»
Повторный ввод emailОбязательный — иначе никакНе нужен
Ссылка из старого письмаПерестаёт работать из-за нового токенаОстаётся валидной
Пользователь кликает по ссылке«Invalid link»Регистрация завершается

Вывод

Изменение небольшое — добавить промежуточное состояние и сохранить его в конфиг. Но оно убирает целый класс разочарований: человеку больше не приходится повторять уже сделанные действия.

Этот паттерн применим к любому прерываемому процессу: загрузка файла, многошаговая форма, оплата. Если процесс может быть прерван, состояние нужно хранить не как «да/нет», а как фазу, которую можно продолжить с того же места.

По материалам: dev. Текст переработан редакцией Слогера.

← На главную

Рекламное место — Конец поста
Реклама · Слогер

Комментарии (1)

Войдите, чтобы комментировать.

Jorge Mate 10.09.2026 06:39 ▲ 0
Отличная статья! Очень актуальная и болезненная тема для многих продуктов — потеря пользователя на этапе подтверждения email. Разбор проблемы бинарного флага регистрации и того, как промежуточный статус pending_email ломает UX, сделан очень грамотно и по делу. Особенно ценно, что вы предлагаете конкретное и элегантное решение — простое сохранение промежуточного статуса в конфигурации. Такие практические инсайты из реальной разработки — на вес золота. Спасибо, что делитесь опытом и помогаете делать продукты удобнее! 👏💻📧
Карьера

Как зарабатывать на переводе и локализации без диплома: разбор воркфлоу на бесплатных инструментах

Процесс, который позволяет брать $340 за один заказ и превращать разовые сделки в ежемесячные ретейнеры — без дорогого софта и профильного образования.

Слогер 28.09.2026 ▲ 0
Образование

Как проверить старые соцсети перед визой и учёбой за рубежом: 6 категорий и порядок действий

Аккаунты — единственный пункт в списке документов, который нельзя восстановить задним числом. Разбираем, что искать в собственных постах и почему удаление поста — лишь первый шаг.

Слогер 28.09.2026 ▲ 0
Карьера

Чистка цифрового следа перед собеседованием: график на 6 недель и что уже поздно начинать

Рекрутеры чаще гуглят кандидата не на этапе отклика, а когда он уже в шортлисте. Отсюда и запас времени, и жёсткий дедлайн — разбираем обратный отсчёт по неделям.

Слогер 28.09.2026 ▲ 0
Образование

Как учиться сложным вещам: система, где знания проверяются действием, а не перечитыванием

Пять приёмов из практики преподавания и self-learning в кибербезопасности: карта вместо первой страницы, worked examples, извлечение из памяти, интервалы и цикл «сломал — починил — объяснил».

Слогер 28.09.2026 ▲ 0
Fluxs lenta
Реклама · fluxs.ru
Карьера

Как подготовиться к собеседованию по кодингу: 7 книг и порядок, в котором их читать

Провал на интервью редко связан с тем, что вы не умеете программировать. Чаще не хватает системы, словаря для разговора о дизайне и практики объяснять решение вслух — и всё это можно закрыть книгами.

Слогер 27.09.2026 ▲ 0
Карьера

Как откликаться на вакансии без диплома: разбор фильтра, который отсеивает за две минуты

Junior-вакансия с Python, SQL и автоматизацией, три документа от кандидата — и отказ через 120 секунд после отправки. Разбираем, что здесь происходит и как проходить такие воронки, если диплома нет.

Слогер 27.09.2026 ▲ 0
Fluxs lenta
Реклама · fluxs.ru
Карьера

Почему резюме не работает: как доказать навыки живыми проектами

Разбор подхода proof-of-work: зачем показывать работающий продукт и видео-демо вместо строчки «разрабатывал сервис», как это обходит автоматические фильтры и что подготовить, чтобы запрос на интервью не ушёл в пустоту.

Слогер 26.09.2026 ▲ 0
Fluxs lenta
Реклама · fluxs.ru