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
| Requirement | Detail |
|---|---|
| Meta Business Account | Verified, with the WhatsApp Business Platform enabled |
| WABA phone number | The Cloud API number, not the consumer WhatsApp app |
| Business verification | Approved by Meta. Calling is gated behind it |
| Finn plan | Pro or higher. Starter does not include WhatsApp calling |
| Calling API capability | Enabled 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
| Aspect | PSTN inbound | WhatsApp inbound |
|---|---|---|
| Setup | Rent a number | Meta approval, then connect the WABA |
| Caller identity | Phone number | wa_id plus display name |
| International cost | Varies by region | Flat, Meta handles routing |
| Outbound | Yes | No, inbound only |
| Voicemail | Configurable | Not supported. Missed calls drop with no message |
| Concurrency | Per-number capacity | Tied to your WABA tier |
| Recording, transcript, analytics | Standard | Same 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
| Symptom | Cause |
|---|---|
| "Calling not enabled" banner in WhatsApp Manager | Meta has not approved calling for this WABA |
| Call connects then drops in 1 to 2 seconds | Token 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 call | Recording is off on the bound Finn. Toggle it in agent settings |
| Poor audio in one region | Meta 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.