Hoffenheim v Borussia Dortmund — Prediction, Odds & Stats
Saturday 18 April 2026 · GER-Bundesliga · 2526
Bundesliga
xG Prediction generated
AI prediction
ai-blend-oos No snapshot has been taken for this fixture yet; this is the stored price.Probabilities, not certainties. How they are made: the methodology.
Was this pick made in advance?
-oos is out of sample: it was fitted only on matches
played before this one, so its pick is a genuine forecast rather than hindsight.
Anything without that suffix was fitted on all available data.What the chances say
Hoffenheim are finishing below their chances — 2.9 goals fewer than expected across 10 matches, despite creating the openings. They are also conceding sharply more than the chances against them merit — 5.0 goals above expected, which tends to correct.
Borussia Dortmund are finishing below their chances — 2.3 goals fewer than expected across 10 matches, despite creating the openings. They are also conceding fewer than expected — 2.7 goals saved beyond what the chances suggest.
Finishing swings far more than chance creation, so a gap this size usually narrows. Over ten matches it is suggestive, not settled — a genuinely elite finisher beats expected goals for years.
What the model said
| Model | Home / Draw / Away | Expected goals | Likeliest score | O2.5 | BTTS | Outcome |
|---|---|---|---|---|---|---|
| ai-blend-oos | 1.39–1.87 | 0% | 0% | 0% | Away ✗ | |
| dc-xg-oos | 1.57–1.74 | 1-1 10% | 64% | 65% | Away ✗ |
A model whose name ends -oos was produced by the walk-forward backtest:
it was fitted only on matches played before this one, so the pick is genuinely out of sample.
Reading the xG timeline
Expected goals by minute
Reading the shot map
Shot map
Every shot
| Min | Team | Player | xG | Situation | Body part | Result | Assisted by |
|---|---|---|---|---|---|---|---|
| 0' |
|
Fisnik Asllani | 0.06 | Open Play | Right Foot | Missed Shot | Ozan Kabak |
| 0' |
|
Fisnik Asllani | 0.01 | Open Play | Left Foot | Blocked Shot | Ozan Kabak |
| 5' |
|
Tim Lemperle | 0.04 | Open Play | Right Foot | Shot On Post | Wouter Burger |
| 12' |
|
Daniel Svensson | 0.70 | Open Play | — | Missed Shot | — |
| 13' |
|
Albian Hajdari | 0.01 | Open Play | Left Foot | Blocked Shot | — |
| 25' |
|
Andrej Kramaric | 0.30 | Open Play | Left Foot | Saved Shot | Vladimir Coufal |
| 28' |
|
Waldemar Anton | 0.02 | Open Play | — | Saved Shot | Julian Ryerson |
| 30' |
|
Tim Lemperle | 0.09 | Open Play | Right Foot | Blocked Shot | Wouter Burger |
| 36' |
|
Andrej Kramaric | 0.04 | Open Play | Left Foot | Blocked Shot | Fisnik Asllani |
| 41' |
|
Andrej Kramaric | 0.76 | Right Foot | Goal | — | |
| 43' |
|
Bernardo | 0.02 | Open Play | Left Foot | Blocked Shot | Bazoumana Touré |
| 43' |
|
Vladimir Coufal | 0.05 | Open Play | Right Foot | Missed Shot | — |
| 55' |
|
Carney Chukwuemeka | 0.01 | Open Play | Right Foot | Blocked Shot | — |
| 61' |
|
Ozan Kabak | 0.05 | From Corner | — | Saved Shot | Vladimir Coufal |
| 64' |
|
Daniel Svensson | 0.29 | Open Play | Left Foot | Blocked Shot | Marcel Sabitzer |
| 64' |
|
Maximilian Beier | 0.05 | Open Play | — | Missed Shot | Julian Ryerson |
| 86' |
|
Serhou Guirassy | 0.04 | Open Play | Right Foot | Goal | Ramy Bensebaini |
| 87' |
|
Ozan Kabak | 0.03 | Open Play | Right Foot | Missed Shot | Fisnik Asllani |
| 90' |
|
Maximilian Beier | 0.05 | Open Play | Right Foot | Saved Shot | Samuele Inácio |
| 97' |
|
Andrej Kramaric | 0.76 | Right Foot | Goal | — | |
| 102' |
|
Julian Brandt | 0.14 | Direct Freekick | Right Foot | Missed Shot | — |
Players
Borussia Dortmund
| Player | Min | G | A | Sh | KP | xG | xA | xGChain |
|---|---|---|---|---|---|---|---|---|
| Maximilian Beier AMC | 90 | 0 | 0 | 2 | 0 | 0.09 | 0.00 | 0.09 |
| Waldemar Anton DC | 90 | 0 | 0 | 1 | 0 | 0.02 | 0.00 | 0.39 |
| Carney Chukwuemeka AMC | 90 | 0 | 0 | 1 | 0 | 0.01 | 0.00 | 0.01 |
| Nico Schlotterbeck DC | 90 | 0 | 0 | 0 | 0 | 0.00 | 0.00 | 0.37 |
| Julian Ryerson DMR | 90 | 0 | 0 | 0 | 2 | 0.00 | 0.06 | 0.15 |
| Jobe Bellingham MC | 90 | 0 | 0 | 0 | 0 | 0.00 | 0.00 | 0.38 |
| Gregor Kobel GK | 90 | 0 | 0 | 0 | 0 | 0.00 | 0.00 | 0.29 |
| Daniel Svensson DML | 78 | 0 | 0 | 2 | 0 | 0.99 | 0.00 | 0.99 |
| Marcel Sabitzer MC | 77 | 0 | 0 | 0 | 1 | 0.00 | 0.29 | 0.29 |
| Fabio Silva FW | 66 | 0 | 0 | 0 | 0 | 0.00 | 0.00 | 0.70 |
| Ramy Bensebaini Sub | 49 | 0 | 1 | 0 | 1 | 0.00 | 0.04 | 0.32 |
| Niklas Süle DC | 41 | 0 | 0 | 0 | 0 | 0.00 | 0.00 | 0.00 |
| Serhou Guirassy Sub | 24 | 1 | 0 | 1 | 0 | 0.04 | 0.00 | 0.32 |
| Samuele Inácio Sub | 13 | 0 | 0 | 0 | 1 | 0.00 | 0.05 | 0.05 |
| Julian Brandt Sub | 12 | 0 | 0 | 1 | 0 | 0.14 | 0.00 | 0.00 |
Hoffenheim
| Player | Min | G | A | Sh | KP | xG | xA | xGChain |
|---|---|---|---|---|---|---|---|---|
| Andrej Kramaric AMR | 90 | 2 | 0 | 4 | 0 | 1.86 | 0.00 | 0.45 |
| Ozan Kabak DC | 90 | 0 | 0 | 2 | 2 | 0.08 | 0.07 | 0.10 |
| Fisnik Asllani AMC | 90 | 0 | 0 | 2 | 2 | 0.07 | 0.07 | 0.14 |
| Vladimir Coufal DR | 90 | 0 | 0 | 1 | 2 | 0.05 | 0.35 | 0.46 |
| Albian Hajdari DC | 90 | 0 | 0 | 1 | 0 | 0.01 | 0.00 | 0.14 |
| Oliver Baumann GK | 90 | 0 | 0 | 0 | 0 | 0.00 | 0.00 | 0.03 |
| Leon Avdullahu DMC | 90 | 0 | 0 | 0 | 0 | 0.00 | 0.00 | 0.13 |
| Tim Lemperle FW | 89 | 0 | 0 | 2 | 0 | 0.13 | 0.00 | 0.17 |
| Bernardo DL | 78 | 0 | 0 | 1 | 0 | 0.02 | 0.00 | 0.07 |
| Bazoumana Touré AML | 66 | 0 | 0 | 0 | 1 | 0.00 | 0.02 | 0.02 |
| Wouter Burger DMC | 66 | 0 | 0 | 0 | 2 | 0.00 | 0.13 | 0.49 |
| Alexander Prass Sub | 24 | 0 | 0 | 0 | 0 | 0.00 | 0.00 | 0.00 |
| Grischa Prömel Sub | 24 | 0 | 0 | 0 | 0 | 0.00 | 0.00 | 0.00 |
| Robin Hranác Sub | 12 | 0 | 0 | 0 | 0 | 0.00 | 0.00 | 0.00 |
| Max Moerstedt Sub | 1 | 0 | 0 | 0 | 0 | 0.00 | 0.00 | 0.03 |