Как настроить каскад в умном шлюзе

Практические рекомендации по настройке каскада в умном шлюзе OTP — выбор successOn, timeout, cooldown и рекомендуемые цепочки из 9 каналов

Коротко: каскад настраивается в запросе. Вы указываете каналы, таймауты и статусы успеха — платформа сама переключает каналы по цепочке.

Кому подходит

  • Роль: Разработчик
  • Уровень: Опытный

Что это

Каскад — последовательность каналов, по которым отправляется сообщение. Если один канал не дал результата — платформа переключается на следующий.

Здесь — практические рекомендации для OTP: как выбрать параметры под задачу. Полное описание параметров — в API-разделе.

Все технические детали (поля запроса, ограничения, значения по умолчанию) — в статье OMNI API — отправка кодов.

Перед началом

  • Есть API-ключ с правами omni-api.
  • Есть имя отправителя со статусом Активно.
  • Настроен endpoint для вебхука (если нужны статусы доставки).
  • Вы понимаете, какие каналы будете использовать.

Доступные каналы. В умном шлюзе доступно 9 каналов OTP. Номера для поля channel — в таблице Какие каналы использовать для OTP.

Два способа: один канал или каскад

Отправка через один канал — допустима. Если одного канала достаточно для вашей задачи, каскад не обязателен. Укажите в messages одно сообщение — платформа отправит его по одному каналу.

СпособКогда использовать
Один каналЗадача решается одним каналом — например, только SMS или только WhatsApp
КаскадНужна повышенная доставляемость — если первый канал не сработал, сообщение уйдёт по следующему

Правило: SMS — всегда последний канал

SMS в каскаде всегда должен быть последним каналом.

SMS тарифицируется за отправку (за каждый сегмент) — независимо от того, дошло сообщение или нет. Остальные каналы тарифицируются за доставку. Поэтому ставить SMS первым или в середине цепочки — значит платить за отправку, даже если сообщение можно было доставить бесплатно через другой канал.

SMS — резервный канал, который работает везде и на всех устройствах. Он должен быть последним.

Как выбрать successOn

successOn — статус, при котором каскад считает канал успешным и не переключается на следующий.

ЗначениеКогда использовать для OTP
sentЕсли важна скорость, а не гарантия доставки. Платформа перейдёт дальше, как только сообщение ушло провайдеру
deliveredСтандарт для OTP. Гарантирует, что код дошёл до устройства
seenЕсли нужна уверенность, что код прочитан (доступно не для всех каналов)

delivered — финальный статус. Если пришёл delivered, значит сообщение доставлено — статус уже не изменится. После delivered статус failed прийти не может.

Поэтому для OTP рекомендуется successOn: "delivered" — это гарантия, что код дошёл, прежде чем каскад переключится на следующий канал.

По умолчанию successOn = sent. Если не указать явно — платформа переключится на следующий канал, как только сообщение уйдёт провайдеру. Для OTP это слишком рано — указывайте delivered.

Как выбрать timeout

timeout — сколько секунд ждать наступления successOn перед переключением на следующий канал.

Для OTP скорость критична. Пользователь ждёт код — если он не приходит за 30–60 секунд, он запросит новый. Поэтому таймаут для OTP измеряется в секундах, а не в минутах.

Рекомендация для OTP:

  • Начинайте с 15–30 секунд для быстрых каналов — WhatsApp, Telegram Gateway, Mobile Push, FlashCall.
  • 30–60 секунд — для SMS, RCS, TTS.
  • Не ставьте таймаут в минутах — пользователь не будет ждать так долго.

Технические ограничения по API:

  • По умолчанию: 1200 секунд (20 минут).
  • Максимум: 259 200 секунд (72 часа).

Эти значения — для API. Для OTP они слишком большие. Используйте секунды.

Когда использовать cooldown

cooldown — время в секундах, на которое блокируется контакт после неудачи.

Для OTP — когда нужен:

  • Контакт недоступен (телефон выключен, номер не существует) — блокировка не даёт тратить деньги на повторные попытки до мёртвого номера.
  • Защита от частых запросов — если пользователь несколько раз подряд запрашивает код, а канал не доставляет, блокировка снижает нагрузку и расходы.

Для OTP — когда не нужен:

  • Если пользователь может запросить новый код через минуту — жёсткий cooldown на 24 часа помешает ему.
  • Если нужна доставка любой ценой — блокировка не даст попробовать снова.

Рекомендация для OTP: используйте короткий cooldown (например, 30–60 секунд) — чтобы избежать повторных попыток на мёртвый номер, но не блокировать пользователя надолго.

Когда нужен sendNextAfterFail

sendNextAfterFail — флаг, который определяет, отправлять ли следующее сообщение каскада, если после успеха по successOn приходит статус failed.

