WhatsApp Audio Messages vs Voice Calls: Choose a Support Workflow
Use a WhatsApp audio message when the customer can listen and reply later. Choose a live voice call when both people are available and the issue needs immediate clarification. A recording sent as a message and a live conversation both carry speech, but they need different requests, identifiers and completion rules in your support app.
This guide compares UnifyPort’s audio messaging with its private-beta, human-initiated, one-to-one outbound calling through an unofficial interface. It does not describe Meta WhatsApp Business Calling API. For the complete call setup, see the voice-call integration tutorial.
1. Choose by the customer’s availability
| Support situation | Suggested choice | Why |
|---|---|---|
| Customer and agent work in different time zones | Audio message | Each person can respond when available |
| A short explanation does not need immediate questions | Audio message, with a text summary | The customer can return to the explanation and key details |
| Several details need rapid back-and-forth clarification | Live call, after confirming availability | Both people can resolve ambiguity together |
| The customer cannot listen privately or prefers text | Text | Speech is not always the right channel |
For example, a pickup instruction can be sent as audio with the address and time in text. A disputed detail may warrant a call if the customer agrees and is available. This is a workflow recommendation, not an automatic routing feature or a claim of better response rates.
2. Use two distinct request shapes
For both paths, keep the API key on your server, select the intended authorized WhatsApp messaging account with runtime_status set to running, and use the returned conversation_id from that account for the private conversation. Do not replace the conversation identifier with a phone-number string.
For an audio message, send this body to POST /v1/messages:
{
"account_id": "acc_example",
"to": { "id": "<conversation_id>", "type": "user" },
"message": {
"type": "audio",
"url": "https://cdn.example.com/support/explanation.ogg"
}
}
Replace the example URL with an accessible audio resource. The media-message contract requires at least one non-empty source in message.url, message.file_url or message.file_key; URL sources must be absolute HTTP(S) URLs. The sample sends an existing file, not microphone audio captured by the API. An extension alone does not prove the encoding is suitable, and this request does not promise a particular native voice-note bubble or a transcript.
For a live voice call, send this different body to POST /v1/calls:
{
"account_id": "acc_example",
"to": { "id": "<conversation_id>", "type": "user" },
"media_type": "voice"
}
The create-call contract requires workspace beta eligibility, enabled through support. is_beta is read-only. A successful 201 response with state: preparing prepares a private, single-use join_url. The agent must open it and click Start call before expires_at; opening the page alone does not dial. Preparation defaults to two minutes from creation, can be adjusted by the server, and does not cap connected call duration. Microphone permission is required; camera permission is optional.
3. Give each path its own result evidence
| Observation | What to record | What remains unproven |
|---|---|---|
Message response has status: accepted | The returned message_id and account | Delivery, playback and resolution |
| A matching message delivery or read event arrives | The receipt scope and matching message identifiers | The customer listened to the audio |
| Call creation returns a prepared link | The returned call_id and assigned support task | Dialing or connection |
call.answered arrives | Connection evidence for data.call.id | The issue was resolved |
call.ended arrives | End reason and duration_seconds | That zero seconds proves no connection |
Use the documented delivery and read receipt scope rather than marking every message in a conversation as complete. Read status is not an audio-playback receipt. Connected duration is rounded down to whole seconds, so preserve answered-event evidence even when duration is zero.
Configure the required subscriptions and follow Webhook delivery and signature verification: validate the raw body, deduplicate events and handle delayed or out-of-order arrival. Beta eligibility is separate from subscribing to call events. An audio attachment received in a message is not a call event or a recording automatically produced by the calling API.
4. Make the agent’s action explicit
In your app, use separate actions such as Send audio and Start voice call. For audio, show the selected file and customer before sending. If you build microphone capture, file storage or transcription, treat these as separate application features and verify their output before handing a resource to the API.
For calls, show the intended customer, the assigned agent and whether calling is available. Keep the call link private to the operator; exclude the full link from logs. Maintain separate message and call records, each linked to the support task. Ending a call should not automatically close the ticket.
5. Switching paths requires a new decision
If an audio message has no reply, do not infer that it was unheard and automatically dial. Ask whether a call is convenient. If a call ends without resolving the issue, an agent can deliberately send a text summary or audio follow-up; this is a new message, not a continuation of the call’s result.
When a request times out, retain an unknown outcome instead of immediately repeating the write. For an uncertain call result, consult the calling troubleshooting guide and check the current managed call. An empty current-call response does not reconstruct past outcomes. Never hang up an unfamiliar call simply to free the account.
6. Start with one explicit support task
Choose a suitable test conversation, agree on the communication method, and verify the selected account, target, request, stored identifiers and subsequent events. Check duplicate events and the agent’s final ticket update. These are suggested acceptance steps, not a report of a live test performed for this article.
The current calling scope does not include incoming or group calls, recording, transcription, SIP/PBX or autonomous AI calling. To discuss access and a concrete support scenario, contact technical support without sharing API keys or private call links.
Turn messaging integration into a stable product pipeline.
Start by sending through one API, then bring every inbound message back into your business system with standard events.