Where Do Scrums Come From?

Scrum Sources in the Six Nations, 2023–2026

Author

Michael Harding

Published

June 13, 2026

Show code
library(tidyverse)
library(readxl)
library(gt)
library(scales)

# The xlsx must sit in the same folder as this qmd when rendering
data_file <- "JJ_Scrums.xlsx"

# Read everything as text - the sheet is four stacked year blocks,
# not a tidy table, so we parse it manually
raw <- read_excel(data_file, col_names = FALSE, col_types = "text")

# Year header rows mark the start of each block
year_rows  <- which(raw[[1]] %in% as.character(2023:2026))
block_ends <- c(year_rows[-1] - 1, nrow(raw))

# Pull each block out: column 1 = category, columns 2-16 = the 15 matches
parse_block <- function(s, e) {
  yr <- as.integer(raw[[1]][s])
  raw[seq(s + 1, e), ] |>
    rename(category = 1) |>
    filter(!is.na(category)) |>
    select(category, 2:16) |>
    rename_with(~ paste0("m", 1:15), .cols = 2:16) |>
    mutate(across(starts_with("m"), as.numeric),
           year = yr)
}

scrums <- map2(year_rows, block_ends, parse_block) |>
  bind_rows() |>
  pivot_longer(starts_with("m"), names_to = "match", values_to = "count") |>
  mutate(count    = replace_na(count, 0),
         category = str_trim(category))

# Season-level summary. Matches = match columns with at least one
# scrum coded, so partial seasons (2026) are handled automatically
season_summary <- scrums |>
  group_by(year) |>
  summarise(
    total_scrums = sum(count),
    matches      = n_distinct(match[count > 0]),
    per_match    = total_scrums / matches,
    .groups = "drop"
  )

# Share of season total by category
shares <- scrums |>
  group_by(year, category) |>
  summarise(total = sum(count), .groups = "drop_last") |>
  mutate(share = total / sum(total)) |>
  ungroup()

# Group the raw Sportscode categories into broader themes
theme_lookup <- tribble(
  ~category,                              ~theme,
  "Knock On In Phase Play",               "Handling in open play",
  "Forward Pass",                         "Handling in open play",
  "Knock On in Tackle or Turnover",       "Handling in open play",
  "Ball Unplayable",                      "Handling in open play",
  "Crossing",                             "Handling in open play",
  "Knock On Chasing Own Kick",            "Kicking game",
  "Knock On Opp Kick Receiving",          "Kicking game",
  "Kicked Dead",                          "Kicking game",
  "Not Kicked 10m",                       "Kicking game",
  "Receiving A Restart",                  "Kicking game",
  "Lineout Not Straight",                 "Set piece",
  "Lineout Jumper Knock On In The Air",   "Set piece",
  "Turnover From Lineout Maul Defence",   "Set piece",
  "Lineout Receiver Change",              "Set piece",
  "Option From Full Penalty",             "Penalty / free-kick option",
  "Option From Half Arm Pen Restart",     "Penalty / free-kick option",
  "Choke Tackle",                         "Defensive pressure",
  "Jackaller Knock On / Rip and Knock On","Defensive pressure",
  "Carried Over Own Try Line",            "Defensive pressure",
  "Injury Stoppage",                      "Other",
  "No Tap From a Tap and Go",             "Other"
)

shares <- shares |> left_join(theme_lookup, by = "category")

Introduction

The scrum is rugby’s reset button, but every scrum has a story behind it — a knock-on under pressure, a wobbly lineout throw, a spilled high ball. Over the last four Six Nations championships I have coded the cause of every scrum awarded, building a picture of why scrums happen at Test level and how that picture is shifting.

This report covers the 2023, 2024 and 2025 championships in full, plus the first three rounds of 2026. All data was collected and coded by the author in Hudl Sportscode.

How many scrums are there?

Show code
season_summary |>
  gt() |>
  cols_label(
    year         = "Championship",
    total_scrums = "Scrums",
    matches      = "Matches coded",
    per_match    = "Scrums per match"
  ) |>
  fmt_number(columns = per_match, decimals = 1) |>
  tab_source_note("2026 is a partial season; remaining rounds to be added.") |>
  opt_row_striping()
Table 1
Championship Scrums Matches coded Scrums per match
2023 157 15 10.5
2024 159 15 10.6
2025 153 15 10.2
2026 65 6 10.8
2026 is a partial season; remaining rounds to be added.

Scrum volume has been remarkably stable: roughly 10 to 11 scrums per match in every championship since 2023. Whatever the law makers change around the scrum, the rate at which the game produces them has barely moved.

What has moved is where they come from.

What causes a scrum?

Show code
baseline <- shares |>
  filter(year < 2026) |>
  group_by(category) |>
  summarise(total = sum(total), .groups = "drop") |>
  mutate(share = total / sum(total), period = "2023–25")