Флаг актуален только когда successOn менее строгий, чем delivered.

Например, если successOn: "sent" — платформа считает канал успешным, как только сообщение ушло провайдеру. Но провайдер может потом вернуть failed — сообщение не дошло. В этом случае sendNextAfterFail = true отправит следующее сообщение каскада.

Если successOn: "delivered" — флаг не срабатывает: delivered финальный, failed после него не придёт.

Значение successOnsendNextAfterFail актуален?Когда включать
delivered❌ НетНе нужен — delivered финальный
seen❌ НетНе нужен — seen финальный
sent✅ ДаВключайте true, если хотите доставить любой ценой

Рекомендация для OTP: используйте successOn: "delivered" — тогда sendNextAfterFail не нужен.

Как тарифицируется каскад

SMS тарифицируется за отправку — за каждый сегмент.

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

В каскаде списание происходит только один раз — по тому каналу, через который сообщение фактически доставлено.

Рекомендуемые цепочки для OTP

SMS — всегда последний канал. Все каналы в цепочках — из списка 9 каналов OTP.

ЗадачаЦепочка
Универсальная, дешёваяTelegram Gateway → WhatsApp → TTS → SMS
КлассическаяTTS → SMS
Для стран с дешёвым FlashCallFlashCall → SMS
Для Telegram-аудиторииTelegram Gateway → SMS
Только SMSSMS — без каскада, когда достаточно одного канала

Цепочки зависят от страны получателя: доступность каналов, скорость доставки и стоимость различаются по регионам. Для конкретной страны подбирайте цепочку с учётом этих особенностей.

Пример: WhatsApp → TTS → SMS

{
  "contact": "79991234567",
  "isOtp": true,
  "webhook": "https://your-site.com/webhook",
  "cooldown": 60,
  "messages": [
    {
      "channel": 4,
      "senderId": "<имя отправителя WhatsApp>",
      "successOn": "delivered",
      "timeout": 30,
      "payload": {
        "text": "Ваш код: 1234"
      }
    },
    {
      "channel": 11,
      "senderId": "<имя отправителя TTS>",
      "successOn": "delivered",
      "timeout": 45,
      "payload": {
        "text": "Ваш код 1234",
        "language": "ru",
        "repeat_count": 1
      }
    },
    {
      "channel": 1,
      "senderId": "<имя отправителя SMS>",
      "payload": {
        "text": "Ваш код: 1234"
      }
    }
  ]
}

Что происходит:

  1. Платформа отправляет сообщение по WhatsApp и ждёт delivered 30 секунд.
  2. Если статус получен — каскад завершён. Статус delivered финальный.
  3. Если не получен — переход на TTS, ожидание delivered 45 секунд.
  4. Если не получен — переход на SMS — последний канал цепочки.
  5. Если SMS тоже не доставлено — контакт блокируется на 60 секунд (cooldown на верхнем уровне).

Мгновенный переход

Если от провайдера приходит статус «абонент недоступен», «номер не существует» или «отклонено» — платформа переключается на следующий канал немедленно, без ожидания таймаута.

Результат

Сообщение отправлено по каскаду. Вы получаете статусы доставки на указанный вебхук или запрашиваете их через GET /edrs.

Частые проблемы

Причина: статус, указанный в successOn, уже наступил. По умолчанию successOn = sent — переход не происходит.

Решение: явно укажите successOn: "delivered" для каждого сообщения каскада.

Причина: successOn = sent, sendNextAfterFail = true, и после sent пришёл failed — платформа отправила следующее сообщение каскада.

Решение: используйте successOn: "delivered" — тогда delivered финальный, дублирования не будет.

Причина: cooldown указан на уровне сообщения — он срабатывает, если конкретное сообщение не доставлено, даже если каскад ещё продолжается.

Решение: если блокировка нужна только после исчерпания всех каналов — указывайте cooldown только на верхнем уровне.

Причина: SMS тарифицируется за отправку, а не за доставку. Если он в середине — платите за отправку даже при успешной доставке по другому каналу.

Решение: ставьте SMS последним каналом в цепочке — это резерв, который работает везде.

См. также

Как работает умный шлюз

Режим, в котором вы генерируете код

Как отправить первый код

Пошаговый сценарий

Какие каналы использовать для OTP

9 каналов OTP и их номера в API

Сравнение каналов для OTP

Стоимость и возможности

Как выбрать канал для OTP

Алгоритм выбора

OMNI API — отправка кодов

Полное описание параметров

Broadcasts API

Каскад в массовых рассылках

Что такое каскад

Общий обзор каскада

Как создать API-ключ

Создание и управление ключами

Нужна помощь?