Skip to content

Structure

This page explains the structure of a tournament in more details. For the basis, read the Glossary.

The storage hierarchy is always the same: a stage contains groups, groups contain rounds, and rounds contain matches. Matches can also contain match games when you use Best-Of-X.

flowchart LR
    stage["Stage"]
    group["Group"]
    round["Round"]
    match["Match"]
    matchGame["Match game"]

    stage --> group
    group --> round
    round --> match
    match -. "optional Best-Of-X games" .-> matchGame

    classDef stageNode fill:#dbeafe,stroke:#2563eb,color:#1e3a8a;
    classDef groupNode fill:#dcfce7,stroke:#16a34a,color:#166534;
    classDef roundNode fill:#fef3c7,stroke:#d97706,color:#92400e;
    classDef matchNode fill:#e2e8f0,stroke:#475569,color:#334155;
    classDef participantNode fill:#fee2e2,stroke:#dc2626,color:#991b1b;

    class stage stageNode;
    class group groupNode;
    class round roundNode;
    class match,matchGame matchNode;
Color Meaning
Stage
Group
Round
Match or match game
Participant outcome (winner/losers)

Round-robin

In round-robin stages, each group is a pool, which contains rounds, which contain matches.

flowchart TB
    stage["Round-robin stage"]
    group1["Group 1: pool"]
    group2["Group 2: pool"]
    round11["Round 1"]
    round12["Round 2"]
    round21["Round 1"]
    round22["Round 2"]
    match111["Match 1"]
    match112["Match 2"]
    match211["Match 1"]
    match212["Match 2"]

    stage --> group1
    stage --> group2
    group1 --> round11
    group1 --> round12
    group2 --> round21
    group2 --> round22
    round11 --> match111
    round12 --> match112
    round21 --> match211
    round22 --> match212

    classDef stageNode fill:#dbeafe,stroke:#2563eb,color:#1e3a8a;
    classDef groupNode fill:#dcfce7,stroke:#16a34a,color:#166534;
    classDef roundNode fill:#fef3c7,stroke:#d97706,color:#92400e;
    classDef matchNode fill:#e2e8f0,stroke:#475569,color:#334155;
    classDef participantNode fill:#fee2e2,stroke:#dc2626,color:#991b1b;

    class stage stageNode;
    class group1,group2 groupNode;
    class round11,round12,round21,round22 roundNode;
    class match111,match112,match211,match212 matchNode;

Single elimination

In single elimination stages, there is at least one group (the "unique bracket"), which contains rounds, which contain matches.

The unique bracket yields one winner, and multiple losers.

If the stage is configured to have a Consolation Final, it is also a group with a single round containing a single match, matching both semi-final losers.

flowchart TB
    stage["Single elimination stage"]
    bracket["Unique bracket group"]
    bracketRounds["Bracket rounds"]
    bracketWinner(["Stage winner"])
    semifinalLosers(["Semi-final losers"])
    consolationGroup["Consolation Final group"]
    consolationRound["Round 1"]
    consolationMatch["Match 1"]

    subgraph groupsRow[" "]
        direction LR
        bracket
        consolationGroup
    end

    style groupsRow fill:none,stroke:none

    stage --> bracket
    bracket --> bracketRounds
    bracketRounds --> bracketWinner
    bracketRounds -. "if Consolation Final is enabled" .-> semifinalLosers
    stage -. "if Consolation Final is enabled" .-> consolationGroup
    semifinalLosers --> consolationMatch
    consolationGroup --> consolationRound
    consolationRound --> consolationMatch

    classDef stageNode fill:#dbeafe,stroke:#2563eb,color:#1e3a8a;
    classDef groupNode fill:#dcfce7,stroke:#16a34a,color:#166534;
    classDef roundNode fill:#fef3c7,stroke:#d97706,color:#92400e;
    classDef matchNode fill:#e2e8f0,stroke:#475569,color:#334155;
    classDef participantNode fill:#fee2e2,stroke:#dc2626,color:#991b1b;

    class stage stageNode;
    class bracket,consolationGroup groupNode;
    class bracketRounds,consolationRound roundNode;
    class consolationMatch matchNode;
    class bracketWinner,semifinalLosers participantNode;

