Research

Every Goal Leaves a Footprint

Mapping Kalshi's minute-level fills against the Germany vs Ivory Coast match timeline shows that each event type — disallowed goals, substitutions, equalizers, and the final whistle — leaves a different fingerprint in the data.

ProbalyticsProbalytics
1 min read

Germany beat Ivory Coast 2–1 on June 20 in Toronto. Kalshi's KXWCGAME markets for the match generated 228,111 fills in their busiest hour (21:00–22:00 UTC — second half through resolution), one of the highest single-game totals of the tournament. When you map those fills against the match timeline, you stop seeing volume spikes and start seeing event types. Each one has a different shape.


Disallowed goals have two fingerprints

Pavlović put a header in the net at 23'. The market treated it as a goal immediately: fills jumped from ~1,000/min to 4,454/min and the Germany win price moved from 0.61 to 0.73 in one minute. Then VAR began. The price bled back over the next several minutes and settled back around ~0.61 — essentially back to where it was right before the header, not below it.

The same shape repeated at 39' when Havertz had a goal ruled out — fills spiked to 4,456/min, matching Pavlović's in size. But the price barely moved this time: 0.38 → 0.40 → 0.38. Germany was already down 1–0 by then, and the market had already priced in a lot of the team's attacking threat; a second disallowed header didn't move the needle the way the first one did.

Same fill-volume spike both times. Very different price signature. Trading volume alone doesn't tell you how much the market's beliefs actually changed — you have to look at both.

Goals rotate the market, not just one contract

Kessié scored at 30'. CIV 1–0. Total fills went from 773/min to 3,646/min to 7,451/min across three minutes. The total volume jump is the obvious story. The split is more interesting: CIV fills surged ~18× from baseline (120/min → 2,133/min), Germany fills surged too — buyers treating the price drop as a re-entry point — and the Tie contract filled 1,331 times that minute, up from ~115. All three contracts moving at once, for different reasons.

Half-time is a mild re-pricing window

Fills during the break ran ~1,600–2,300/min, only modestly above the pre-match baseline of ~1,700–1,800/min — not the outsized jump it might look like from headline volume alone. Germany's implied win probability at half-time was ~31–33%, down from ~67% at kickoff (not 57%, which doesn't appear anywhere in the pre-match data — GER traded in a tight 0.65–0.67 band for the full 30 minutes before kickoff). Traders were repositioning and hedging against a comeback, but the pace of trading during the break itself was closer to normal than the "double baseline" story suggests.

Substitutions: the market kept fading Germany, not backing them

Germany's triple substitution at 60' — three attacking players on while losing 1–0 — pushed fills to ~2,500/min. But the price move ran opposite to what you'd expect from an "urgency" read: Germany's win price kept falling through the substitution window, from 0.26 down to 0.18. It was Ivory Coast's contract that climbed, from 0.44 up to 0.53, as the market priced CIV's control of the match increasing rather than rewarding Germany's tactical aggression. Fresh legs didn't buy Germany's price any relief — CIV kept gaining until the equalizer.

The Tie contract

When Undav equalized at 68' (21:31 UTC), fills spiked to 8,290/min. What stands out in the data: Tie fills (2,995) exceeded both Germany (2,755) and CIV (2,540) — the only minute in the entire match where Tie was the dominant contract.

With ~22 minutes left at 1–1, a draw was genuinely the most likely single outcome. The market knew that. Most people watching a chart see a volume spike when a goal goes in. The rotation toward Tie is what's actually worth looking at.

During stoppage time the market was pricing a draw, not a Germany win

From 21:49 onwards, fills ran ~3,800–5,800/min with nothing happening on the pitch — time-pressure trading, not event trading. But the direction matters: Germany's price kept falling, from 0.18 down to 0.12 by 21:55, while the Tie contract climbed from 0.72 to 0.82. With the score still 1–1 and the clock running out, the market was getting more confident in a draw, not in a Germany win. There was no visible anticipation of the winner in the fill data — the market was leaning the other way right up until the goal.

The final whistle is its own category

Undav scored the winner at 90+4' (21:56 UTC). 20,415 fills in one minute — roughly 2.5–4× any other minute in the match, and a level of repricing violence nothing else in a match can produce. Germany's price snapped from 0.12 to 0.76 in that single minute, then kept climbing — 0.96 by 21:57, 0.99 by 22:00. Tie fills: 7,073. CIV fills: 1,797. Within three minutes, both losing contracts had collapsed to near-zero volume.

The whistle doesn't shift probabilities gradually — it ends them. Every open position closes at once with nothing left to wait on. Unlike the stoppage-time drift, there was no lead-up: the market was pricing a draw right up to the kick, then repriced almost the entire outcome in sixty seconds.


Match timeline

EventUTCFills/minGermany priceSignal
Kickoff20:001,8050.670Baseline
Fofana save20:101,2670.654Modest uptick
Pavlović disallowed20:204,4540.61 → 0.73 → ~0.61Spike → VAR bleed → settle back near start
Kessié goal — CIV 1–020:29–20:303,646 → 7,4510.43 → 0.40~18× CIV fill surge
Havertz disallowed20:384,4560.38 → 0.40 → 0.38Same volume spike, far weaker price move
Half-time20:47~1,9000.33Mild re-pricing, close to baseline pace
Triple sub (GER)21:172,5010.20 (falling)CIV price rising 0.44→0.53, not GER
Undav equalizer — 1–121:318,2900.40Tie fills (2,995) > GER (2,755) > CIV (2,540)
Stoppage time21:49–21:55~3,800–5,8000.18 → 0.12Tie climbs 0.72→0.82; GER fading, not rising
Undav winner + whistle21:5620,4150.12 → 0.76 → 0.99Sudden repricing, no anticipation

One thing that keeps standing out

The Tie fills at 68' are a small detail in an ~8,300-fill minute. You only catch it if you're watching the split rather than the total. Most coverage of prediction market volume looks at the spike. The structure under the spike — and which contract is actually moving — is where it gets interesting.