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.
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
| Event | UTC | Fills/min | Germany price | Signal |
|---|---|---|---|---|
| Kickoff | 20:00 | 1,805 | 0.670 | Baseline |
| Fofana save | 20:10 | 1,267 | 0.654 | Modest uptick |
| Pavlović disallowed | 20:20 | 4,454 | 0.61 → 0.73 → ~0.61 | Spike → VAR bleed → settle back near start |
| Kessié goal — CIV 1–0 | 20:29–20:30 | 3,646 → 7,451 | 0.43 → 0.40 | ~18× CIV fill surge |
| Havertz disallowed | 20:38 | 4,456 | 0.38 → 0.40 → 0.38 | Same volume spike, far weaker price move |
| Half-time | 20:47 | ~1,900 | 0.33 | Mild re-pricing, close to baseline pace |
| Triple sub (GER) | 21:17 | 2,501 | 0.20 (falling) | CIV price rising 0.44→0.53, not GER |
| Undav equalizer — 1–1 | 21:31 | 8,290 | 0.40 | Tie fills (2,995) > GER (2,755) > CIV (2,540) |
| Stoppage time | 21:49–21:55 | ~3,800–5,800 | 0.18 → 0.12 | Tie climbs 0.72→0.82; GER fading, not rising |
| Undav winner + whistle | 21:56 | 20,415 | 0.12 → 0.76 → 0.99 | Sudden 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.
Probalytics
Research & Analytics
Related Articles
What 200,000 Prediction Market Fills Reveal About the World Cup
Analysis of Kalshi's KXMENWORLDCUP-26 outright winner markets reveals three patterns that end-of-day prices miss: hourly repricing, post-win spikes as artefacts, and France as the cleanest signal in the tournament.
ResearchWhy 87% of Polymarket Trades Are Sells
Most of the SELL dominance is just crypto micro-markets taking over. The real story is what the makers are doing underneath.
ResearchWhen Do Polymarket Markets Decide? Half Wait Until the Last 15 Minutes
Across Polymarket markets, the number of market makers barely affects when a market reaches certainty. What matters is whether it's a sports bet or a crypto price target.