Верификация по номеру телефона — самая незаметная строка в бюджете продукта. Пока пользователей сотня, её никто не считает. Когда их десятки тысяч, выясняется, что компания платит миллионы тенге в год за то, чтобы люди просто входили в собственный аккаунт.
Самое обидное: платит она за это по привычке. Почти все интеграции верификации в Казахстане начинаются и заканчиваются одним каналом — SMS. Хотя код можно доставить и вчетверо, и в тридцать раз дешевле.
Сколько на самом деле стоит «просто отправить код»
На популярном льготном тарифе AutoCall.kz одно SMS стоит 23.25 ₸. Умножьте на свой месячный объём — цифра получается неприятная:
| Верификаций в месяц | Только SMS | В год |
|---|---|---|
| 1 000 | 23 250 ₸ | 279 000 ₸ |
| 10 000 | 232 500 ₸ | 2 790 000 ₸ |
| 50 000 | 1 162 500 ₸ | 13 950 000 ₸ |
И это расход, который растёт ровно вместе с успехом продукта. Чем больше у вас пользователей, тем больше вы платите за право их узнавать.
Первая мысль обычно такая: «раз SMS дорого — заменим его целиком на что-то дешёвое». Это ловушка. Любой дешёвый канал доставляет чуть хуже дорогого, и экономия на верификации оборачивается потерянными регистрациями — а это стоит гораздо больше разницы в тарифах.
Правильный вопрос не «какой канал выбрать», а «в каком порядке их пробовать». Дешёвый канал должен быть первым, дорогой — последним. И платить за дорогой вы будете только тогда, когда дешёвый действительно не сработал.
Трёхступенчатая верификация
Принцип простой: пользователь получает код самым дешёвым способом. Если код не дошёл, он нажимает «Отправить ещё раз» — и вы поднимаетесь на ступень выше. Так продолжается до SMS, который дойдёт почти наверняка.
Ключевая мысль в том, что до верхних ступеней доходит меньшинство. Платит бизнес за первую ступень для всех и за дорогую — для единиц.
Пользователю поступает входящий звонок, который тут же сбрасывается. Код — последние цифры номера звонящего. Отвечать не нужно, платить абоненту не за что, приходит за 3–10 секунд. Самый дешёвый способ доставить код в принципе.
Робот звонит и проговаривает код голосом, дважды. Работает там, где Flash Call не подошёл: пользователь не увидел экран, у него включён антиспам-фильтр на неизвестные номера или он просто не понял, что за пропущенный. Плюс это единственный метод, доступный слабовидящим и удобный за рулём.
Самый дорогой и самый надёжный канал. Сообщение остаётся в телефоне, его можно перечитать и скопировать, iOS и Android подставляют код автоматически. Именно поэтому SMS — не первая ступень, а страховка на случай, когда всё остальное не сработало.
Ступень 1: Flash Call
Один запрос. В ответе приходит code — сохраните его у себя и сравните с тем, что
введёт пользователь.
Authorization: Bearer {ваш_токен}
Content-Type: application/json
{
"number": "+77010000000",
"digits": 4 // длина кода, 3–6 цифр
}
{
"id": 11223,
"code": "7482", // это и есть код — сохраните у себя
"number": "+77010000000"
}
Пользователь видит входящий вызов с номера, скажем, +7 708 123 7482 — и вводит последние четыре цифры. Всё.
Используйте авто-код. Есть второй режим, где вы задаёте код сами
("code": "7482"), но тогда мы должны найти в пуле свободный номер, который
заканчивается ровно на эти цифры, — и можем не найти. Авто-код работает всегда и стоит
дешевле.
Ступень 2: голосовой звонок
Пользователь нажал «Отправить код ещё раз» — поднимаемся на ступень выше. Здесь мы синтезируем короткую запись с кодом и звоним.
Authorization: Bearer {ваш_токен}
Content-Type: application/json
{
"name": "OTP verification",
"type": "regular",
"audio_id": [{
"type": "synthesis",
"data": {
"text": "Код подтверждения: 7, 4, 8, 2. Повторяю: 7, 4, 8, 2."
}
}],
"list_id": [
{ "number": "+77010000000" }
]
}
Обратите внимание на текст: цифры перечислены через запятую и повторены дважды. Так синтез произносит их раздельно, а не как число «семь тысяч четыреста восемьдесят два», и у пользователя есть второй шанс расслышать.
Из чего складывается цена: ~7 секунд разговора по 0.56 ₸ плюс 5 ₸ за синтез записи. Синтез отдельной строкой потому, что код у каждого пользователя свой — запись приходится генерировать заново под каждый звонок.
Ступень 3: SMS
Если код не дошёл и голосом — отправляем SMS. На этой ступени экономить уже незачем: важно, чтобы человек наконец вошёл.
Authorization: Bearer {ваш_токен}
Content-Type: application/json
{
"name": "OTP verification",
"text": "Код подтверждения: 7482. Никому не сообщайте код.",
"list_id": [
{ "number": "+77010000000" }
]
}
Следите за длиной текста. SMS с кириллицей вмещает 70 символов; всё, что длиннее, тарифицируется как два сообщения и больше. «Код подтверждения: 7482. Никому не сообщайте код.» укладывается в одно — а вот развёрнутое приветствие с названием компании уже нет.
Считаем экономию
Подставьте свои цифры. Доли — это то, что вы легко померите у себя в аналитике: сколько пользователей нажимают «отправить ещё раз» на каждом шаге.
Значения по умолчанию — просто круглые числа для примера, не наша статистика. Но даже при пессимистичных долях каскад выигрывает: на первой ступени вы платите единицы тенге за всех, а десятки — за небольшой остаток.
Как это выглядит со стороны кода
Логика целиком на вашей стороне и умещается в несколько строк:
- Сгенерировали запрос на верификацию — заведите счётчик попыток для этого номера (в Redis, в сессии, где удобно).
- Попытка 1 →
POST /api/v1/flash-calls. Сохранитеcodeиз ответа. - Попытка 2 →
POST /api/v1/autocallsс тем же кодом. - Попытка 3 и далее →
POST /api/v1/bulks. - Код живёт 3–5 минут, попыток ввода не больше пяти — дальше начинайте заново.
Пара практических мелочей, которые экономят нервы:
- Кнопку «отправить ещё раз» блокируйте на 60 секунд. Иначе пользователь нажмёт её трижды подряд и вы оплатите три ступени за одну верификацию.
- Код между ступенями не меняйте. Человек мог всё-таки разглядеть номер Flash Call и вводить именно те цифры — новый код собьёт его с толку.
- На Flash Call действует ограничение: не больше 3 запросов на один номер за 5 минут. Это защита от перебора, и она же убережёт вас от кривого ретрая в собственном коде.
- Объясните пользователю, что происходит. «Вам поступит короткий звонок, отвечать не нужно — введите последние 4 цифры номера» снимает почти все вопросы к первой ступени.
Когда каскад не нужен
Честно: не всем. Если верификаций у вас пара сотен в месяц, разница в деньгах не окупит день работы разработчика — оставайтесь на SMS. Каскад начинает окупаться примерно с нескольких тысяч верификаций в месяц, а с десятков тысяч становится очевидным решением.
Ещё один случай, когда первую ступень стоит пропустить, — если ваша аудитория совсем не техническая и звонок с незнакомого номера её пугает. Тогда начинайте сразу с голосового: он всё равно дешевле SMS.
Вывод
Верификация — это не «канал», это последовательность. Один и тот же код можно доставить за 1 ₸ и за 23.25 ₸ — вопрос лишь в том, начинаете вы с дешёвого или с дорогого.
В AutoCall.kz все три метода живут в одном сервисе, за одним API-токеном и на одном балансе. Не нужно подключать трёх провайдеров и сводить три счёта — достаточно поменять эндпоинт в зависимости от номера попытки.
Подробное описание каждого метода — на странице кодов подтверждения, полная спецификация — в OpenAPI.