TURN Servers for Multiplayer Games

Stop losing players to NAT. Standards-based TURN that drops into Godot, Unity, Unreal, GDevelop, Construct, and Pion. 1 TB free, 5 TB for $9/month.

"It works in playtest, then players can't connect"

Almost every multiplayer-game-built-on-WebRTC story has the same Day 14 plot twist. The dev plays with friends on the same network — flawless. They ship a beta. Half the players get stuck on the matchmaking screen. The dev opens chrome://webrtc-internals and sees ICE failing because both peers are behind symmetric NATs.

You need a TURN fallback. Without one, a sizable chunk of your audience — anyone behind a carrier-grade NAT, dorm Wi-Fi, certain residential ISPs — simply cannot play with each other. The cheapest correct answer is a hosted TURN service that drops into the engine you already use.

Engines we already see in our paid customers

GDevelop and similar browser-game platforms already pay for ExpressTURN. The pattern works for any engine that exposes WebRTC's RTCConfiguration:

  • Godot 4WebRTCPeerConnection.initialize({"iceServers": ...}).
  • Unity — Unity WebRTC package, RTCConfiguration.iceServers.
  • Unreal Engine — Pixel Streaming or third-party WebRTC plugin, ICE config in your signaling server.
  • GDevelop — P2P extension; set TURN URL/user/cred in the configuration block.
  • Construct 3 — Multiplayer plugin's TURN settings.
  • PlayCanvas / Babylon.js / Three.js — Direct browser WebRTC, drop credentials into your RTCPeerConnection config.
  • Pion (Go) — Server-authoritative or relay-host games; pass URLs to webrtc.Configuration.

Godot 4 example

var peer = WebRTCPeerConnection.new()
peer.initialize({
    "iceServers": [
        { "urls": ["stun:stun.expressturn.com:3478"] },
        {
            "urls": [
                "turn:relay1.expressturn.com:3478?transport=udp",
                "turn:relay1.expressturn.com:3478?transport=tcp",
                "turns:relay1.expressturn.com:443?transport=tcp"
            ],
            "username": "YOUR_EXPRESSTURN_USERNAME",
            "credential": "YOUR_EXPRESSTURN_PASSWORD"
        }
    ]
})

Unity example

var config = new RTCConfiguration {
    iceServers = new[] {
        new RTCIceServer { urls = new[] { "stun:stun.expressturn.com:3478" } },
        new RTCIceServer {
            urls = new[] {
                "turn:relay1.expressturn.com:3478?transport=udp",
                "turn:relay1.expressturn.com:3478?transport=tcp",
                "turns:relay1.expressturn.com:443?transport=tcp"
            },
            username = "YOUR_EXPRESSTURN_USERNAME",
            credential = "YOUR_EXPRESSTURN_PASSWORD"
        }
    }
};
var pc = new RTCPeerConnection(ref config);

Bandwidth math for games

  • Game state only (positions, inputs): ~5–50 kbps per player.
  • Add Opus voice chat: +30 kbps per voice link.
  • 4-player full-mesh with voice chat, all relayed: ~240 kbps total = ~110 MB/hour.
  • Free 1 TB plan = ~9,000 session-hours per month relayed.
  • Premium 5 TB = ~45,000 session-hours per month relayed.

And remember — only the players who actually need TURN consume relay bandwidth. The rest connect directly.

Premium = scale-friendly auth

The free tier uses long-term credentials, which is fine when you have one set baked into your client. Premium adds shared-secret authentication: your server hands each player a fresh, time-limited TURN credential. This matters when you have many users and don't want a leaked APK or webpack bundle to expose a shared password.

FAQ

Why does a peer-to-peer game need a TURN server?

Most home and mobile networks sit behind NATs. STUN succeeds for cone NATs but fails for symmetric NATs and carrier-grade NATs. Without a TURN fallback, players on those networks simply cannot connect.

Does ExpressTURN work with Godot, Unity, and Unreal?

Yes. All three engines accept standard ICE server URLs. Pass ExpressTURN's TURN URL plus your username and credential.

How many concurrent players can the free 1 TB tier support?

A 4-player session with voice chat uses about 110 MB/hour. Free 1 TB supports roughly 9,000 session-hours per month — and only relayed players consume that bandwidth.

What's the latency penalty?

Zero for direct/STUN connections. For relayed players, typically 10–40 ms when you pick a TURN region close to the player.

Stop losing players. Add TURN today.

Sign Up — Free 1 TB/month

Related: TURN for streaming · TURN for social apps · Godot recipe · Pion recipe