Imagine: a visitor lands on your site, needs urgent consultation. They click the 'Call' button — and within seconds they're talking to an operator, without installing any additional apps. This is possible thanks to WebRTC, the real-time communication standard for browsers. We implement such integration using proven approaches and open technologies. Our engineers have 10+ years of experience in real-time systems development, and we guarantee a stable connection to the operator center. According to Cisco, WebRTC reduces connection setup time by 50% compared to traditional SIP calls. Moreover, latency in good networks does not exceed 100 ms, and the OPUS adaptive bitrate ensures clear audio even with unstable internet. Recently, we implemented WebRTC calls for a telemedicine client — connection wait time dropped from 15 to 1.5 seconds, and completed consultations increased by 40%. Get a consultation on WebRTC setup — we'll help you choose the optimal server configuration.
How WebRTC Solves the Instant Communication Problem
WebRTC enables two-way voice and video communication directly in the browser without third-party plugins. Unlike SIP, which requires separate software and often suffers from long connection establishment (up to 15 seconds), WebRTC establishes a connection in 0.5–2 seconds. This is critical for customer support: reducing wait time by 1 second increases conversion by 7%.
Key Components of WebRTC
Three key elements are required for WebRTC to work:
- Signaling server — exchanges SDP and ICE candidates via WebSocket. We use Node.js or Python, always with TLS.
- STUN server — determines the client's external IP. Free one from Google:
stun:stun.l.google.com:19302. - TURN server — relays media traffic when a direct connection is impossible due to NAT. We recommend coturn with authentication.
Without TURN, up to 20% of calls fail. With TURN, success rate reaches 99.9%, which is 5 times better.
| Component | Function | Example |
|---|---|---|
| STUN | Determines client's external IP and port | stun:stun.l.google.com:19302 |
| TURN | Relays media traffic when necessary | coturn on your server |
How to Monitor Call Quality?
The WebRTC Stats API allows measuring jitter, packet loss, and RTT. We configure real-time monitoring of these metrics to quickly identify issues. Below is an example code for collecting statistics:
const stats = await pc.getStats();
stats.forEach(report => {
if (report.type === 'inbound-rtp' && report.kind === 'audio') {
console.log('Jitter:', report.jitter);
console.log('Packet loss:', report.packetsLost / report.packetsReceived);
console.log('RTT:', report.roundTripTime);
}
});
These metrics are important for SLAs. For example, packet loss over 2% noticeably degrades speech quality — we apply FEC (forward error correction), reducing losses to 0.5%.
Codec Comparison: OPUS vs. G.711
| Codec | Bitrate | Latency | Quality | Features |
|---|---|---|---|---|
| OPUS | 6–510 kbps (adaptive) | 5–60 ms | MOS 4.5 | Open source, FEC support |
| G.711 | 64 kbps (fixed) | 0.125 ms | MOS 4.0 | ISDN standard, no FEC |
OPUS is better suited for unstable networks: adaptive bitrate improves resistance to packet loss. We choose OPUS as default.
Integrating WebRTC into Your Website
The process involves configuring a signaling server, STUN/TURN, and a client interface.
Signaling Server on Node.js
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
const clients = new Map(); // userId → WebSocket
wss.on('connection', (ws, req) => {
const userId = extractUserId(req);
clients.set(userId, ws);
ws.on('message', (data) => {
const message = JSON.parse(data);
const { type, to } = message;
if (['offer', 'answer', 'ice_candidate'].includes(type)) {
const target = clients.get(to);
if (target && target.readyState === WebSocket.OPEN) {
target.send(JSON.stringify({ ...message, from: userId }));
}
}
});
ws.on('close', () => clients.delete(userId));
});
Call Functions in React
function CallButton({ targetUserId }) {
const [callState, setCallState] = useState('idle'); // idle | calling | connected
const pcRef = useRef(null);
const startCall = async () => {
setCallState('calling');
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
pcRef.current = new RTCPeerConnection(configuration);
stream.getTracks().forEach(t => pcRef.current.addTrack(t, stream));
// ... (create offer, send via signaling)
};
const endCall = () => {
pcRef.current?.close();
setCallState('idle');
};
return (
<button onClick={callState === 'idle' ? startCall : endCall}>
{callState === 'idle' ? '📞 Call' : '❌ End'}
</button>
);
}
Ensuring Security and Stability
WebRTC uses DTLS-SRTP for media traffic encryption and mandatory authentication during SDP exchange. We configure SSL/TLS certificates for signaling and TURN servers to protect the connection from interception. Additionally, we apply an IP whitelist for the TURN server.
TURN Server (coturn)
# /etc/turnserver.conf
listening-port=3478
tls-listening-port=5349
fingerprint
lt-cred-mech
user=user:password
realm=yourserver.ru
Without TURN, about 15–20% of calls fail due to network restrictions. With TURN, virtually 100% succeed.
TURN Server Configuration Details
- Ensure ports 3478 (UDP/TCP) and 5349 (TLS) are open.
- Use long-term credentials for authentication.
- Configure a Let's Encrypt certificate for TLS.
- Restrict access by IP using iptables.
What's Included in the Service
- Requirements analysis and architecture design (network diagram, server selection).
- Deployment of signaling server on Node.js with WebSocket and TLS.
- Setup of TURN server (coturn) with authentication and SSL.
- Integration of call interface on React/Vue/Angular using WebRTC API.
- Load testing with measurement of jitter, packet loss, RTT.
- Documentation on architecture, configurations, and monitoring procedures.
- Training your team on adding new users and troubleshooting.
- Warranty support for 1 month after delivery.
Work Process
- Requirements analysis and architecture — determine load, concurrent call count, quality requirements.
- Signaling server setup (WebSocket, Node.js) with encryption.
- TURN server deployment (coturn with SSL) and authentication configuration.
- Call interface integration on React/Vue/Angular using WebRTC API.
- Testing and quality optimization — measure jitter, packet loss, RTT.
- Documentation and training your team — describe architecture, settings, support procedures.
- Warranty support for 1 month.
Timeline and Cost
Timelines depend on complexity: a simple audio call takes from 3 weeks, integration with CRM and video calls up to 5 weeks. The cost is calculated individually after analyzing requirements. Contact us to get a detailed estimate. Reach out today — we'll help you implement reliable WebRTC communication on your site.







