So I need ice_support=yes, webrtc=yes, rtcp_mux=yes on the endpoint. However when I add webrtc=yes to pjsip.endpoint_custom_post.conf and reload, I get:
res_pjsip_config_wizard.c: Unable to load config file 'pjsip_wizard.conf'
sorcery.c: Type 'system' is not reloadable
The reload fails. FreePBX 16 trunk GUI also has no DTLS/WebRTC option for trunks.
Question:
For those with this working on FreePBX — how did you handle the WebRTC/ICE media? Did you configure it outside FreePBX’s control, or is there a way to enable webrtc=yes on a trunk without breaking the config wizard?
2. Digit Matching (The “+” hurdle) Meta sends calls in E.164 format (e.g., +xx...). Standard routes looking for local digits often fail to match this.
Fix: Create an Inbound Route with the DID pattern _+xxXXXXXXXXXX (the underscore prefix is required for the + to be parsed correctly as a pattern).
3. Signaling Fix (The “Ghost Answer”) Even after media negotiated, the caller side would show “Answered” while the extension didn’t ring.
Fix: In the Inbound Route > Advanced tab, set Signal RINGING to Yes. This prevents the PBX from sending an immediate 200 OK during the WebRTC handshake, allowing the extension to ring first.
Result: Two-way audio and correct extension ringing established.
I finally got this working with two-way audio and no call drops. Just completed a 2-minute test call with perfect audio quality. Updating this thread with the complete solution.
The key fix was dtls_auto_generate_cert=yes instead of pointing to certificate files. Meta’s servers weren’t trusting my CA, causing “tlsv1 alert unknown ca” errors.
It allows WhatsApp voice calls to hit our IVR and queues directly — just like any other SIP trunk. We get call records, routing, and agents don’t need a physical mobile phone to receive WhatsApp calls. It’s all handled through the PBX.
I bet it also allows WhatsApp to record all your calls as well and then use it to train their LLM and voice recognition engines. I wouldn’t trust anything Meta