Choose the application boundary
A browser webphone needs a user interface, a limited SIP identity, call routing and a support owner as well as a signaling library. The current SIP.js Simple User guide demonstrates explicit connect and register operations, hold and unhold, and DTMF through SIP INFO. The repository separately describes broader transfer, RFC 2833 DTMF and multi-session capabilities. Choose SimpleUser, SessionManager or the full API deliberately rather than treating a demo, navigation label or repository feature list as one finished phone contract.
Keep the browser release, application build, SIP library package, selected API layer and PBX version in the acceptance record. SIP.js 0.21.2 remains labelled Latest, but the repository's published security-policy table names 0.19.x as supported; preserve that unresolved policy boundary instead of inventing support for the selected package. A library capability is not a tested service, emergency plan or guarantee of incoming-call availability.
Sangoma's browser client is an application tied to supported Sangoma PBX systems, not just a WebRTC library. The Sangoma Phone guide separates direct or UCP-launched browser access from the installed desktop client, and keeps optional queue, transcription and chat claims attached to their PBX permission, module and subscription requirements.
Diagnose capture before changing SIP
Microphone capture uses navigator.mediaDevices.getUserMedia in a secure context and requires permission. Record the API and error name: NotAllowedError can reflect a permission denial or policy restriction; NotFoundError indicates no matching input; NotReadableError points to a device-access failure; OverconstrainedError identifies requirements that no candidate satisfies. A prompt the user ignores can leave the promise pending, so a waiting screen should offer a clear cancel path instead of claiming the request failed.
First check the actual origin, requested audio constraints and browser or operating-system permission. Changing a SIP password or RTP rule does not repair a blocked microphone request.
Inspect embedding policy separately
An embedded client has a parent-document boundary. The microphone Permissions-Policy default allowlist is self; a cross-origin frame needs deliberate delegation within the parent policy and frame permissions. A policy block can reject capture without showing a user prompt. Inspect the returned parent headers, frame origin and allow policy before asking the user to keep accepting permissions.
A policy that permits capture does not grant user consent. Policy support also varies across browsers: use the exact supported browser and embedding arrangement for acceptance, rather than treating one header as universal enforcement.
Treat a device list as permission-scoped
enumerateDevices does not inventory every physical device unconditionally. Its results omit devices excluded by policy or permission, and its documented requirements include a secure context, an active document and visible document state. Default capture devices appear first. A missing non-default headset entry is therefore not sufficient evidence that the headset is absent or broken.
Record the selected input and the application state when the list was obtained. Repeat selection after the intended permission flow, then check a short conversation with the actual headset. Keep device identifiers out of public incident reports.
Input enumeration and output selection are also different interfaces. The wrong-audio-device diagnostic preserves the browser's permission-scoped input list, user-mediated non-default output choice, remote media attachment and audible result without treating a SIP session as playback proof.
Separate receiving media from playing sound
SIP.js leaves substantial media handling to the application. Its full-API guide attaches remote receiver tracks to a MediaStream and assigns that stream to the media element. Session establishment, an attached stream and audible playback are separate observations. Capture session state and the remote-track attachment before resetting a silent call.
HTMLMediaElement.play returns a promise. Script-started playback can be rejected with NotAllowedError when browser policy prevents it; a call timer or received track does not override that policy. Handle the result, expose an explicit action to start sound when needed, and make the visible playback state follow the actual result. A fulfilled promise proves playback started, not that the correct headset produced intelligible conversation.
Accept a complete browser calling path
Use a contained endpoint and record each stage: page identity and capture permission; selected microphone; WSS connection; SIP authentication and routing; negotiated media; attached remote track; playback result; and an intelligible conversation in both directions. Asterisk documents separate HTTP/WebSocket, PJSIP transport, endpoint, auth and AoR responsibilities. Follow Asterisk WebRTC integration for that server boundary.
Include an incoming call, permission denial and retry, headset reconnection, hangup cleanup, an idle interval and the intended closed-tab or sleeping-device fallback. These are proposed acceptance cases, not results obtained for this guide. No browser, microphone, headset, client, PBX, protected session, emergency route or live call was tested.
Keep browser SIP libraries distinct
The JsSIP guide now sits beside SIP.js as a separate implementation choice. Neither library supplies the finished phone experience, credentials, PBX policy, background wake-up, media rendering or operational lifecycle by itself, and their APIs or version claims are not interchangeable.
Treat Wave Web 1.0.35.7 as a UCM-delivered browser client
Grandstream lists Wave Web 1.0.35.7 as built into the UCM6300 series. SSO, AI-derived data, call notes, retention behavior and WhatsApp calling therefore depend on the server and integration state as well as browser permissions and session behavior. A matching Wave family label does not make the browser path equivalent to Desktop or mobile.
Keep mobile browser compatibility inside the foreground boundary
SIP.js documents Chrome and Firefox on Android as WebRTC-capable and compatible with its web applications. That does not establish background registration, push wake-up, locked-screen ringing, iOS behavior or survival after the page is suspended or closed. Record the exact browser, operating system, application state and fallback route, then test the intended idle and network-change cases rather than transferring a foreground compatibility statement into a mobile-service promise.
Preserve INVITE handling and ringtone playback as different states
Use the browser no-ring diagnostic when an incoming call may have reached the application but produced no audible alert. onInvite, visible controls, play() or AudioContext outcome, answer and remote media remain separate evidence.
Keep Webex browser calling inside its documented scope
Cisco documents meetings and free Call on Webex in supported browsers. The Webex App guide does not extend that statement to every Unified CM, Webex Calling or hosted-provider desktop feature.
Trace a JsSIP application through its own event model
Use the JsSIP guide and paired diagnostic when transport or registration appears healthy but calls or media fail.
Separate Wave Web permission from UCM call evidence
The Grandstream Wave diagnostic keeps browser origin, permission, device selection, signaling and media independently observable.
Keep RingCentral web state and desktop packaging separate
The RingCentral App guide treats browser support, permission, tab state, WSS, calling and media as their own acceptance path.
Keep Zoom Web App and installed clients as separate acceptance paths
The Zoom Workplace client guide records web, desktop and mobile support, permissions, Phone visibility, calling controls and media independently.
Keep the NextivaONE web path distinct from native apps
The NextivaONE guide preserves browser support, permission and active-tab behavior without transferring them to desktop or mobile.
Keep Teams for Web within its documented path
The Teams Phone client guide retains supported desktop browsers and the mobile-browser and VDI exclusions without transferring them to native apps.
Treat Dialpad Chrome, PWA and notification permission as one explicit path
The Dialpad app guide keeps web sign-in, supported browser, installed PWA, tab state, notification permission, alert and call state separate.
Treat 8x8 Work for Web as its own client path
The 8x8 Work app guide keeps Web sign-in, browser, capability, permission, route and call evidence separate from desktop.
Do not transfer Vonage executable calling claims to browser access
The VBC app guide keeps browser capability, executable softphone, package and runtime evidence distinct.
Treat Aircall web and installed applications as different paths
The Aircall Workspace guide keeps Chrome permission, web updates, installed package and mobile behavior independently observable.
Sources & applicability
Primary references for the technical details above. Operational examples and planning checklists are VoIP.info editorial guidance.
- SIP.js Simple User scope and limitations ↗
- SIP.js remote media attachment and cleanup ↗
- MDN getUserMedia permission and error states ↗
- MDN microphone Permissions-Policy ↗
- MDN permission-scoped media enumeration ↗
- MDN playback promise and autoplay policy ↗
- Asterisk WebRTC client architecture ↗
- W3C Audio Output Devices API ↗
- W3C Media Capture and Streams ↗
- Sangoma desktop client installation and login ↗
- Sangoma FreePBX and PBXact desktop app administration guide ↗
- FreePBX browser-based Sangoma Phone announcement ↗
- Sangoma Phone web-app documentation ↗
- Sangoma desktop client current release pointer ↗
- JsSIP project site ↗
- JsSIP architecture overview ↗
- JsSIP documentation index ↗
- JsSIP 3.10 getting-started guide ↗
- JsSIP 3.8 user-agent configuration reference ↗
- JsSIP project repository ↗
- JsSIP repository changelog ↗
- JsSIP npm package ↗
- Grandstream Wave release index ↗
- Wave Desktop 1.35.6 release notes ↗
- Wave Web 1.0.35.7 release notes ↗
- Wave Android 1.0.35.7 and iOS 1.35.7 release notes ↗
- SIP.js release archive ↗
- SIP.js published security policy ↗
- SIP.js 0.20 to 0.21 migration guide ↗
- SIP.js project repository and API scope ↗
- SIP.js mobile guide ↗
- SIP.js receive-a-call guide ↗
- SIP.js user-agent and registration guide ↗
- MDN autoplay guide for media and Web Audio ↗
- MDN AudioContext resume method ↗
- MDN document visibility state ↗
- Chrome autoplay policy ↗
- WebKit media autoplay policy ↗
- Supported calling options in Webex App ↗
- Webex App: find out what calling service you have ↗
- Webex App system requirements and support policy ↗
- Download the Webex desktop and mobile apps ↗
- Webex App: change your audio settings ↗
- Webex App: test your connection with the Health Checker ↗
- Webex App: troubleshoot connection issues with the Diagnostics tool ↗
- Webex App: error messages for Calling ↗
- Advanced diagnostics and troubleshooting in Control Hub ↗
- JsSIP current UA API ↗
- JsSIP current RTCSession API ↗
- JsSIP failure and end causes ↗
- JsSIP 3.10 UA configuration parameters ↗
- Grandstream — Wave product page ↗
- Grandstream — Wave Desktop user guide ↗
- Grandstream — Wave Mobile application user guide ↗
- Grandstream — Wave Web user guide ↗
- Grandstream — Wave application FAQ ↗
- Grandstream — UCM RemoteConnect user guide ↗
- Grandstream — UCM RemoteConnect FAQ ↗
- RingCentral — app system requirements ↗
- RingCentral — app downloads and current package records ↗
- RingCentral — desktop app release notes ↗
- RingCentral — RingCentral Phone app end-of-life and end-of-support ↗
- RingCentral — sign-in troubleshooting ↗
- RingCentral — app issue troubleshooting and diagnostic capture ↗
- RingCentral — RingEX network requirements ↗
- RingCentral — making and answering calls in the app ↗
- RingCentral — app microphone, speaker and audio settings ↗
- RingCentral — desktop and web network-quality indicators ↗
- RingCentral — Calls table in Quality of Service Analytics ↗
- RingCentral — updating an emergency response location ↗
- Zoom — getting started with Zoom Phone for users ↗
- Zoom — phone settings in Zoom Workplace and Zoom Web App ↗
- Zoom — Workplace desktop system requirements ↗
- Zoom — Workplace mobile system requirements ↗
- Zoom — Workplace app release notes ↗
- Zoom — Zoom Phone frequently asked questions ↗
- Zoom — meeting and phone statistics ↗
- Zoom — sending a Zoom Phone problem report ↗
- Zoom — network firewall and proxy settings ↗
- Zoom — Network Connectivity Tool ↗
- Zoom — troubleshooting sign-in issues ↗
- Zoom — testing device audio for Zoom Phone ↗
- Nextiva — NextivaONE support landing page ↗
- Nextiva — NextivaONE getting started and system requirements ↗
- Nextiva — NextivaONE troubleshooting tips ↗
- Nextiva — managing calls in NextivaONE ↗
- Nextiva — NextivaONE Mobile FAQs ↗
- Nextiva — setting the default NextivaONE audio device ↗
- Nextiva — gathering NextivaONE log files ↗
- Nextiva — NextivaONE call feedback ↗
- Nextiva — NextivaONE unable to log in ↗
- Nextiva — updating the NextivaONE desktop application ↗
- Nextiva — networking guidelines and NextivaONE ports ↗
- Nextiva — NEXT release notes ↗
- Nextiva — signing in to the NEXT desktop app ↗
- Microsoft Learn — Microsoft Teams client ↗
- Microsoft Learn — Teams client system requirements ↗
- Microsoft Learn — set up Teams Phone ↗
- Microsoft Learn — Teams dial pad configuration ↗
- Microsoft Support — manage Teams call settings ↗
- Microsoft Support — troubleshoot Teams mobile notifications ↗
- Microsoft Learn — configure Teams calling policies ↗
- Microsoft Learn — Teams client health dashboard ↗
- Microsoft Learn — diagnostic logs for Teams Client ↗
- Microsoft Learn — collect Teams client diagnostic logs ↗
- Microsoft Learn — monitor and troubleshoot Teams meetings and calls ↗
- Microsoft Learn — manage emergency calling policies in Teams ↗
- Microsoft Learn — Teams user location consent ↗
- Dialpad — app requirements ↗
- Dialpad — download Dialpad ↗
- Dialpad — use the Dialpad web app ↗
- Dialpad — app updates ↗
- Dialpad — your Dialpad profile ↗
- Dialpad — make a call ↗
- Dialpad — receive a call ↗
- Dialpad — check your in-app audio settings ↗
- Dialpad — network setup recommendations ↗
- Dialpad — System Test ↗
- Dialpad — app troubleshooting ↗
- Dialpad — troubleshooting outbound calls ↗
- Dialpad — Quality of Service Dashboard ↗
- Dialpad — E911 Emergency Services ↗
- Dialpad — Dynamic E911 ↗
- 8x8 — download 8x8 Work for Desktop and system requirements ↗
- 8x8 — Work for Desktop version end-of-life policy ↗
- 8x8 — get started as an XF Workspace user ↗
- 8x8 Work for Desktop — site map and capability visibility ↗
- 8x8 Work for Desktop — set your presence status ↗
- 8x8 Work for Desktop — notification and incoming-call settings ↗
- 8x8 Work for Desktop — manage call quality ↗
- 8x8 Work for Desktop — microphone noise suppression and AGC ↗
- 8x8 — use the Network Utility tool ↗
- 8x8 Network Utility — troubleshooting ↗
- 8x8 Admin Console — set up emergency address for users ↗
- 8x8 — Nomadic 911 FAQ ↗
- 8x8 — product feedback versus support cases ↗
- 8x8 — use service during an Internet or power outage ↗
- Vonage Business — Vonage Desktop App ↗
- Vonage Business — Vonage Mobile App ↗
- Vonage Business — VBC Applications Compatibility ↗
- Vonage Business — Manage Emergency Services ↗
- Vonage Business — Network Requirements and Best Practices ↗
- Vonage Business — Troubleshoot Desktop App Issues ↗
- Vonage Business — Vonage Desktop App MSI Installation ↗
- Vonage Business — Apply Extension Settings ↗
- Vonage Business — Call Continuity Service ↗
- Vonage Business — Network Quality Tool ↗
- Vonage Business — Perform Echo Test for Voice Calls ↗
- Aircall — Workspace downloads ↗
- Aircall — What is Aircall Workspace? ↗
- Aircall — Access Workspace and make calls ↗
- Aircall — Mobile device requirements for Workspace ↗
- Aircall — Device and headset recommendations ↗
- Aircall — Keeping Workspace up to date ↗
- Aircall — Workspace audio settings ↗
- Aircall — Audio quality troubleshooting guide ↗
- Aircall — Workspace network diagnostics ↗
- Aircall — Emergency address setup for US and Canada numbers ↗
- Aircall — Workspace inbound calls ↗
- Aircall — Contacting Aircall Support ↗
Examples require adaptation to your topology. No live PBX or hardware testing is claimed.