# Roosters v Storm — NRL Round 21 2025 AI Prediction by Alphr

## Full Time: Roosters 30 – 34 Storm

_Storm fight back to thunder past Roosters._

Half time: 18 – 16 · Alphr AI pre-game win probability: Roosters 35% / Storm 65% · Allianz Stadium, Sydney · Thu, 24 July, 07:50 pm AEST

**Try Scorers** — Roosters: Daniel Tupou (6' 1st Tipped 🎯), Daniel Tupou (15' 1st Tipped 🎯), Siua Wong (31'), Lindsay Collins (47'), Zach Dockar-Clay (64') · Storm: Josh King (10'), Jack Howarth (19'), Harry Grant (25'), Josh King (53'), Nick Meaney (59' Tipped ⚡), Stefano Utoikamanu (72')

### Match Winner — AI Prediction Market (resolved)

| Team | Pre-game AI win probability | Result |
|---|---|---|
| Storm | 65% | Won |
| Roosters | 35% | Lost |

Model call: **Correct** · Margin: 6.6 predicted → 4 actual · Markets hit: 2/3

_AI win probability priced pre-game · Markets hit = core betting markets._

### Full-Time Report

**Sydney Roosters vs Melbourne Storm Prediction & Tips | NRL Round 21 2025**

_By Ben Dunlop · Published: 28 Feb 2026, 07:36 pm · Last updated: 24 July 2026, 12:42 pm_

Roosters 30–34 Storm in NRL Round 21 at Allianz Stadium, Sydney. Here's how the result stacked up against the model's call, with the win-probability story and where the value landed.

Four points separated these two at the final siren, but the scoreboard spent eighty minutes swinging like a pendulum. Roosters led. Storm led. Roosters led again. Storm led again. Nobody was ever more than eight points clear until Stefano Utoikamanu crossed in the 72nd minute, and even then it only held up by four.

Daniel Tupou set the tone inside five minutes, and by the 15th he'd doubled up to put Roosters out 10-6. But Storm didn't blink. Jack Howarth and Harry Grant answered in quick succession to flip it 14-12 their way by the 25th, and when Siua Wong levelled it at 16-16 in the 31st, this had already shaped as a shootout rather than a arm-wrestle. Roosters carried an 18-16 buffer into the sheds, which given the tempo, felt more like a coin flip than a lead.

The third quarter belonged to the home side. Lindsay Collins barged over in the 46th to push it to 22-16, and even after Josh King's second try hauled Storm back within four at 24-20, Roosters were still the ones setting the terms. That's when the game turned. Nick Meaney's try in the 58th put Storm in front 26-24 for the first time since early in the first half, and from there it never settled. Zach Dockar-Clay dragged Roosters level again at 28-28 in the 64th, only for Utoikamanu to deliver the sucker punch eight minutes later. Storm led 32-30 and never gave it back.

The stat sheet explains why a game this close still tipped Storm's way. Roosters were the tidier side with ball in hand, completing at 80% to 85% is actually a mark in Storm's favour there, and conceding fewer errors, 10 to 11. They also bent the line more often in the collision, 44 tackle breaks to 36, and ran for more, 1,490 metres to 1,455. None of it mattered as much as the ledger that actually decides tight ones: line breaks. Storm found three to Roosters' two, and in a four-point game that's the whole story.

Storm's forward pack, rated 1059 against Roosters' 1092 coming in, wasn't expected to dominate the collision, and it didn't. But the hooker matchup told a different tale. Storm's 1108 rating there against Roosters' 1062 showed up in exactly the way you'd expect, with Harry Grant crossing from dummy half and driving the middle all night. Roosters' missed tackles, 36 to Storm's 44, look like the bigger defensive crack on paper, but it was Storm's line-break edge and offload count, 12 to 7, that turned field position into points when it counted.

Storm arrived averaging 9.4 points of margin across their last five and conceding just 16.4 a game, numbers that suggested a side comfortable closing out arm-wrestles. They conceded 30 here, well above that clip, and still found a way. Alphr's model had Storm winning by 6.6 in a 46-point game. The margin landed at four, the total at 64. Not a bad piece of forecasting on the margin, wildly short on the shootout that actually broke out. Storm covered, the model called the winner, and the placekick from behind the tryline mattered less than who could still find one more try in the last ten minutes. Storm could. Roosters couldn't.

**Scoring by Half**

| Team | H1 | H2 | T |
|---|---|---|---|
| Roosters | 18 | 12 | 30 |
| Storm | 16 | 18 | 34 |

**Key Match Stats**

| Roosters | Stat | Storm |
|---|---|---|
| **51%** | Possession | 49% |
| 80% | Completion rate | **85%** |
| **1,490** | Run metres | 1,455 |
| **518** | Post-contact metres | 514 |
| 2 | Line breaks | **3** |
| **44** | Tackle breaks | 36 |
| 7 | Offloads | **12** |
| **86.3%** | Effective tackle % | 85.5% |
| **36** | Missed tackles | 44 |
| **10** | Errors | 11 |
| **3** | Penalties conceded | 4 |
| 486 | Kick metres | **549** |

**Model Report Card**

Our model correctly predicted Storm to win at 65% probability. The margin model was sharp, predicting Storm by 6.6 vs the actual margin of 4 points. The game's 64 points came in 18 points higher than the predicted 46. Storm trailed 18–16 at half-time before staging a second-half comeback to win 30–34. The model went 5/16 on this match. Storm covered the 6.5-point line.

**Referee Watch**

Adam Gee officiated this match (313 career games). The combined score of 64 points was 21 points above Adam Gee's career average of 43. Despite Adam Gee's 58% career home-team win rate, the away side Storm prevailed. Adam Gee averaged 12 penalties per game heading in, a whistle-heavy referee profile. 64% of his career sin bins go against away teams, a statistically significant away-team bias.

**Key moments (momentum model)**

- 5' Try — Daniel Tupou (Roosters) — 4-0 · win-prob swing +5 pts
- 9' Try — Josh King (Storm) — 6-4 · win-prob swing -5 pts
- 15' Try — Daniel Tupou (Roosters) — 10-6 · win-prob swing +5 pts
- 19' Try — Jack Howarth (Storm) — 12-10 · win-prob swing -5 pts
- 25' Try — Harry Grant (Storm) — 12-14 · win-prob swing -5 pts
- 31' Try — Siua Wong (Roosters) — 16-16 · win-prob swing +5 pts
- 46' Try — Lindsay Collins (Roosters) — 22-16 · win-prob swing +5 pts
- 53' Try — Josh King (Storm) — 24-20 · win-prob swing -6 pts
- 58' Try — Nick Meaney (Storm) — 24-26 · win-prob swing -5 pts
- 64' Try — Zach Dockar-Clay (Roosters) — 28-28 · win-prob swing +5 pts
- 72' Try — Stefano Utoikamanu (Storm) — 30-32 · win-prob swing -5 pts

_Official NRL match stats · Generated by Alphr's model_

### Edge Analysis — the model's pre-game markets

- **Head to Head:** Storm to win @ $1.50 (edge +3.2%) — model probability 65.3% — result: WON
- **Line / Spread:** Storm +6.5 @ $1.91 (edge +3.2%) — result: WON
- **Total (Over/Under):** Under 46.5 @ $1.91 (edge -0.6%) — result: LOST
- Predicted margin: Storm by 7 · Predicted total: 46

### Match Preview (pre-match read)

The model is firm on Storm here: 65% to see off Roosters. The heaviest factor is the ratings gap: Storm sit 160 ELO points clear, 1673 to 1513. Form leans Storm's way: 4 from their last 5, against 3 for Roosters.

On paper Roosters shade it, ahead on 5 of 7 factors including Forward Pack, Backline Quality and Halves Control. The model still sides with Storm, which says ELO Difference and Recent Win Rate carry the most weight. The margin model has Storm by 6.6, with the two sides combining for about 46. Storm to win, and win clearly. The model isn't hedging.

Storm have won 8 of the last 10 between these two, and Roosters took the most recent meeting 14-6 in 2026 Round 20.

Storm have won 3 games this season after trailing at half-time.

On the ladder it's Roosters 10th against Storm 3rd.

**By the numbers**

|  |  |
|---|---|
| H2H (last 10) | Roosters 2 · Storm 8 |
| Last meeting | Roosters 14-6 |
| Roosters last 4 | LWWL · 96 for, 66 against |
| Roosters at home | 6-6 this season |
| Storm last 4 | LWWL · 84 for, 88 against |
| Storm away | 8-4 this season |
| Ladder | Roosters 10th · Storm 3rd |
| Finals odds | Both locked into the eight |

_Pre-match read · Alphr model_

### Referee Indicator — Balanced

**Adam Gee** — 313 career games since 2013.

| Team | Record under Adam Gee | Win rate |
|---|---|---|
| Roosters | 30W–15L | 67% |
| Storm | 30W–14L | 68% |

Avg total: 43.2 pts · Home win %: 58% · Home bias: Leans home

Both sides have a similar record under Adam Gee, Roosters 30W–15L (67%) and Storm 30W–14L (68%). Home teams win 58% of his matches (vs ~52% league avg).

Adam Gee averages 12 penalties per game, above the league norm. Expect frequent stoppages. Penalises away teams more, 5.5 against home vs 6.6 against away. Storm get a +0.4 penalty advantage under Adam Gee vs Roosters's -0.8. 64% of his 124 career sin bins go to away teams.

### Recent Form (Last 5)

| Roosters | Stat | Storm |
|---|---|---|
| 3.0 | Wins (Last 5) | 4.0 |
| 26.2pts | Avg Score | 25.8pts |
| 20.2pts | Avg Conceded | 16.4pts |
| 6.0pts | Avg Margin | 9.4pts |
| 1675.2m | Run Metres | 1852.0m |
| 4.2 | Line Breaks | 3.8 |
| 383.8 | Tackles | 342.0 |
| 12.0 | Errors | 11.6 |

### Form & History

| Team | Last 5 | Avg Pts |
|---|---|---|
| Roosters | 3W–2L | 26.2 |
| Storm | 4W–1L | 25.8 |

### H2H History (Last 5) — Storm lead 3-2

| Season | Round | Home | Score | Away |
|---|---|---|---|---|
| 2026 | R20 | Roosters | 14 – 6 | Storm |
| 2026 | R13 | Storm | 18 – 4 | Roosters |
| 2025 | R26 | Storm | 10 – 40 | Roosters |
| 2024 | PF | Storm | 48 – 18 | Roosters |
| 2024 | R20 | Storm | 24 – 8 | Roosters |

### Positional Matchup

_Season-to-date production per game with league-wide attack/defence tiers (17 teams)._

**Field Matchup** — where one team attacks vs where the other concedes:
- Roosters' best path is the right edge: NRL's 8th-ranked right edge attack (1.12 tries/game) runs at a Storm defence ranked 14th there (1.24 conceded/game). Key man: Tupou, 11 tries in that channel this season.
- Storm's best path is the middle: NRL's 2nd-ranked middle attack (2.41 tries/game) runs at a Roosters defence ranked 14th there (1.82 conceded/game). Key man: Hughes, 6 tries in that channel this season.

| Channel | Roosters | Storm |
|---|---|---|
| Left | 1.41/g (att 5th (strong)) · concedes 1.12/g (def 6th (strong)) | 1.41/g (att 5th (strong)) · concedes 0.94/g (def 2nd (strong)) |
| Middle | 1.71/g (att 4th (strong)) · concedes 1.82/g (def 14th (weak)) | 2.41/g (att 2nd (strong)) · concedes 1.06/g (def 3rd (strong)) |
| Right | 1.12/g (att 8th) · concedes 0.94/g (def 4th (strong)) | 1.29/g (att 4th (strong)) · concedes 1.24/g (def 14th (weak)) |

**Attack Spine** (Halfback · Five-Eighth · Hooker)

|  | Roosters | Storm |
|---|---|---|
| Attack rank | 4th (strong) | 4th (strong) |
| Defence rank | 14th (weak) | 1st (strong) |
| Tries scored · conceded | 12 · 14 | 12 · 3 |
| Try Assists | 1.2/g | 2.5/g |
| Run Metres | 178m/g | 241m/g |
| Tackle Breaks | 3.1/g | 5.4/g |
| Line Breaks | 0.5/g | 0.9/g |
| Tackle Efficiency | 88.9% | 85.9% |

**Outside Backs** (Fullback · Wingers · Centres)

|  | Roosters | Storm |
|---|---|---|
| Attack rank | 3rd (strong) | 1st (strong) |
| Defence rank | 11th | 13th (weak) |
| Tries scored · conceded | 48 · 40 | 52 · 44 |
| Try Assists | 1.5/g | 1.4/g |
| Run Metres | 723m/g | 715m/g |
| Tackle Breaks | 20.1/g | 13.9/g |
| Line Breaks | 3.7/g | 3.2/g |
| Tackle Efficiency | 82.9% | 79.6% |

**Forwards** (Props · 2nd Rows · Lock)

|  | Roosters | Storm |
|---|---|---|
| Attack rank | 7th | 3rd (strong) |
| Defence rank | 7th | 1st (strong) |
| Tries scored · conceded | 10 · 10 | 17 · 1 |
| Try Assists | 0.4/g | 0.5/g |
| Run Metres | 516m/g | 551m/g |
| Tackle Breaks | 9/g | 8.2/g |
| Line Breaks | 0.7/g | 0.8/g |
| Tackle Efficiency | 90.3% | 91.9% |

**Who scores on Storm** — Wingers 1.34/g (lg 1.25) +7% · Centres 0.65/g (lg 0.68) -4% · Locks 0.07/g (lg 0.1) -30%
**Who scores on Roosters** — Five-Eighths 0.37/g (lg 0.27) +37% · Locks 0.13/g (lg 0.1) +30% · Halfbacks 0.26/g (lg 0.21) +24%

_Tries conceded by position, last 3 seasons; positive = concedes above league average to that position._

### Try Scorer History — Who Crosses The Line

_Last 10 games, career record vs the opponent and at Allianz Stadium. ⚡ = our AI backs them to score; 🎯 = our AI's first-try pick. 🏉 = scored in this game. Try % = share of games with a try, last 10 weighted double vs the 30 prior — historical frequency, not a market price._

**Roosters** (team sheet)

| # | Player | Pos | 2025 | Last 10 | vs opp | Venue | Try % | Alphr play | This game |
|---|---|---|---|---|---|---|---|---|---|
| 1 | James Tedesco | FB | 7 in 17g | 7/10g (2·0·0·1·1·0·1·1·0·1) | 6/21g | 25/45g | 48% | ⚡ Anytime Try $2.65 AI 42% ✗ No try; 🎯 First Try $13.00 AI 7% ✗ Not first | — |
| 2 | Daniel Tupou | WG | 11 in 17g | 8/10g (0·0·0·2·1·0·1·1·2·1) | 12/24g | 66/95g | 60% | ⚡ Anytime Try $1.82 AI 55% ✓ Scored; 🎯 First Try $8.00 AI 11% ✓ Scored first | 🏉 6' 15' |
| 3 | Ethan King | CE | 0 in 10g | 0/10g (0·0·0·0·0·0·0·0·0·0) | 0/1g | 0/6g | 0% | — | — |
| 4 | Robert Toia | CE | 5 in 14g | 5/10g (0·0·1·0·2·0·1·0·1·0) | 0/0g | 2/6g | 33% | — | — |
| 5 | Mark Nawaqanitawase | WG | 13 in 16g | 11/10g (1·2·2·1·1·0·2·2·0·0) | 0/0g | 7/7g | 63% | ⚡ Anytime Try $1.94 AI 56% ✗ No try; 🎯 First Try $9.00 AI 11% ✗ Not first | — |
| 6 | Sandon Smith | 5/8 | 5 in 15g | 2/10g (0·0·2·0·0·0·0·0·0·0) | 0/4g | 4/18g | 12% | — | — |
| 7 | Sam Walker | HB | 0 in 2g | 3/10g (0·0·0·0·2·0·1·0·0·0) | 1/7g | 7/16g | 22% | — | — |
| 8 | Naufahu Whyte | PR | 1 in 15g | 0/10g (0·0·0·0·0·0·0·0·0·0) | 0/5g | 0/21g | 4% | — | — |
| 9 | Connor Watson | HK | 4 in 13g | 2/10g (0·0·0·0·1·0·0·1·0·0) | 0/12g | 6/39g | 16% | — | — |
| 10 | Lindsay Collins | PR | 2 in 8g | 2/10g (0·0·0·0·0·1·0·1·0·0) | 1/14g | 3/27g | 14% | — | 🏉 47' |
| 11 | Angus Crichton | 2R | 2 in 13g | 2/10g (0·0·1·0·0·0·0·0·0·1) | 1/17g | 7/26g | 22% | — | — |
| 12 | Salesi Foketi | 2R | 1 in 14g | 1/10g (0·0·0·0·0·1·0·0·0·0) | 0/0g | 0/6g | 8% | — | — |
| 13 | Siua Wong | INT | 1 in 14g | 1/10g (0·0·0·0·0·0·0·0·1·0) | 1/2g | 0/11g | 12% | — | 🏉 31' |
| 14 | Zach Dockar-Clay | INT | 0 in 16g | 0/10g (0·0·0·0·0·0·0·0·0·0) | 0/2g | 0/12g | 2% | — | 🏉 64' |
| 15 | Blake Steep | INT | 1 in 17g | 1/10g (1·0·0·0·0·0·0·0·0·0) | 0/0g | 1/8g | 10% | — | — |
| 16 | Egan Butcher | INT | 0 in 9g | 0/10g (0·0·0·0·0·0·0·0·0·0) | 0/6g | 1/16g | 6% | — | — |
| 17 | Spencer Leniu | LK | 0 in 12g | 0/10g (0·0·0·0·0·0·0·0·0·0) | 0/9g | 1/13g | 2% | — | — |

**Storm** (team sheet)

| # | Player | Pos | 2025 | Last 10 | vs opp | Venue | Try % | Alphr play | This game |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Nick Meaney | FB | 7 in 13g | 6/10g (0·1·1·0·1·0·1·2·0·0) | 3/12g | 0/1g | 30% | ⚡ Anytime Try $2.70 AI 45% ✓ Scored | 🏉 59' |
| 2 | Grant Anderson | CE | 10 in 17g | 5/10g (1·0·1·2·0·1·0·0·0·0) | 4/6g | 0/0g | 38% | — | — |
| 3 | Jack Howarth | CE | 1 in 11g | 1/10g (0·0·1·0·0·0·0·0·0·0) | 2/3g | 0/1g | 14% | — | 🏉 19' |
| 4 | Joe Chan | INT | 0 in 10g | 0/10g (0·0·0·0·0·0·0·0·0·0) | 0/2g | 0/1g | 3% | — | — |
| 5 | Xavier Coates | WG | 13 in 13g | 10/10g (0·2·1·1·0·0·3·0·0·3) | 8/7g | 1/1g | 52% | ⚡ Anytime Try $1.68 AI 60% ✗ No try; 🎯 First Try $8.00 AI 9% ✗ Not first | — |
| 6 | Tyran Wishart | 5/8 | 5 in 17g | 3/10g (0·0·0·1·1·1·0·0·0·0) | 1/5g | 0/1g | 32% | — | — |
| 7 | Jahrome Hughes | HB | 6 in 16g | 5/10g (0·1·0·0·2·1·1·0·0·0) | 10/16g | 1/1g | 34% | ⚡ Anytime Try $3.50 AI 41% ✗ No try | — |
| 8 | Stefano Utoikamanu | PR | 1 in 16g | 0/10g (0·0·0·0·0·0·0·0·0·0) | 0/3g | 0/2g | 8% | — | 🏉 72' |
| 9 | Harry Grant | HK | 3 in 11g | 2/10g (0·0·0·1·0·0·1·0·0·0) | 2/9g | 0/1g | 28% | — | 🏉 25' |
| 10 | Josh King | PR | 3 in 17g | 1/10g (0·1·0·0·0·0·0·0·0·0) | 0/12g | 0/2g | 14% | — | 🏉 10' 53' |
| 11 | Shawn Blore | 2R | 1 in 17g | 0/10g (0·0·0·0·0·0·0·0·0·0) | 0/4g | 0/2g | 6% | — | — |
| 12 | Eliesa Katoa | 2R | 9 in 17g | 6/10g (0·1·0·0·1·0·1·1·2·0) | 2/8g | 1/1g | 46% | ⚡ Anytime Try $2.35 AI 52% ✗ No try; 🎯 First Try $11.00 AI 7% ✗ Not first | — |
| 13 | Trent Loiero | LK | 4 in 16g | 3/10g (0·0·0·0·0·0·0·1·2·0) | 0/9g | 0/1g | 10% | — | — |
| 14 | Bronson Garlick | INT | 2 in 15g | 1/10g (0·1·0·0·0·0·0·0·0·0) | 0/2g | 0/0g | 6% | — | — |
| 15 | Ativalu Lisati | INT | 0 in 6g | 1/8g (0·1·0·0·0·0·0·0) | 0/0g | 0/0g | 13% | — | — |
| 16 | Tui Kamikamica | INT | 0 in 15g | 0/10g (0·0·0·0·0·0·0·0·0·0) | 1/13g | 0/0g | 2% | — | — |
| 17 | Kane Bradley | WG | 4 in 7g | 4/10g (0·0·0·0·0·2·0·0·0·2) | 0/0g | 0/0g | 19% | ⚡ Anytime Try $1.93 AI 46% ✗ No try | — |

### Prediction Breakdown — Pure Alpha Model

**Team ELO Ratings** — Roosters 1513 · Storm 1673 · ELO difference: 160 in favour of Storm

**Positional Matchups** — lineup ELO by unit

| Unit | Roosters | Storm | Edge |
|---|---|---|---|
| Forwards | 1092 (best 1267) | 1059 (best 1222) | Roosters +33 |
| Backs | 1036 (best 1101) | 995 (best 1107) | Roosters +41 |
| Halves | 1158 (best 1158) | 1131 (best 1131) | Roosters +27 |
| Hooker | 1062 | 1108 | Storm +46 |

**Key Prediction Factors** — what the model weighted most

| # | Factor | Weight | Favours |
|---|---|---|---|
| 1 | ELO Difference | 14.0% | Storm |
| 2 | Forward Pack | 12.0% | Roosters |
| 3 | Backline Quality | 10.0% | Roosters |
| 4 | Halves Control | 9.0% | Roosters |
| 5 | Recent Win Rate | 9.0% | Storm |
| 6 | Referee Tendency | 7.0% | Roosters |
| 7 | Venue Advantage | 7.0% | Roosters |

**Model Confidence: 65%** — Storm predicted to win by 7 points · Predicted total: 46 pts

**Record:** 2/3 match predictions correct

**Prediction by Alphr** (https://alphr.com.au) — free AI predictions for every AFL, NRL & Super League match, published before kick-off and never edited. Verified track record: https://alphr.com.au/accuracy

---
Canonical URL: https://alphr.com.au/nrl/match/2025-r21-roosters-v-storm
RSS feed: https://alphr.com.au/feed.xml
Prediction JSON API: today https://alphr.com.au/api/predictions/today · this week https://alphr.com.au/api/predictions/weekly
Markdown view for AI agents. Machine-readable index: https://alphr.com.au/llms.txt · full reference: https://alphr.com.au/llms-full.txt
All predictions are published before kick-off and verified after full time. Free, no login. 18+ gamble responsibly (AU).
Last updated: 2026-07-24 02:42 UTC (latest tip update)