Bug Description
ITEM_UNDO events in the Match-V5 timeline are emitted with beforeId: 0 and afterId: 0 when the undone purchase was a Tier 3 Boots purchase. The event fires at the correct timestamp, but carries no usable item IDs, so it cannot be matched to the purchase it reverses. Previously a player was not able to undo a Tier 3 Autoupgrade, which was fixed in the 26.15 patch, but introduced this bug at the same time.
The consequence for consumers is that the full sequence of:
destroy Tier 1 + purchase Tier 2 (silently auto upgrades to Tier 3) ->
undo Tier 3 (with broken itemIds) ->
destroy Tier 1 + purchase Tier 2
reads as a duplicated purchase, since the undo in the middle can't be attributed to anything. Item timelines end up with a phantom extra boots purchase and an extra Tier 1 Boots destruction.
Expected Result
timestamp: ITEM_DESTROYED itemId: 1001
timestamp: ITEM_PURCHASED itemId: <T2_BOOTS_ID> (Silent Upgrade to Tier 3)
timestamp: <T+..s> ITEM_UNDO beforeId: <T2_BOOTS_ID>, afterId: 0
timestamp: <T+....s> ITEM_DESTROYED itemId: 1001
timestamp: <T+....s> ITEM_PURCHASED itemId: <T2_BOOTS_ID> (Silent Upgrade to Tier 3)
beforeId should be the item being undone (the Tier 2 boots), consistent with how ITEM_UNDO behaves for every other item.
Actual Result
timestamp: ITEM_DESTROYED itemId: 1001
timestamp: ITEM_PURCHASED itemId: <T2_BOOTS_ID>
timestamp: <T+..s> ITEM_UNDO beforeId: 0, afterId: 0
timestamp: <T+....s> ITEM_DESTROYED itemId: 1001
timestamp: <T+....s> ITEM_PURCHASED itemId: <T2_BOOTS_ID>
The undo event is present and correctly timestamped, but both item ID fields are zero.
Developer Impact
Requires special-case inference logic, walking backwards from a zeroed undo for midlaners to guess which purchase it reverses. The inference is heuristic and will be wrong in edge cases (e.g. multiple purchases at the same timestamp, maybe even with future bugs).
Repro Steps
Play a match as midlaner and buy Tier 1 Boots (1001).
Finish the midlane quest.
Purchase a Tier 2 boots item which autoupgrades to Tier 3 on purchase.
Undo the purchase.
Purchase the same boots again.
After the match, request GET /lol/match/v5/matches/{matchId}/timeline.
Filter the participant's ITEM_DESTROYED / ITEM_PURCHASED / ITEM_UNDO events.
Observe the ITEM_UNDO event carries beforeId: 0 and afterId: 0 instead of the beforeId: Tier 2 boots ID and afterId: 0.
Or just look at this match for example:
EUN1_3983656265
ParticipantId: 3
Timestamps: 887344, 888648, 889383
If required, i can provide a dozen of other broken matches from our logs.

Bug Description
ITEM_UNDO events in the Match-V5 timeline are emitted with beforeId: 0 and afterId: 0 when the undone purchase was a Tier 3 Boots purchase. The event fires at the correct timestamp, but carries no usable item IDs, so it cannot be matched to the purchase it reverses. Previously a player was not able to undo a Tier 3 Autoupgrade, which was fixed in the 26.15 patch, but introduced this bug at the same time.
The consequence for consumers is that the full sequence of:
destroy Tier 1 + purchase Tier 2 (silently auto upgrades to Tier 3) ->
undo Tier 3 (with broken itemIds) ->
destroy Tier 1 + purchase Tier 2
reads as a duplicated purchase, since the undo in the middle can't be attributed to anything. Item timelines end up with a phantom extra boots purchase and an extra Tier 1 Boots destruction.
Expected Result
timestamp: ITEM_DESTROYED itemId: 1001
timestamp: ITEM_PURCHASED itemId: <T2_BOOTS_ID> (Silent Upgrade to Tier 3)
timestamp: <T+..s> ITEM_UNDO beforeId: <T2_BOOTS_ID>, afterId: 0
timestamp: <T+....s> ITEM_DESTROYED itemId: 1001
timestamp: <T+....s> ITEM_PURCHASED itemId: <T2_BOOTS_ID> (Silent Upgrade to Tier 3)
beforeId should be the item being undone (the Tier 2 boots), consistent with how ITEM_UNDO behaves for every other item.
Actual Result
timestamp: ITEM_DESTROYED itemId: 1001
timestamp: ITEM_PURCHASED itemId: <T2_BOOTS_ID>
timestamp: <T+..s> ITEM_UNDO beforeId: 0, afterId: 0
timestamp: <T+....s> ITEM_DESTROYED itemId: 1001
timestamp: <T+....s> ITEM_PURCHASED itemId: <T2_BOOTS_ID>
The undo event is present and correctly timestamped, but both item ID fields are zero.
Developer Impact
Requires special-case inference logic, walking backwards from a zeroed undo for midlaners to guess which purchase it reverses. The inference is heuristic and will be wrong in edge cases (e.g. multiple purchases at the same timestamp, maybe even with future bugs).
Repro Steps
Play a match as midlaner and buy Tier 1 Boots (1001).
Finish the midlane quest.
Purchase a Tier 2 boots item which autoupgrades to Tier 3 on purchase.
Undo the purchase.
Purchase the same boots again.
After the match, request GET /lol/match/v5/matches/{matchId}/timeline.
Filter the participant's ITEM_DESTROYED / ITEM_PURCHASED / ITEM_UNDO events.
Observe the ITEM_UNDO event carries beforeId: 0 and afterId: 0 instead of the beforeId: Tier 2 boots ID and afterId: 0.
Or just look at this match for example:
EUN1_3983656265
ParticipantId: 3
Timestamps: 887344, 888648, 889383
If required, i can provide a dozen of other broken matches from our logs.