Football xG explained

Football xG explained: what expected goals measures, where it's useful to bettors, and the honest limits most explainer guides leave out. By Spectral.

By Spectral9 min readUpdated

Expected goals gets treated like an oracle in one guide and a gimmick in the next. It's neither. xG is a per-shot probability drawn from historical data. Opta's model alone trains on close to one million shots. Useful, limited, and in most major match-result markets already priced in. Where it isn't priced in is where a bettor has work left.

TL;DR

  • xG is the probability a chance of that type gets scored by an average player. It measures chance quality, not match outcome.
  • 1X2 markets in the top European leagues have absorbed xG for years. Derivative markets and regime shifts are more interesting places to look for an edge.
  • Single-match xG is volatile. Different providers will quote different numbers for the same match. The limits matter as much as the figure.

What xG actually measures

xG assigns a probability to every shot, on a scale from 0 to 1. A tap-in from inside the six-yard box sits near 0.90. A speculative 30-yard effort sits near 0.03. A penalty sits at around 0.79, per Opta's model.

Shot typeApprox xG
Speculative long-range effort0.03–0.05
Cross met by a defender between the ball and goal0.05–0.10
Clear chance from the edge of the six-yard box0.30–0.45
Penalty0.79
Tap-in, unmarked, goalkeeper committed0.85–0.95

These are rough anchors. Exact numbers vary between providers.

What goes into the calculation depends on whose model you're reading. Opta uses more than 20 variables including shot distance and angle, goalkeeper position, clarity of the goal mouth based on the positions of other players, pattern of play (open play, fast break, direct free kick, corner, throw-in), and information on the previous action such as the type of assist. Their model is trained on close to one million shots from 2018-19 to 2021-22, with a broader validation archive of over 4.5 million.

StatsBomb's model, which now sits inside Hudl, adds freeze-frame context on top of the standard inputs: goalkeeper position and status, the position of every attacker and defender visible in frame, and shot impact height. That's a materially different feature set to any location-only model.

American Soccer Analysis publishes its feature list explicitly: shot location, goalmouth placement, body part, passing context (cross, through ball), play type (set piece, corner, free kick, fast break, regular), and lateral and vertical goalkeeper position. Penalties get a fixed coefficient (2.735 in the shooter model, 2.038 in the goalkeeper model) rather than being modelled from shot geometry.

The term predates the commercial era. Wikipedia's history traces shot-quality research back to Vic Barnett and Sarah Hilditch in 1993, then Jake Ensum and others (2004) applying logistic regression to World Cup 2002 shot data, then Sarah Rudd's 2011 MIT Sloan Markov-chain framing. Sam Green at Opta introduced xG as a published commercial metric in 2012. Everything since is refinement.

Worked example: Middlesbrough 0-1 Charlton Athletic, 11 March 2026

On 11 March 2026, Middlesbrough played Charlton Athletic in the Championship. Middlesbrough took 34 shots, held 78% of the ball, and generated 3.43 xG. Charlton took 5 shots, held 22%, and generated 0.52 xG. Charlton won 1-0.

We picked this match because the divergence is extreme. Most games don't produce an xG gap that wide with a result flipped against it. Extreme examples make the point cleanly, but most weeks the gap between xG and scoreline is a fraction of this size. The lesson still holds.

Opta are explicit on what conclusion to draw from a match like this, and what not to:

"A team having a higher xG total in a match doesn't necessarily imply that they should've won the game. xG is only measuring chance quality and not the expected outcome of the game."

What actually happened is that Middlesbrough took 34 shots worth a cumulative 3.43 xG and converted none. Charlton took 5 shots worth 0.52 xG and converted one. Variance is part of that. So is the Charlton goalkeeper's shot-stopping on the day, which base xG doesn't measure directly. So is finishing, which xG doesn't model at all. None of those add up to "Middlesbrough should've won." They add up to "here is one match where the process diverged from the outcome."

Over 10 matches or 20 matches, xG-goals gaps of this magnitude tend to shrink. That's a tendency, not a law. Over a full season some teams will persistently outperform or underperform their xG for structural reasons: a top-tier finisher, an elite goalkeeper, or the opposite at the other end. The literature doesn't fix a universal stabilisation threshold.

xG figures here are from FootyStats, our data provider. A different provider would produce different numbers for the same match, for reasons we cover next.

What xG doesn't tell you

Different providers produce different numbers. xG is model-based, and different providers with different features and different event definitions assign different probabilities to the same shot. Wikipedia's framing is concise: "different implementations can assign different probabilities to the same shot, particularly when they use different event definitions or additional information." A 2024 comparative study across the top five European leagues (Fu, ACE 2024) found Understat had lower prediction error in the Premier League, Bundesliga, and Serie A, while Opta was more stable in La Liga and Ligue 1. Neither was uniformly better. Which xG you see depends on whose data the site you're reading consumes.

