Skip to main content

Your first support call on WhatsApp Business Calling

WhatsApp Business Calling puts a voice call one tap away inside a WhatsApp chat. A customer who taps a click-to-WhatsApp ad can call your support queue without either side handing over a phone number, and your agents answer from the same inbox and routing they already use for PSTN calls. This guide walks the whole loop for a support desk: enable calling on an existing WABA number, check country coverage for your markets before you advertise it, open the entry points that put the call button in front of customers, route the inbound leg exactly like a PSTN number, capture permission for business-initiated calls, design the fallback for callers in blocked countries, and read the billing and lifecycle webhooks into your desk. Prerequisites: a connected WABA (see Set up your first WABA) and an owner or admin role, which is required to enable calling. The lifecycle reference for everything on this page is WhatsApp Business Calling.

1. Enable calling and read the country matrix for your markets

Calling is opt-in per WABA phone number. Enable it on the number your support desk will answer:
A successful response returns "calling_enabled": true with the number’s country_code. If the number’s country is on Meta’s blocklist the call returns 422 with code WHATSAPP_CALLING_COUNTRY_BLOCKED. Read the availability matrix before you promise coverage. At the time of writing these countries are blocked: Numbers from any other country enable fine. Meta updates the list periodically, so before launching in a new market check the live list under Channels → WhatsApp → Calling in the dashboard rather than relying on a static copy. If a market you serve is blocked, plan the fallback in section 5 before you run ads there.

2. Open the entry points

Once calling is enabled, WhatsApp shows a native call button in the chat header to customers whose country is eligible. Your job is to get the customer into that chat; three entry points do most of the work for a support desk. Click-to-WhatsApp ads. In Meta Ads Manager, use the Click to WhatsApp destination pointed at your calling-enabled number. The ad opens a chat on the WABA number, and in eligible countries the chat already carries the call button, so the path from ad to voice call is one tap. This is the dominant acquisition loop for support lines: the ad starts the chat, the chat offers the call. CTA buttons inside the chat. Inside the 24-hour customer-service window you can send a labelled link button on a free-form message, exactly as described in CTA-URL tap-to-open link buttons. Use it to offer a callback page or a support portal next to the native call button, and read short_link.click webhooks to see which message drove the tap. Remember the window rule: once 24 hours lapse, only a template can reach the customer again. Catalog and wa.me deep links. On your website, order pages, and WhatsApp catalog items, link to https://wa.me/<E164> with your calling-enabled number. The deep link opens the chat; the call button is waiting there for eligible customers. For callers in blocked countries none of these surfaces shows the call button; the chat itself works normally. That is the case section 5 designs for.

3. Route the inbound call like a PSTN number

An inbound WhatsApp call leg honors the same per-number routing config as a PSTN DID: the same (type, config) bindings for queue, IVR, AI agent, ring group, softphone, and the rest of the route type enum, including fallback destination and business hours. Decide the answerer the same way you would for a voice number (see Pick the right inbound routing for a DID), then write the row:
The common support-desk shapes:
  • Queue for a staffed team, with voicemail or a department mailbox as the fallback, exactly as on PSTN.
  • IVR in front of the queue when callers need triage (“press 1 for billing”) before they wait.
  • AI agent ("type": "agent") to answer instantly and hand off to a human when the call needs one; see AI agent handoff to a human for the handoff loop.
Human answerers do not need new tooling. The incoming-call modal at /messages/whatsapp rings next to the PSTN softphone and offers accept and decline for WhatsApp calls; declining is preferred over letting a call ring out because it has no billing impact and gives the caller a cleaner experience.

4. Permission and opt-in for business-initiated calls

Inbound calls need nothing from you: any customer can tap the call button. Outbound calls, where your desk calls the customer back over WhatsApp, require an active call permission for the contact and number. The states are none, granted, revoked, and expired, and a grant arrives from one of three sources:
  • The customer replies to a template of category call_permission_request (persistent grant).
  • The customer accepts Meta’s in-app call-permission prompt during a chat (often time-bounded, so do not rely on it for a callback days later).
  • The customer taps an explicit call-permission button you sent (persistent grant).
The posture that works for support desks: capture permission during the first chat, while the customer is engaged, so the callback path exists when the ticket reopens. Send the call_permission_request template after a resolved conversation and record the consent trail the same way you do for messaging consent (see Consent management). Calling a contact without an active grant returns 422 WHATSAPP_CALLING_NO_PERMISSION; the permission indicator in the contact panel shows the current state and offers a re-engagement shortcut when it is missing.

5. Fallback when the caller’s country is blocked

A caller in a blocked country (section 1) never sees the call button, so the chat copy has to carry the fallback. Surface SMS and phone alternatives in the first message of the conversation, for example in your welcome or auto-reply text:
Voice calls over WhatsApp are not available in your country yet. Message us here any time, text +1 800 555 0100 for SMS support, or call +1 800 555 0100, 9:00 to 18:00 GMT.
Two rules keep this honest:
  • Check the country matrix before you run click-to-WhatsApp ads in a market, so the ad never promises a call button that will not render (section 1).
  • Route the SMS and PSTN legs through your configured fallback chains so the backup path has the same delivery guarantees as your primary messaging; see Fallback chains for chaining channels when the primary is unavailable.
The block is enforced server-side at enable time and the call button simply does not render on the customer side, so there is nothing to configure per caller; the fallback is a content and routing decision, not a gate.

6. Read the billing

Cost lands in three places you will actually read: the wallet is debited at end of call (with a pre-flight balance check that refuses to start a call the wallet cannot cover), the whatsapp.call.terminated webhook carries the final cost_amount_cents, and the rollups appear with the rest of your channel spend in Insights so WhatsApp calling cost sits next to SMS and PSTN voice cost in the same view. Two optional guards live under Settings → WhatsApp → Calling: a per-organisation daily spend cap (new calls are refused with 429 WHATSAPP_CALLING_DAILY_CAP_EXCEEDED once the UTC-day total hits it) and a max-call-minutes setting that sizes the pre-flight balance check. For a support line taking unpredictable inbound volume, set the daily cap on day one; it is the only place a runaway day has a ceiling.

7. Wire lifecycle webhooks into your desk

Subscribe your tenant webhook endpoint to the call lifecycle events and join them to your ticketing data with biz_opaque_callback_data: put your ticket or case id in that field when a call relates to one, and it comes back on every lifecycle event for the leg. Example whatsapp.call.terminated payload:
Signing, retry, and idempotency rules are the same as every other Orbit webhook; for payload handling patterns and a consumer checklist see the Webhook payload cookbook.

See also