current <- shares |>
  filter(year == 2026) |>
  transmute(category, total, share, period = "2026 (partial)")

comparison <- bind_rows(baseline, current) |>
  # order categories by baseline share, largest at the top
  mutate(category = fct_reorder(category, share,
                                .fun = \(x) max(x[1]), .desc = FALSE))

cat_order <- baseline |> arrange(share) |> pull(category)

comparison |>
  mutate(category = factor(category, levels = cat_order)) |>
  filter(!is.na(category)) |>
  ggplot(aes(x = share, y = category, colour = period)) +
  geom_line(aes(group = category), colour = "grey75", linewidth = 1) +
  geom_point(size = 3) +
  scale_x_continuous(labels = percent_format(accuracy = 1)) +
  scale_colour_manual(values = c("2023–25" = "grey40",
                                 "2026 (partial)" = "#C8102E")) +
  labs(x = "Share of all scrums", y = NULL, colour = NULL,
       title = "Scrum sources, 2026 vs the three-season baseline") +
  theme_minimal(base_size = 12) +
  theme(legend.position = "top",
        panel.grid.minor = element_blank())
Figure 1: Scrum sources: 2026 so far vs the 2023–2025 baseline

The headline is no surprise to anyone who watches the game: the knock-on in phase play is the engine room of scrum production, accounting for close to half of all scrums.

Show code
shares |>
  filter(category == "Knock On In Phase Play") |>
  ggplot(aes(x = factor(year), y = share)) +
  geom_col(fill = "#C8102E", width = 0.6) +
  geom_text(aes(label = percent(share, accuracy = 0.1)),
            vjust = -0.5, fontface = "bold") +
  scale_y_continuous(labels = percent_format(accuracy = 1),
                     limits = c(0, 0.58)) +
  labs(x = NULL, y = "Share of all scrums") +
  theme_minimal(base_size = 12) +
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor = element_blank())
Figure 2: Knock-on in phase play as a share of all scrums, by championship

Worth noting the step change here. In 2023 the phase-play knock-on produced just over a third of scrums (36%). From 2024 onwards it has sat around the 46–49% mark. Teams are playing more phases at higher tempo, defences are getting more aggressive in the collision, and the result is more handling errors in open play.

The law change shows up in the data

In May 2024 World Rugby removed the scrum option from free kicks: from 1 July 2024, a free kick must be tapped or kicked. The 2025 championship was the first Six Nations played under the new law, and the data tells the story perfectly.

Show code
shares |>
  filter(theme == "Penalty / free-kick option") |>
  select(year, category, total) |>
  pivot_wider(names_from = year, values_from = total, values_fill = 0) |>
  gt() |>
  cols_label(category = "Scrum source") |>
  tab_spanner(label = "Scrums per championship", columns = -category) |>
  tab_source_note("Scrum option from a free kick removed from 1 July 2024.") |>
  opt_row_striping()
Table 2
Scrum source
Scrums per championship
2023 2024 2025 2026
Option From Full Penalty 9 7 2 2
Option From Half Arm Pen Restart 5 5 0 0
Scrum option from a free kick removed from 1 July 2024.

Free-kick scrums went from a steady five per championship to zero overnight, exactly what the law intended. More interesting is the collapse in full-penalty scrum options, from nine in 2023 down to just two in 2025. Even where teams can still choose a scrum, they increasingly don’t.

2026: a kicking-game spike worth watching

Show code
shares |>
  filter(category %in% c("Knock On Chasing Own Kick",
                         "Knock On Opp Kick Receiving")) |>
  ggplot(aes(x = factor(year), y = share, fill = category)) +
  geom_col(width = 0.65) +
  scale_y_continuous(labels = percent_format(accuracy = 1)) +
  scale_fill_manual(values = c("Knock On Chasing Own Kick"   = "#C8102E",
                               "Knock On Opp Kick Receiving" = "grey45"),
                    labels = c("Chasing own kick", "Receiving opposition kick")) +
  labs(x = NULL, y = "Share of all scrums", fill = NULL) +
  theme_minimal(base_size = 12) +
  theme(legend.position = "top",
        panel.grid.major.x = element_blank(),
        panel.grid.minor = element_blank())
Figure 3: Scrums caused by kick-chase and kick-receipt knock-ons, share by championship

The early 2026 rounds show a clear spike in scrums coming from the aerial battle. Knock-ons while chasing your own kick are running at around 12% of all scrums so far, roughly double the 5–7% range of the previous three championships. Combined with knock-ons receiving the opposition’s kick, the kicking game is currently producing close to one in five scrums.

It is early in the championship and the sample is small, so treat this with care. But it fits the eye test: more contestable box kicks, more bodies committed to the chase and escort lines, and more 50/50 balls hitting the deck.