Game state is invisible. A team chasing from 0-3 in the 89th minute will take speculative shots that score the same xG as calm build-up chances at 0-0. Shot-based xG doesn't know the scoreline. As one analyst's summary puts it: "A losing team might generate 12 second-half shots with an xG total of 0.5, a misleading volume that masks poor chance quality." Some analysts cut their xG figures by game state (xG while drawing, xG while winning) for exactly this reason. Most top-line xG figures don't.

Process and outcome diverge for legitimate reasons. Persistent xG-goals gaps aren't purely variance. An elite goalkeeper can save more than the base rate from the same xG faced. An elite finisher can convert more than the base rate from the same xG generated. Structural finishing talent and structural defending talent both exist, and both emerge over sustained samples rather than individual matches. Treat short-sample xG comparisons as noisy until a team or player has a meaningful track record of divergence.

Single-match xG is volatile. As Wikipedia summarises, xG totals from a single match can be volatile, and differences between a player's xG and their actual goals can be noisy over limited samples and reflect modelling choices as much as true talent. If you're reading one match's xG in isolation and drawing conclusions about tactics, stop.

What xG tells a bettor, and what it doesn't

xG's signal is public. That matters for what bets it can still move. Our working read, for markets we've looked at:

MarketOur read
1X2, top-5 European leaguesAbsorbed. Sharp books price xG into 1X2 odds; naive xG strategies rarely beat the close.
1X2, smaller leagues with softer booksContested. Softer pressure, longer correction lag. Literature not settled.
Over/Under totalsPartially absorbed. Divergence between the two teams' recent xG still reads through.
Asian HandicapMostly absorbed. Edge here tends to come from line-shopping rather than xG.
BTTSPartially absorbed. Team-pair xG asymmetry can leak signal.
CornersDifferent process. xG is not the dominant predictor of corner count. Shot territory, pressing, and set-piece focus matter more.
Player shots / shots on targetxG-adjacent. Thinner market, less sharp pricing, where individual-level xG profiles can still read.

This is our working view, not a settled consensus. The literature has live disagreement on whether smaller leagues with softer books retain xG-based edge. A 2026 Bundesliga study by Sascha Wilkens (SAGE) finds a calibrated xG-Skellam model generates positive returns over eleven seasons, but the full paper sits behind a paywall we couldn't verify, so we cite the abstract here with that caveat. Treat the table as Spectral's working model, not a trading recommendation.

The xG family: xGOT, xA, xT

xGOT (expected goals on target). Sometimes called post-shot xG. Opta's xGOT model takes the pre-shot xG figure and adds where in the goalmouth the shot was headed. A shot placed in the top corner gets credited more than the same quality of shot going down the middle. Useful for goalkeeper-related markets and shot-stopping evaluation. Not a replacement for xG on match totals.

xA (expected assists). The xG value of the shot that followed a given pass. Wikipedia's summary: xA "measures the likelihood that a completed pass becomes a goal assist, based on factors such as pass type and end location." Best suited to creator-focused player props.

xT (expected threat). A pitch-zone threat model from Karun Singh (2018) that assigns a threat value to every zone based on the probability of scoring within the next few actions. The pitch is divided into a 16-by-12 grid of 192 zones. Each zone carries a shoot probability, a move probability, and a move transition matrix, all learned from historical events. The model converges after four or five iterations. Unlike xG, xT values build-up actions that never result in a shot but lead to dangerous positions later in the possession. Applies to shot-volume forecasting and corners, where build-up play and territorial dominance matter more than the quality of the final shot.

How Spectral uses xG

At Spectral, xG is an input feature, not an output. We consume match-level xG from FootyStats, which means our figures come from one provider and aren't reconciled against Opta, StatsBomb, or Understat. That single-provider dependency is a real limitation of our pipeline. Inside the model, rolling 5-match team xG and the matchup delta (a team's recent xG minus the opponent's) feed into our corners, shots-on-target, cards, and total-goals models. The corners model leans on xG most visibly, via an explicit interaction between a team's xG and the opponent's corners conceded. We don't publish an xG-driven match-result model, and we don't compute our own xG from shot coordinates. For what the model actually gets right and wrong, see our methodology and track record. Background on Spectral itself is on the about page.

Related reading

See it in practice → Spectral's track record.


18+. If you or someone you know is affected by gambling, support is available at BeGambleAware or through the UK self-exclusion scheme GamStop.

This post is for informational and educational purposes only. Nothing here is financial or betting advice.

Related

Proof over promises

Every pick timestamped before kick-off. Every settled result counted in the public record: free, paid, wins, losses.