Round Robin with Playoff
Overview
A Round Robin with Playoff draw combines group play with subsequent knockout playoff structures. Participants first compete in round robin groups, then advance to playoff brackets based on their finishing positions within their groups.
In the factory, this draw type is represented by the constant ROUND_ROBIN_WITH_PLAYOFF.
Structure
- Group stage: A
CONTAINERstructure holding multiple round robinITEMgroups (identical to a standardROUND_ROBIN). - Playoff structures: One or more single elimination structures that receive participants based on their finishing positions in the group stage.
- Links: Position-based links connect group finishing positions to playoff draw positions.
Group Stage:
Group A: P1, P2, P3, P4 --> 1st, 2nd, 3rd, 4th
Group B: P5, P6, P7, P8 --> 1st, 2nd, 3rd, 4th
Playoff (Gold): Group winners --> Semifinal bracket
Playoff (Silver): Group 2nd place --> Consolation bracket
Playoff Configuration
The playoffAttributes parameter controls how many playoff structures are generated and which finishing positions feed into each:
const { drawDefinition } = engine.generateDrawDefinition({
drawSize: 16,
drawType: 'ROUND_ROBIN_WITH_PLAYOFF',
structureOptions: {
groupSize: 4,
playoffGroups: [
{ finishingPositions: [1, 2], structureName: 'Gold' },
{ finishingPositions: [3, 4], structureName: 'Silver' },
],
},
});
This creates:
- 4 round robin groups of 4 participants each.
- A "Gold" playoff bracket receiving the top 2 from each group (8 participants).
- A "Silver" playoff bracket receiving positions 3-4 from each group (8 participants).
Best Finishers (Cross-Group Advancement)
When you need to advance a number of participants that isn't evenly divisible by the number of groups, use the bestOf option. This selects all participants from the specified finishingPositions, then fills remaining slots with the best-ranked participants from subsequent finishing positions using cross-group comparison via GEMscore.
This follows the same pattern used by major tournaments such as the FIFA World Cup (best third-placed teams), UEFA Euro (best third-place), and the NBA Cup (wild cards).
const { drawDefinition } = engine.generateDrawDefinition({
drawSize: 12,
drawType: 'ROUND_ROBIN_WITH_PLAYOFF',
structureOptions: {
groupSize: 4,
playoffGroups: [
{
finishingPositions: [1],
bestOf: 4,
rankBy: 'GEMscore',
structureName: 'Championship',
},
],
},
});
With 3 groups, this advances:
- All 3 group winners (guaranteed by
finishingPositions: [1]) - The 1 best second-place finisher across all groups, ranked by
GEMscore
The bestOf value must be:
- Greater than or equal to
groupCount × finishingPositions.length(the guaranteed count) - Less than or equal to
groupCount × groupSize(total participants)
Mixed configurations
bestOf playoff groups can coexist with standard playoff groups:
playoffGroups: [
{ finishingPositions: [1], bestOf: 4, rankBy: 'GEMscore', structureName: 'Championship' },
{ finishingPositions: [3, 4], structureName: 'Consolation' },
]
The system tracks participant consumption across groups: if bestOf consumes some second-place finishers, subsequent groups targeting those positions will have fewer participants available.
Validation
Use validatePlayoffGroups() to check a configuration before generating:
const { valid, info } = engine.validatePlayoffGroups({
playoffGroups,
groupCount,
groupSize,
});
This validates:
bestOfbounds andrankByvalues- Cross-group consumption (no standard group ends up with fewer than 2 participants)
- Total claimed participants don't exceed available
POSITION link metadata
When bestOf is specified, the generated POSITION link includes the additional fields on source:
{
linkType: 'POSITION',
source: {
structureId: '...',
finishingPositions: [1],
bestOf: 4,
rankBy: 'GEMscore',
},
target: { ... }
}
The positioning engine reads these fields to select participants via cross-group ranking rather than strict finishing-position matching.
Use Cases
- Tournament formats that combine the fairness of round robin play with the excitement of knockout rounds.
- World Cup-style formats where group winners and runners-up advance to a bracket.
- Events that need to determine finishing positions for all participants, not just the winner.
- Formats where the number of advancing participants is not evenly divisible by the number of groups (e.g., 4 from 3 groups).
Related
- Round Robin -- Group play without playoffs
- Finishing Positions -- How finishing positions propagate through linked structures
- Draw Links -- How position-based links connect groups to playoffs
- Draw Types Overview -- List of all pre-defined draw types