Skip to main content

Telephony

WhatsApp calling

Taking calls over WhatsApp instead of the PSTN.

What WhatsApp calling is

WhatsApp Business Calling is Meta's voice surface on top of the Cloud API. A user taps the call button inside your business chat, and the call lands on Finn as a normal inbound call. Same agent, same prompt, same voice, same workflow as your PSTN inbound. No new number to provision, because the call is addressed to your WABA phone-number ID.

Calling is inbound only. You cannot dial a WhatsApp user from Finn. If you need outbound, you need a PSTN number (phone-numbers) and a separate consent basis.

Prerequisites

RequirementDetail
Meta Business AccountVerified, with the WhatsApp Business Platform enabled
WABA phone numberThe Cloud API number, not the consumer WhatsApp app
Business verificationApproved by Meta. Calling is gated behind it
Finn planPro or higher. Starter does not include WhatsApp calling
Calling API capabilityEnabled per-WABA in Meta Business → WhatsApp Manager → API Settings → Calling

The Calling capability is the step people miss. Meta approves it separately from business verification, and until it is approved, calls connect and then drop within a second or two.

Setup

1. Enable calling on the WABA number. In Meta Business Suite → WhatsApp Manager → Phone Numbers → your number → Settings → Calling, turn on inbound calling and set the default action to Forward to API.

2. Generate a permanent system-user token. In Meta Business → Business Settings → System Users, create or reuse a system user and issue a token with the whatsapp_business_management and whatsapp_business_messaging scopes. This token is a credential. Do not commit it, and rotate it on a schedule.

3. Connect in Finn. This is a dashboard operation, not an API one. Go to Settings → Integrations → WhatsApp → Connect and paste phone_number_id, waba_id, and the system-user token. Finn validates the token against /v18.0/{phone_number_id} and shows the result inline.

4. Bind an agent. On the same screen, either pin one Finn to answer all WhatsApp inbound, or route per call using the inbound webhook. Only one Finn can be bound to a phone-number ID at a time, so dynamic routing is how you vary the agent by caller or campaign.

5. Test. Message your WABA number from a personal WhatsApp account, then tap the call button. The agent answers.

Caller identification

WhatsApp inbound arrives at the inbound webhook with channel-specific fields instead of a caller ID:

{
  "session_id": "ws_2H4abc",
  "channel": "whatsapp",
  "from": {
    "wa_id": "919876543210",
    "display_name": "Priya M",
    "profile_pic_url": "https://..."
  },
  "to_phone_number_id": "104382715924563",
  "started_at": "2026-05-22T14:30:00Z"
}

wa_id is the caller's WhatsApp identifier, usually their number in E.164 without the leading +. Use it as your CRM lookup key the same way you use caller_id on PSTN. If your routing logic reads caller_id unconditionally, it will get nothing on WhatsApp calls. Branch on channel first.

How it differs from PSTN inbound

AspectPSTN inboundWhatsApp inbound
SetupRent a numberMeta approval, then connect the WABA
Caller identityPhone numberwa_id plus display name
International costVaries by regionFlat, Meta handles routing
OutboundYesNo, inbound only
VoicemailConfigurableNot supported. Missed calls drop with no message
ConcurrencyPer-number capacityTied to your WABA tier
Recording, transcript, analyticsStandardSame as PSTN

Voicemail is the difference that surprises people. Anything you built on agents-voicemail does not apply here, and a missed WhatsApp call leaves no artifact beyond the call log.

Concurrency is governed by your WABA tier rather than by Finn's per-number limits, so the numbers on concurrency describe your PSTN capacity, not your WhatsApp capacity.

Transfers

Warm transfer works the same as PSTN. See tools-transfer. The transferred leg lands on a configured PSTN number, so the caller starts inside WhatsApp and finishes on a regular phone line. Budget for that: the transfer target must be a real phone number you control.

Billing

WhatsApp inbound bills on the same AI-credit model as PSTN inbound. Picked-up calls are pulse-billed by the minute with a one-minute minimum. There is no carrier surcharge, because Meta carries the network leg, and no per-call setup fee. See api-wallet.

Compliance

Recording disclosure rules do not change by channel. India, the EU, and parts of the US require telling the caller the call is recorded. Put the disclosure in the agent's welcome message (recording-consent, agents-welcome).

Consent covers the session only. The user tapped the call button, so consent to that conversation is implicit. It is not consent to call them back over PSTN, and treating it that way is a compliance problem, not a product one.

Audio is processed in Meta's region. If your org has data-residency commitments, check them against that before enabling (data-residency).

When it breaks

SymptomCause
"Calling not enabled" banner in WhatsApp ManagerMeta has not approved calling for this WABA
Call connects then drops in 1 to 2 secondsToken invalid or missing a scope. Re-issue it
Caller hears "this number is not configured"phone_number_id in Finn does not match WhatsApp Manager
No recording on the callRecording is off on the bound Finn. Toggle it in agent settings
Poor audio in one regionMeta is still rolling calling out by country. Check API Settings for your status

Region availability is not uniform. Meta enables calling country by country, and your status lives in WhatsApp Manager → API Settings rather than anywhere in Finn.