Twilio берёт за каждое SMS отдельно. Казалось бы, всё прозрачно. Но счета за первый месяц часто удивляют команды, которые не проверили несколько технических деталей до запуска.
Кодировка сообщений и скрытое деление
Одно SMS в кодировке GSM-7 вмещает 160 символов. Но если в тексте появляется хотя бы один символ вне этого набора — например, кавычка-ёлочка или эмодзи — сообщение переходит в Unicode. Лимит падает до 70 символов, и сообщение на 140 символов уже считается как два. Шаблоны сообщений надо проверять не вручную, а через утилиты валидации кодировки.
Отправка на невалидные номера без предварительной проверки
Twilio списывает деньги даже за попытку доставки на несуществующий номер. Если база контактов собиралась без верификации, до 15–20% номеров могут быть недействительными. Lookup API у Twilio платный, но его стоимость ниже стоимости массовой отправки в пустоту. Одноразовая чистка базы перед первой кампанией окупается.
Retry без экспоненциальной задержки
При временных ошибках некоторые интеграции повторяют запрос немедленно и несколько раз подряд. Если Twilio принял первый запрос, но вернул timeout на уровне сети — сообщение уже отправлено. Следующий retry отправит его повторно. Логировать delivery status и проверять его перед повтором — обязательный шаг.
Эти ошибки не очевидны при первом чтении документации, но именно они объясняют, почему реальный счёт расходится с расчётом.