WebRTC VoIP Call Integration for Your Website

Our company is engaged in the development, support and maintenance of sites of any complexity. From simple one-page sites to large-scale cluster systems built on micro services. Experience of developers is confirmed by certificates from vendors.

Development and maintenance of all types of websites:

Informational websites or web applications
Business card websites, landing pages, corporate websites, online catalogs, quizzes, promo websites, blogs, news resources, informational portals, forums, aggregators
E-commerce websites or web applications
Online stores, B2B portals, marketplaces, online exchanges, cashback websites, exchanges, dropshipping platforms, product parsers
Business process management web applications
CRM systems, ERP systems, corporate portals, production management systems, information parsers
Electronic service websites or web applications
Classified ads platforms, online schools, online cinemas, website builders, portals for electronic services, video hosting platforms, thematic portals

These are just some of the technical types of websites we work with, and each of them can have its own specific features and functionality, as well as be customized to meet the specific needs and goals of the client.

Showing 1 of 1All 2062 services
WebRTC VoIP Call Integration for Your Website
Complex
~3-5 days
Frequently Asked Questions

Our competencies:

Development stages

Latest works

  • image_website-b2b-advance_0.webp
    B2B ADVANCE company website development
    1358
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1250
  • image_websites_belfingroup_462_0.webp
    Website development for BELFINGROUP
    956
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1188
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    929
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Website development for FIXPER company
    947

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

  1. Requirements analysis and architecture — determine load, concurrent call count, quality requirements.
  2. Signaling server setup (WebSocket, Node.js) with encryption.
  3. TURN server deployment (coturn with SSL) and authentication configuration.
  4. Call interface integration on React/Vue/Angular using WebRTC API.
  5. Testing and quality optimization — measure jitter, packet loss, RTT.
  6. Documentation and training your team — describe architecture, settings, support procedures.
  7. 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.

WebRTC

Development of Real-Time Systems: WebRTC, SSE, WebSocket

We know how painful it is when polling kills the server. One of our projects—an online auction platform—used polling every 2 seconds. Under a load of 400 participants, the server received 12,000 HTTP requests per minute for a single bid. 90% of responses were empty. After switching to WebSocket, the load dropped 15 times, saving approximately $3,000 per month on server costs. Order custom real‑time functions development—get a ready solution with a stability guarantee.

Implementing real‑time in production is not just a library. We design the architecture for load, scenarios, and budget. Below is a breakdown of key solutions with examples.

Choosing the Right Real-Time Transport for Your Project

Three Real-Time Transports: When to Choose Which

Server‑Sent Events work over regular HTTP/1.1 or HTTP/2. The browser opens a connection, the server keeps it open and pushes events in text/event-stream format. Automatic reconnection is built-in—no need for reconnect logic. Limitation: server → client only. Ideal for notifications, progress of long tasks, live feeds.

WebSocket is a full‑duplex channel after an HTTP Upgrade handshake. Browser and server exchange frames in both directions. Suitable for chats, collaborative editing, games, trading terminals. Requires separate reconnect logic and heartbeat (ping/pong every 30 seconds, otherwise NAT tables close the connection). The WebSocket protocol enables full‑duplex communication with minimal overhead (RFC 6455).

WebRTC is peer‑to‑peer audio/video and data directly between browsers, bypassing the server. A server is needed only for signaling (STUN/TURN for NAT traversal). A TURN server is required in 20–30% of cases (corporate networks, symmetric NAT). For a telemedicine service, we implemented WebRTC: audio latency dropped from 800 ms (via relay) to 50 ms—a 16‑fold improvement. The TURN server was needed only for 15% of sessions, saving significant traffic costs.

How to Properly Choose a Transport: Step-by-Step Guide

  1. Determine the data exchange scenario: unidirectional (server → client) — SSE; bidirectional with low latency — WebSocket; audio/video — WebRTC.
  2. Evaluate latency requirements. If below 500 ms is acceptable — SSE; for below 100 ms and bidirectional — WebSocket; for below 50 ms and P2P — WebRTC.
  3. Check the infrastructure budget. SSE uses regular HTTP servers, WebSocket requires keeping connections in memory, WebRTC may require a TURN server (from a certain cost per TB of traffic).
  4. Consider scaling: for 100k+ connections, consider a WebSocket gateway (Centrifugo, Pushpin).
