Cloudflare Calls is an SFU + TURN bundle. ExpressTURN is TURN-only. Pick what fits your stack.
Cloudflare Calls is a SaaS WebRTC platform: SFU + TURN + signaling primitives bundled together. ExpressTURN is a focused TURN provider you bolt onto your own SFU (mediasoup, Janus, LiveKit, Pion, etc.) or peer-to-peer pipeline. If you want a managed SFU, look at Cloudflare Calls. If you've already built or chosen an SFU and just need TURN, ExpressTURN is far cheaper.
| Dimension | Cloudflare Calls | ExpressTURN |
|---|---|---|
| Scope | SFU + TURN + signaling primitives | TURN-only relay |
| Pricing model | Metered per-GB (check Cloudflare's current Calls pricing) | Free 1 TB; flat $9 for 5 TB |
| SFU media routing | Built in | N/A — you bring your own SFU |
| Lock-in | Cloudflare-specific API | Standard RFC 5766/8656; switch any time |
| Network footprint | Cloudflare's global edge | 20+ regions, dedicated to TURN |
| Custom server-side logic | Limited to what their API exposes | Your own SFU, full control |
Some teams use Cloudflare Workers for signaling, run their own SFU on a VPS, and use ExpressTURN for relay. Each piece is best-of-breed and replaceable.
If you're considering moving off Cloudflare Calls and onto your own SFU + ExpressTURN, the TURN piece looks like:
const pc = new RTCPeerConnection({
iceServers: [
{ urls: 'stun:stun.expressturn.com:3478' },
{
urls: ['turn:relay1.expressturn.com:3478?transport=udp',
'turns:relay1.expressturn.com:443?transport=tcp'],
username: 'YOUR_EXPRESSTURN_USERNAME',
credential: 'YOUR_EXPRESSTURN_PASSWORD'
}
]
});
The harder part is the SFU swap, not the TURN swap. See our mediasoup, LiveKit, Janus, and Pion recipes.
Bring your own SFU. We'll be your relay.
Sign Up FreeRelated: vs Twilio · TURN for streaming