Double elimination

In double elimination stages, there are at least two groups: the upper bracket (a.k.a. "winner bracket") and the lower bracket (a.k.a. "loser bracket"). There may also be a final group for the Grand Final, the Consolation Final, or both.

The upper bracket yields one winner, and multiple losers.

The lower bracket only yields one winner, which may play in the Grand Final against the winner of the upper bracket.

If the stage is configured to have a Grand Final, it is also a group with one or two rounds (depending on settings.grandFinal), each containing a single match, matching the winner of the upper bracket and the winner of the lower bracket.

If the WB winner wins, it's the winner of the stage. But if it loses, the final is reset and there is a very last match, known as the reset match. It gives the WB winner the right to lose once during the stage. This is commonly known as "resetting the bracket".

If the stage is configured to have a Consolation Final, any existing final group is reused. For example, a double elimination stage with both a Grand Final and Consolation Final will share the same final group.

For the Consolation Final, a round is created with a single match, matching both upper bracket semi-final losers.

Technical detail about the consolation final

In order to differentiate the Grand Final and Consolation Final matches which always are number: 1, the Consolation Final match is arbitrarily set to number: 2 although it's the only match in its round.

flowchart TB
    stage["Double elimination stage"]
    upper["Upper bracket group"]
    lower["Lower bracket group"]
    finalGroup["Final group"]
    upperRounds["Upper bracket rounds"]
    lowerRounds["Lower bracket rounds"]
    upperWinner(["Upper bracket winner"])
    lowerWinner(["Lower bracket winner"])
    grandFinal["Grand Final round(s)"]
    resetMatch["Reset match"]
    upperSemiLosers(["Upper bracket semi-final losers"])
    consolationFinal["Consolation Final round"]

    stage --> upper
    stage --> lower
    stage -. "if Grand Final or Consolation Final is enabled" .-> finalGroup
    upper --> upperRounds
    lower --> lowerRounds
    upperRounds -- "losers drop to" --> lowerRounds
    upperRounds --> upperWinner
    lowerRounds --> lowerWinner
    finalGroup --> grandFinal
    upperWinner --> grandFinal
    lowerWinner --> grandFinal
    grandFinal -. "if the lower bracket winner wins first" .-> resetMatch
    upperRounds -. "if Consolation Final is enabled" .-> upperSemiLosers
    finalGroup -. "reused when it already exists" .-> consolationFinal
    upperSemiLosers --> consolationFinal

    classDef stageNode fill:#dbeafe,stroke:#2563eb,color:#1e3a8a;
    classDef groupNode fill:#dcfce7,stroke:#16a34a,color:#166534;
    classDef roundNode fill:#fef3c7,stroke:#d97706,color:#92400e;
    classDef matchNode fill:#e2e8f0,stroke:#475569,color:#334155;
    classDef participantNode fill:#fee2e2,stroke:#dc2626,color:#991b1b;

    class stage stageNode;
    class upper,lower,finalGroup groupNode;
    class upperRounds,lowerRounds,grandFinal,resetMatch,consolationFinal roundNode;
    class upperWinner,lowerWinner,upperSemiLosers participantNode;

Opponent position property in matches

The position property in opponent1 and opponent2 in a match is used to display the opponent's origin in the UI.

It holds the match number of the match whose winner will fill the current participant slot in the match.

For example, the match LB 1.1 (loser bracket, round 1, match 1) has the following values:

{
    "opponent1": {
        "id": null, // TBD
        "position": 1
    },
    "opponent2": {
        "id": null, // TBD
        "position": 2
    }
}

Although we don't know the opponent IDs yet, we know their source in advance. So in the UI, we show:

LB 1.1 Opponents
opponent1 Loser of WB 1.1
opponent2 Loser of WB 1.2