Bolton beat Bradford 1-0 at Valley Parade on Wednesday 14 May to win the League One play-off semi-final 2-0 on aggregate and book a Wembley date with Stockport County. Substitute Xavier Simons broke the deadlock in the 81st minute — five minutes after coming off the bench — to kill the tie. The 90-minute scoreline matched the LR cal model’s narrow lean (Bolton 41.7% v Bradford 41.4%); the Poisson model’s Bradford-favourite read was wrong on direction. xG Bolton 0.77, Bradford 0.45 — a combined 1.22 across the night, the lowest-event match of this play-off round.
How it unfolded
The first half was as cagey as Bolton’s regular-season profile suggested it might be: no goals, no clear cut chances, no bookings in 45 minutes — just two sides playing for the second-leg margins. Bolton lost Eoin Toal at the break (Max Conway on), an enforced rather than tactical change given the timing of the 43rd-minute substitution. Bradford brought Tyreik Wright on for Curtis Tilt at HT — a sub that produced the highest-rated Bradford performance of the night (7.70).
Bradford had to chase, and committed early — three more changes in the 61′-62′ window: Lapslie, Humphrys and Powell all on, with Pointon, Joe Wright and an unrecorded teammate withdrawn. (Bradford had used four outfield substitutions by the 62nd minute; only Will Swan’s late introduction at 90+2′ for Max Power remained from the bench.) The early-substitution gamble didn’t produce a goal. Bolton, meanwhile, made their tactical move at 76′ — Mason Burstow (the squad’s top scorer, 12 league goals) off for John McAtee, and Xavier Simons on for Ethan Erhahon. Simons scored within five minutes; Bolton never looked likely to concede.
The remaining minutes were a tidy management exercise from Steven Schumacher’s side. Aden Baldwin’s yellow card in stoppage time (90+1′) was the only booking of the night. Bradford could not muster a late equaliser to take the tie to extra time. Final whistle, 0-1 Bolton on the night, 0-2 on aggregate.
Key moments and key players
For Bolton, the bench was decisive. Schumacher’s 76th-minute double change — Burstow and Erhahon off, McAtee and Simons on — produced a goal five minutes later, despite withdrawing his leading scorer. Simons’ 7.30 rating from 14 minutes of action is the night’s best minute-for-minute return. Jack Bonham earned a 7.60 rating with a clean sheet at the other end. Rúben Rodrigues (7.50) and Josh Sheehan (7.20) controlled midfield space across the 65 and 90 minutes they played respectively.
For Bradford, Max Power’s 89 minutes brought a 7.60 rating — the squad’s standout performance, but in a losing cause. Bobby Pointon — who I had flagged as missing on the basis of a 33-day absence in the pre-match fact pack — was in fact restored to the starting XI; he played 61 minutes at a 6.90 rating before being withdrawn for Humphrys. An honest correction to the pre-match note: Pointon was available and selected; the recency-window helper was too conservative. He didn’t have a decisive impact in the game, but the editorial flag was wrong.
Antoni Sarcevic — the available top scorer per the fact pack — played the full 90 at a 6.70 rating, no goals, no assists. The match never produced the chance Bradford needed; the xG of 0.45 across the full 90 is the lowest creation figure Bradford have posted in a home game across the second half of this season.
The model versus the result
Pre-match, the two models disagreed on who would win the night. LR cal had it almost level at Bolton 41.7% / Draw 16.9% / Bradford 41.4% — neither side clearing the 45% “clear favourite” threshold, with the draw unusually suppressed. Poisson + Dixon-Coles had Bradford as favoured at 44.7% / Draw 24.9% / Bolton 30.4% — short of the 45% “clear favourite” threshold but with a 14.3pp gap to Bolton, comfortably qualifying as “favoured” under the framing rule. Home λ 1.56 vs away λ 1.25 weighed home advantage and goal expectation.
The result resolved the disagreement in LR cal’s favour. Bolton won the night, just — exactly the kind of narrow-margin call the LR cal’s 0.3pp lean implied. Poisson’s home-favourite read was wrong: Bradford generated less than half their expected goal rate (actual 0.45 vs λ 1.56), and Bolton broke through with the only goal at 81′. The two-model divergence was a useful pre-match flag — when models disagree this materially, both calls deserve display, not papering over.
The conditional-modal scoreline under LR cal’s Bolton-win call would have been 1-0 Bolton (typical away-win cluster modal). The actual was 1-0 Bolton. Direction right, scoreline right.
Want to know what’s behind these numbers? Read our plain-English explainer: How the BTP Model Works.
Wembley: Stockport County v Bolton
The League One final is set: Stockport County v Bolton Wanderers. Stockport — Wembley first-timers — beat Stevenage 2-0 last night to advance 3-0 on aggregate. Bolton — three play-off finishes in four years per BBC Sport — make their return after one season away from the Championship. Whichever side wins earns a return to Championship football. Bolton arrive with the bench depth that decided this tie and Schumacher’s draw-heavy regular-season profile that may suit a Wembley occasion where mistakes are punished. Stockport arrive on the form of the league’s run-in, with Kyle Wootton’s 18 goals and the Barry-Wootton-Osborn axis that has settled both legs of their SF.
📊 Pre-match preview — the model’s split read and the aggregate-state framing.
📡 Live commentary archive from the second leg — minute-by-minute timeline.
📊 Stockport’s match report from Wednesday — the other Wembley finalist.
