Skip to main content

Matchmaking Overview

GameFlow matchmaking groups players into balanced matches and hands each match a dedicated server, without you writing or hosting a matchmaking backend. You build the matching rules visually in the dashboard, and your game backend talks to a small ticket API.

Two ways to fill a server

GameFlow gives you two ways to get players onto a dedicated server:

  • Direct allocation. Your backend already knows who plays together (a lobby, a party, an invite). It calls the fleet API to start a server and passes the roster in the payload. See Custom Game Backend.
  • Matchmaking. Your backend does not know who plays together yet. It enqueues a ticket per player, and GameFlow groups compatible tickets into a match and allocates the server for you. This is what this section covers.

Use matchmaking when players click "find a match" and you want GameFlow to decide who plays with whom.

Core concepts

ConceptWhat it is
TicketA request to be matched. Carries the player id, game mode, preferred region, a rating, and any custom attributes.
MatchmakerA per-game rule engine you build as a visual graph. It decides which tickets can match and how teams are formed.
Game modeThe key that routes a ticket to a matchmaker. A ticket with game_mode = ranked is matched by the matchmaker that listens for ranked.
Flow graphThe matchmaker's rules, drawn as nodes and connections. Tickets flow from a Ticket Input node to an Output node.
RatingA skill estimate (mu, sigma, rating_bucket) carried on the ticket. Only used if the matchmaker has a Skill Rule. FIFO ignores it.
Draft and LiveYou build a matchmaker in draft, then publish it to go live. Only a live matchmaker matches real tickets.

How a match is made

┌─────────────┐   find match   ┌──────────────┐   POST ticket   ┌──────────────────┐
│ Game Client │ ─────────────► │ Your Backend │ ──────────────► │ GameFlow │
│ │ │ (holds key) │ │ Matchmaking │
└─────────────┘ └──────────────┘ ◄────────────── └──────────────────┘
▲ │ poll status │
│ │ (long-poll) │ groups
│ connection details │ │ compatible
└──────────────────────────────┘ ◄──── { connection: host:port } ──┘ tickets,
once a match is formed allocates
a server
  1. A player asks your backend to find a match.
  2. Your backend creates a ticket on GameFlow (it holds the API key, so the client never sees it).
  3. GameFlow's live matchmaker for that game mode groups compatible tickets into a match.
  4. When the match forms, GameFlow allocates a dedicated server and returns its address and port on the ticket's status.
  5. Your backend forwards the connection to the players, and they join the server.

Your backend never runs matching logic. It enqueues tickets and waits for a server.

Where to go next