Skip to main content

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 CONTAINER structure holding multiple round robin ITEM groups (identical to a standard ROUND_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:

  • bestOf bounds and rankBy values
  • Cross-group consumption (no standard group ends up with fewer than 2 participants)
  • Total claimed participants don't exceed available

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).