Transport Direction Latency Implementation Complexity Typical Scenarios
WebSocket Full duplex < 100 ms Medium Chats, games, trading
SSE Server → client only < 500 ms Low Notifications, progress feeds
WebRTC P2P audio/video/data < 50 ms High Video calls, file transfer

What Is CRDT and How Is It Better Than Operational Transformation?

Collaborative editing is not just "whoever writes last wins". Without a conflict merging algorithm, two users insert text at position 45; the first saves—the position shifts; the second saves on top—the operation applies to an outdated state. Text gets duplicated or lost.

OT (Operational Transformation) requires a server to resolve conflicts; CRDT (Conflict‑free Replicated Data Types) works without a central coordinator. Yjs is the most mature CRDT library for the browser. It integrates with ProseMirror, TipTap, CodeMirror, Monaco Editor. CRDT (Yjs) is 5 times faster than OT for concurrent editing under high load.

Library comparison for collaborative editing

Library Algorithm Editor Support Complexity Performance
Yjs CRDT ProseMirror, TipTap, CodeMirror, Monaco Medium High (<10 ms at 100 ops)
ShareDB OT ProseMirror, Quill Medium Medium (requires merge server)
Automerge CRDT Any (RichText) High Good (but memory grows faster than Yjs)

Issue: the Yjs document size grows due to operation history. Periodic garbage collection is needed—snapshot the document and clean old operations. Without it, a document worked on for a year may weigh 50 MB.

WebSocket Heartbeat Example (Node.js)
const ws = new WebSocket('wss://example.com');
let pingInterval;

ws.on('open', () => {
  pingInterval = setInterval(() => {
    ws.ping();
    setTimeout(() => {
      if (ws.readyState === WebSocket.OPEN) ws.terminate();
    }, 5000);
  }, 25000);
});

ws.on('close', () => clearInterval(pingInterval));

Common Mistakes in Real-Time Implementation and How to Avoid Them

Typical Mistakes in Real‑Time Implementation

Memory leak on the server—forgetting to remove the event handler when the connection closes. On Node.js, heap grows ~1 MB/hour. EventEmitter warns about 10+ listeners, but it's not always noticed.

Thundering herd on reconnect. The server goes down for 30 seconds, comes back—10,000 clients try to reconnect simultaneously. Exponential backoff with jitter is mandatory: delay = Math.min(baseDelay * 2^attempt + random(0, 1000), maxDelay).

Lack of connection lost indication. WebSocket doesn't always notify about disconnection (e.g., phone enters a tunnel). Heartbeat solves the problem.

Work Process

We start by choosing the transport for the scenarios—sometimes all three are needed in one project: SSE for system notifications, WebSocket for chat, WebRTC for video calls. We design the message protocol (JSON with type and payload, less often binary via MessagePack). We develop with race condition testing—this is not covered by unit tests.

Load testing with k6 + k6/experimental/websockets: we simulate 5,000 concurrent connections with a real pattern. Our engineers are certified in WebSocket and WebRTC, guaranteeing 99.9% stability.

What's Included in the Delivery

  • Real‑time layer architecture (transport selection, message protocol)
  • Implementation with load testing (k6, race condition scenarios)
  • Backend integration via Redis Pub/Sub or similar bus
  • Protocol and data schema documentation
  • Team training
  • Technical support for 2 weeks after launch

Why Centrifugo May Be More Cost-Effective Than Socket.io?

Socket.io is easier to set up (1–2 days), but Centrifugo built on Go handles 1M+ connections on a single node. For 100k concurrent clients, Centrifugo saves up to 40% on infrastructure costs, which translates to $2,000 per month compared to Socket.io. Get a consultation—we'll help you choose the stack for your load.

Timeline

  • Basic WebSocket chat or notifications on top of existing API: 1–3 weeks.
  • Collaborative editor with Yjs and persistence: 4–8 weeks.
  • WebRTC video calls with recording: 6–12 weeks (significant part is integration with media server mediasoup or Janus).

Contact us to evaluate your project. Discuss your task with an engineer—we'll assess complexity and timeline individually.