Аудиосообщения или звонки WhatsApp: что выбрать для поддержки
Выбирайте аудиосообщение WhatsApp, если клиент может прослушать его и ответить позже. Голосовой звонок подходит, когда оба участника свободны и вопрос требует немедленного уточнения. Запись в сообщении и разговор в реальном времени передают речь, но приложению поддержки нужны разные запросы, идентификаторы и критерии завершения.
В статье сравниваются аудиосообщения UnifyPort и исходящие звонки один на один, которые человек запускает через неофициальный интерфейс в закрытом бета-тестировании. Это не руководство по Meta WhatsApp Business Calling API. Полную настройку смотрите в инструкции по интеграции звонков.
1. Учитывайте доступность клиента
| Ситуация | Рекомендуемый способ | Причина |
|---|---|---|
| Клиент и оператор в разных часовых поясах | Аудиосообщение | Каждый отвечает в удобное время |
| Короткое объяснение без немедленных вопросов | Аудиосообщение с текстовым резюме | Можно вернуться к объяснению и важным деталям |
| Нужно быстро согласовать несколько деталей | Звонок после согласования времени | Участники вместе устраняют неоднозначность |
| Клиент не может слушать без посторонних или предпочитает текст | Текст | Голос подходит не всегда |
Например, порядок получения заказа можно объяснить аудио, а адрес и время написать текстом. Спорную деталь можно обсудить звонком с согласия клиента, когда он свободен. Это рекомендация по процессу, а не автоматическая маршрутизация и не обещание повысить долю ответов.
2. Используйте разные структуры запросов
В обоих случаях храните API-ключ на сервере, выбирайте нужный авторизованный аккаунт WhatsApp с runtime_status, равным running, и используйте полученный для этого аккаунта conversation_id личного диалога. Не подставляйте строку с номером телефона вместо идентификатора диалога.
Для аудиосообщения отправьте это тело в POST /v1/messages:
{
"account_id": "acc_example",
"to": { "id": "<conversation_id>", "type": "user" },
"message": {
"type": "audio",
"url": "https://cdn.example.com/support/explanation.ogg"
}
}
Замените пример URL доступным аудиоресурсом. Контракт медиасообщений требует хотя бы один непустой источник: message.url, message.file_url или message.file_key. URL должен быть абсолютным адресом HTTP(S). Пример отправляет готовый файл, а не записывает микрофон через API. Расширение не доказывает пригодность кодировки, а запрос не гарантирует конкретный вид нативного голосового сообщения или расшифровку.
Для голосового звонка отправьте другое тело в POST /v1/calls:
{
"account_id": "acc_example",
"to": { "id": "<conversation_id>", "type": "user" },
"media_type": "voice"
}
Контракт создания звонка требует допуска рабочего пространства к бета-тестированию, который включает поддержка. is_beta доступен только для чтения. Успешный ответ 201 со state: preparing означает готовность закрытой одноразовой ссылки join_url. Оператор должен открыть её и нажать Start call до expires_at; открытие страницы само по себе не начинает набор. Подготовка по умолчанию действует две минуты с момента создания, срок регулируется сервером и не ограничивает длительность соединённого звонка. Микрофон обязателен, камера — нет.
3. Разделяйте подтверждения результата
| Наблюдение | Что сохранить | Что ещё не доказано |
|---|---|---|
Ответ сообщения содержит status: accepted | Полученный message_id и аккаунт | Доставка, прослушивание и решение вопроса |
| Пришло соответствующее событие доставки или прочтения | Область действия квитанции и идентификаторы сообщений | Клиент прослушал аудио |
| Создание звонка вернуло подготовленную ссылку | Полученный call_id и задачу поддержки | Набор или соединение |
Пришёл call.answered | Подтверждение соединения для data.call.id | Вопрос решён |
Пришёл call.ended | Причину завершения и duration_seconds | Ноль секунд доказывает отсутствие соединения |
Следуйте документированной области действия квитанций доставки и прочтения, а не отмечайте завершёнными все сообщения диалога. Прочтение не является квитанцией прослушивания. Длительность соединения округляется вниз до целых секунд, поэтому храните событие ответа даже при нулевой длительности.
Настройте нужные подписки и следуйте правилам доставки и проверки подписи Webhook: проверяйте исходное тело, устраняйте дубли, учитывайте задержки и нарушение порядка. Допуск к бета-тестированию и подписка на события звонков — разные условия. Аудиовложение в сообщении не является событием звонка или записью, автоматически созданной API звонков.
4. Сделайте действие оператора явным
В приложении разделите действия Отправить аудио и Начать голосовой звонок. Перед отправкой покажите выбранный файл и клиента. Запись микрофона, хранение файлов и расшифровку, если вы их создаёте, считайте отдельными функциями приложения и проверяйте результат до передачи ресурса в API.
У действия звонка покажите клиента, назначенного оператора и доступность функции. Передавайте ссылку только текущему оператору и не пишите её полностью в журналы. Храните сообщения и звонки отдельно, связывая их с одной задачей поддержки. Окончание звонка не должно автоматически закрывать заявку.
5. Смена способа требует нового решения
Если на аудиосообщение нет ответа, не делайте вывод, что его не слышали, и не звоните автоматически. Спросите, удобен ли звонок. Если звонок не решил вопрос, оператор может осознанно отправить текстовое резюме или аудио для продолжения работы. Это новое сообщение, а не продолжение результата звонка.
При тайм-ауте сохраняйте неизвестный результат вместо немедленного повтора записи. Если результат звонка неясен, используйте руководство по диагностике звонков и запросите текущий управляемый звонок. Пустой ответ не восстанавливает прошлые результаты. Не завершайте незнакомый звонок ради освобождения аккаунта.
6. Начните с одной конкретной задачи поддержки
Выберите подходящий тестовый диалог, согласуйте с клиентом способ общения и проверьте аккаунт, адресата, запрос, сохранённые идентификаторы и последующие события. Проверьте дубли и итоговое обновление заявки оператором. Это предлагаемые шаги приёмки, а не отчёт о реальном тестовом звонке для этой статьи.
Текущая функция звонков не включает входящие и групповые звонки, запись, расшифровку, SIP/PBX и автономные звонки с ИИ. Для обсуждения допуска и конкретного сценария обратитесь в техническую поддержку, не передавая API-ключи и закрытые ссылки на звонок.
Превратите интеграцию сообщений в стабильный продуктовый pipeline.
Начните с отправки через единый API, затем возвращайте входящие сообщения в бизнес-систему стандартными событиями.