The full picture by theme

Show code
theme_shares <- shares |>
  filter(!is.na(theme)) |>
  group_by(year, theme) |>
  summarise(share = sum(share), .groups = "drop") |>
  mutate(theme = fct_reorder(theme, share, .fun = sum, .desc = TRUE))

theme_shares |>
  ggplot(aes(x = factor(year), y = share, fill = theme)) +
  geom_col(width = 0.65) +
  scale_y_continuous(labels = percent_format(accuracy = 1)) +
  scale_fill_brewer(palette = "Dark2") +
  labs(x = NULL, y = "Share of all scrums", fill = NULL) +
  theme_minimal(base_size = 12) +
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor = element_blank())
Figure 4: Scrum sources grouped by theme, share of each championship
Show code
shares |>
  select(year, theme, category, total, share) |>
  pivot_wider(names_from = year, values_from = c(total, share),
              values_fill = 0) |>
  arrange(theme, desc(total_2025)) |>
  group_by(theme) |>
  gt() |>
  cols_label(
    category   = "Scrum source",
    total_2023 = "2023", total_2024 = "2024",
    total_2025 = "2025", total_2026 = "2026*",
    share_2023 = "2023", share_2024 = "2024",
    share_2025 = "2025", share_2026 = "2026*"
  ) |>
  tab_spanner(label = "Scrums",          columns = starts_with("total")) |>
  tab_spanner(label = "Share of season", columns = starts_with("share")) |>
  fmt_percent(columns = starts_with("share"), decimals = 1) |>
  tab_source_note("*2026 figures are partial.") |>
  opt_row_striping() |>
  tab_options(table.font.size = px(13))
Table 3
Scrum source
Scrums
Share of season
2023 2024 2025 2026* 2023 2024 2025 2026*
Defensive pressure
Carried Over Own Try Line 7 2 8 2 4.5% 1.3% 5.2% 3.1%
Choke Tackle 9 6 5 2 5.7% 3.8% 3.3% 3.1%
Jackaller Knock On / Rip and Knock On 5 1 4 2 3.2% 0.6% 2.6% 3.1%
Handling in open play
Knock On In Phase Play 57 78 74 30 36.3% 49.1% 48.4% 46.2%
Forward Pass 7 9 11 5 4.5% 5.7% 7.2% 7.7%
Knock On in Tackle or Turnover 9 4 10 1 5.7% 2.5% 6.5% 1.5%
Ball Unplayable 5 1 1 0 3.2% 0.6% 0.7% 0.0%
Crossing 1 0 0 0 0.6% 0.0% 0.0% 0.0%
Kicking game
Knock On Chasing Own Kick 8 8 11 8 5.1% 5.0% 7.2% 12.3%
Knock On Opp Kick Receiving 11 13 9 4 7.0% 8.2% 5.9% 6.2%
Kicked Dead 4 3 2 2 2.5% 1.9% 1.3% 3.1%
Receiving A Restart 2 2 2 1 1.3% 1.3% 1.3% 1.5%
Not Kicked 10m 0 0 1 0 0.0% 0.0% 0.7% 0.0%
Other
Injury Stoppage 1 1 2 0 0.6% 0.6% 1.3% 0.0%
No Tap From a Tap and Go 0 0 0 1 0.0% 0.0% 0.0% 1.5%
Penalty / free-kick option
Option From Full Penalty 9 7 2 2 5.7% 4.4% 1.3% 3.1%
Option From Half Arm Pen Restart 5 5 0 0 3.2% 3.1% 0.0% 0.0%
Set piece
Lineout Not Straight 7 5 5 2 4.5% 3.1% 3.3% 3.1%
Turnover From Lineout Maul Defence 5 6 5 2 3.2% 3.8% 3.3% 3.1%
Lineout Jumper Knock On In The Air 5 7 1 1 3.2% 4.4% 0.7% 1.5%
Lineout Receiver Change 0 1 0 0 0.0% 0.6% 0.0% 0.0%
*2026 figures are partial.

Takeaways

Three things stand out from four championships of scrum-source data.

First, the scrum count is stable but its make-up is not. The phase-play knock-on has grown from a third of all scrums to nearly half, which says as much about modern defensive line speed and attacking tempo as it does about handling skills.

Second, law changes leave fingerprints. The removal of the free-kick scrum option in July 2024 shows up instantly and completely in the 2025 data.

Third, the 2026 aerial-contest spike is the one to watch. If kick-chase knock-ons keep producing one scrum in eight through the back half of the championship, the kicking game will have become a meaningfully bigger driver of set-piece opportunities than at any point in this dataset.


Data collected and coded by the author in Hudl Sportscode from all Six Nations matches, 2023–2026. Analysis in R and Quarto.