Почему проблемы SMS‑верификации стали нормой
SMS с одноразовым кодом (OTP) выглядит как простой канал: отправили — пользователь ввёл. Но в реальности это цепочка: ваш сервис → SMS‑провайдер → межоператорские маршруты → SMS‑центр оператора (SMSC) → телефон → экран ввода/приложение. Сбой на любом участке превращается в «sms otp не пришёл», «пришёл поздно» или «код не подхватился автоматически».
Параллельно операторы усилили контроль A2P‑трафика (application‑to‑person): фильтрация, требования к регистрации отправителей, реакция на жалобы и подозрительную активность. Поэтому доставка sms для OTP может ухудшаться даже без изменений со стороны продукта.
Как выглядит «поломка» OTP для пользователя
- Код не приходит вообще (тайм‑аут).
- Код приходит через несколько минут, когда сессия уже истекла.
- Приходит сразу несколько кодов — и пользователь вводит «не тот».
- SMS доставлена, но попадает в фильтры/спам на телефоне.
- Автосчитывание кода в приложении не срабатывает.
Сетевые причины: операторы, фильтры, маршруты
1) Фильтрация и блокировка A2P
Операторы используют автоматические фильтры: учитывают репутацию номера и бренда, объём и частоту отправок, паттерны текста, жалобы абонентов. Итог — задержки, «undelivered» или «silent filtering», когда пользователю кажется, что сообщение даже не отправляли.
2) Неподходящий тип отправителя
В зависимости от страны и операторов по‑разному работают long code, short code, toll‑free и alphanumeric Sender ID. То, что стабильно в одном рынке, может регулярно фильтроваться в другом. Неправильный выбор проявляется как нестабильность у части операторов или в роуминге.
3) Очереди в SMSC и перегрузка
SMS — store‑and‑forward сервис. При пиковых нагрузках и авариях сообщения становятся в очередь и приходят с задержкой. Это провоцирует повторные запросы «Отправить ещё раз», увеличивая трафик и усугубляя задержки.
4) Роуминг, перенос номера (MNP) и сложная маршрутизация
В роуминге или после переноса номера маршруты могут меняться, а международный A2P часто фильтруется жёстче. Поэтому один и тот же OTP может «гулять» по времени доставки в зависимости от страны пребывания и оператора‑приёмника.
5) Ошибки в номере и формат E.164
Неполный код страны, лишние символы, «несуществующий абонент» — типовые причины недоставки. Это настолько частый класс проблем, что многие провайдеры отдельно выделяют его в troubleshooting.
6) VoIP/виртуальные номера
Для снижения фрода некоторые сервисы ограничивают OTP на VoIP‑номера или требуют альтернативный канал. Отсюда ситуация «на часть номеров не приходит», хотя доставка в целом работает. Практики фильтрации VoIP и ограничения по верификации описаны у провайдеров.
Продуктовые причины: UX и логика, которые ломают доставку
1) Плохой retry‑поток и «шторм» запросов
Если кнопка «Отправить ещё раз» доступна сразу, пользователь генерирует несколько параллельных отправок. Коды приходят в разное время, и человек вводит старый. Рекомендации обычно включают лимиты и экспоненциальный backoff.
2) Слишком короткий TTL
Если код живёт 60 секунд, а часть сетей приносит SMS за 90–180 секунд, вы получаете «ложные» ошибки. Практичнее: отделить TTL от UI‑таймера, дать реалистичное ожидание и повтор только после паузы.
3) Текст сообщения: длина, юникод, сегментация
- Ссылки и «маркерные» слова могут повышать риск фильтрации.
- Кириллица/эмодзи переводят сообщение в UCS‑2 и уменьшают лимит символов, что может разбить SMS на сегменты.
- Код лучше размещать в начале и делать максимально «видимым».
4) Непривязанный к сессии код
Если проверяется «последний код на номер», а не «код на попытку», при повторных отправках легко получить путаницу. Надёжнее привязывать OTP к попытке/транзакции и корректно закрывать предыдущие попытки.
5) Автосчитывание OTP: требования платформы
На Android автоматический захват (например, SMS Retriever API) требует правильного формата и специального хеша приложения. Если бекенд не добавляет хеш или шаблон не соответствует требованиям, автоподхват не сработает.
6) Фильтры и настройки на телефоне
На iPhone включённая фильтрация «неизвестных отправителей» переносит такие сообщения в отдельную вкладку, и пользователь может их не увидеть.
Антифрод и репутация отправителя
Репутация номера/бренда ухудшается от резких скачков объёма, смешивания OTP и маркетинга на одном номере, большого числа повторов и жалоб. Тогда фильтрация растёт, что запускает порочный круг: больше недоставок → больше повторов → ещё больше подозрительной активности. Описания логики фильтрации у провайдеров подчёркивают эту связь.
Диагностика: где именно «сыпется» цепочка
- Не отправили: ошибка API, лимиты, неправильный номер.
- Не доставили: фильтрация, роуминг, недоступный абонент, маршруты.
- Доставили, но не увидели: фильтры/спам, уведомления, другой клиент сообщений.
Что делать: чек‑лист повышения доставляемости
- Нормализовать номера в E.164 и валидировать тип линии (mobile/VoIP).
- Ввести таймер, backoff и лимиты повторов.
- Упростить текст OTP: код в начале, без ссылок, минимум юникода.
- Подобрать правильный тип отправителя под рынок и следить за фильтрацией по операторам.
- Добавить fallback‑каналы: голос, TOTP, push/email — по риску.
- Дать пользователю короткую инструкцию: где искать «Unknown/Spam».
Вывод
Если sms верификация проблемы стали системными, причина обычно комплексная: фильтрация операторов, качество маршрутов, тип отправителя, настройки телефона и ошибки UX (повторы, TTL, тексты). Решение — измерять доставку, сегментировать метрики, дисциплинировать повторы и иметь резервные каналы. Тогда OTP перестаёт «сыпаться» и становится предсказуемым.