Ко всем статьям

Почему «сыпется» SMS‑верификация: сетевые и продуктовые причины сбоев OTP

2026-02-18
Почему «сыпется» SMS‑верификация: сетевые и продуктовые причины сбоев OTP

Почему SMS/OTP не приходят или приходят поздно: фильтрация операторов, маршрутизация, настройки телефона и ошибки UX. Чек‑лист, диагностика и способы повысить доставляемость.

Почему проблемы 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 перестаёт «сыпаться» и становится предсказуемым.