← All posts
Guide

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 situationSuggested choiceWhy
Customer and agent work in different time zonesAudio messageEach person can respond when available
A short explanation does not need immediate questionsAudio message, with a text summaryThe customer can return to the explanation and key details
Several details need rapid back-and-forth clarificationLive call, after confirming availabilityBoth people can resolve ambiguity together
The customer cannot listen privately or prefers textTextSpeech 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

ObservationWhat to recordWhat remains unproven
Message response has status: acceptedThe returned message_id and accountDelivery, playback and resolution
A matching message delivery or read event arrivesThe receipt scope and matching message identifiersThe customer listened to the audio
Call creation returns a prepared linkThe returned call_id and assigned support taskDialing or connection
call.answered arrivesConnection evidence for data.call.idThe issue was resolved
call.ended arrivesEnd reason and duration_secondsThat 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.

UnifyPort API

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.