Skip to content

WhatsApp calling

Nexafon answers and places WhatsApp voice calls on the business’s own number, in the browser, inside your product. Embedded users take calls in the softphone or <nexafon-app>, and start them with a <nexafon-call-button> or Nexafon.call(phone).

  • Calling is turned on for the workspace’s WhatsApp number (in the dashboard’s WhatsApp settings). Meta only allows it on numbers with a messaging limit of at least 2,000; otherwise you get whatsapp.calling_cannot_be_enabled.
  • The member’s role includes calls:answer, and for embedded users the signing secret key’s scopes include it too.
  • The browser has a microphone and the user allows it. The SDK frames carry allow="microphone; autoplay".

A call to the business number rings the team its call routing picks, with that team’s ring strategy (everyone at once, in order, or priority on plans that include it). The first member to answer takes it; the others see that someone answered. Unanswered calls end as missed and show in the call history. Your page hears call.ringing, call.answered and call.ended (events); your server gets call.ringing, call.answered, call.ended and call.missed webhooks.

WhatsApp lets a business call a customer only after the customer allowed it:

Rule (set by WhatsApp)
Asking for permission One request a day and two a week per customer, until a call connects (call_permission_request_limit)
Inside the 24-hour window The request is a message with Allow / Don’t allow buttons
Outside the window Only an approved template with a call permission button can ask (call_permission_template_missing)
How long it lasts 7 days, unless the customer makes it permanent; they can also refuse
Without permission Calling answers call_permission_missing

The inbox shows the permission state of each customer and offers the request when it is allowed. Other WhatsApp limits Nexafon passes on:

  • A daily cap on connected business-initiated calls per number, and per customer (whatsapp.business_call_limit), and a cap on simultaneous calls (whatsapp.call_concurrency_limit).
  • Business-initiated calls are not available from business numbers in some countries (currently the United States, Canada, Egypt, Vietnam, Nigeria and Türkiye): whatsapp_call_country_unsupported. Customers there can still call the business.
  • WhatsApp can pause calling on a number for low quality (whatsapp.calling_disabled_low_quality).

Outbound calls are billed per minute to the workspace wallet; with a low balance or past-due billing they pause (insufficient_balance, billing_past_due) while customers can still call in. See billing.

On plans with call_recording, calls can be recorded once answered. WhatsApp calls need a recording announcement chosen in the WhatsApp call settings first (call_recording_consent_missing). Recordings are listed by the recordings API.

Ringing can pause during prayer times, which Nexafon calculates for the workspace’s location (Umm al-Qura method by default); a call that ends this way has endReason: "prayer".