Gotchas
The non-obvious traps that will silently break your parser: trailing damage, two-format SPELL_ABSORBED, talent ID mix-ups, mid-log version restarts, vehicle attribution, and more.
Every one of these is something we learned the hard way while building WowCoach's parser. None of them are documented anywhere else.
1. Detect Advanced Logging by Row Width, Not Header
The COMBAT_LOG_VERSION line says ADVANCED_LOG_ENABLED,1. Don't trust it. Logs get split, headers get lost, players paste fragments online. Detect advanced logging by counting fields on a SPELL_DAMAGE event: ~22 fields = off, 40+ = on.
2. SPELL_DAMAGE absorbed Field vs. SPELL_ABSORBED Event
These are two different things. The absorbed field on a SPELL_DAMAGE event is informational. The SPELL_ABSORBED event carries the actual absorbed amount. Counting both adds the absorbed amount twice. Use SPELL_ABSORBED as the source of truth.
3. Overkill Is -1 When There's No Overkill
Don't subtract it. Negative overkill means "this wasn't a killing blow." Clamp to zero before subtracting.
4. ENCOUNTER_END Isn't the End of Damage
DoTs continue ticking for ~2 seconds after ENCOUNTER_END. Bleeds, ignites, vampiric touches, all of them. The de-facto standard counts that trailing damage toward the boss fight. If your fight window is exactly [ENCOUNTER_START, ENCOUNTER_END], you'll be 1–3% under expected on every fight. Add a 2-second trailing window.
5. The COMBATANT_INFO Talent ID Is the Entry ID, Not the Definition ID
The middle field in each talent triple is the TraitNodeEntry ID — not the spell ID and not the trait definition ID. Use wago.tools / wow.tools to resolve. Most third-party talent calculators get this wrong.
6. Mid-Log COMBAT_LOG_VERSION = the Logger Restarted
Players sometimes /reload mid-raid. When they do, a new COMBAT_LOG_VERSION line appears partway through the file. This is a hard boundary. All your accumulated state — pet ownership, ongoing auras, fight tracking — needs to reset across the seam.
7. Two SPELL_ABSORBED Formats
22 fields = shield on someone else (Disc priest absorbing for the tank). 19 fields = self-shield (Power Word: Shield on yourself). Same event name, different layout. Count fields before you parse, or you'll mis-read attacker/defender on every Disc priest fight.
8. SWING_DAMAGE_LANDED Double-Counts If You Aren't Careful
SWING_DAMAGE and SWING_DAMAGE_LANDED are the same melee swing, reported twice — once with the attacker's advanced block and once with the target's. Counting both doubles every melee hit. Pick one stream (the canonical choice is SWING_DAMAGE).
9. Pets Deal Damage Before SPELL_SUMMON
Pets summoned before combat (warlock demons, hunter pets, DK ghouls) start dealing damage immediately. Their owner-attribution signal arrives later in the log. The right architecture: buffer unknown-owner pet damage and retroactively reassign when the owner is discovered. Get this wrong and warlocks parse 30% lower than they should.
10. Vehicle and Possession GUIDs
When a player gets mind-controlled, possessed, or enters a vehicle, the GUID changes. A possessed player's actions appear under a Vehicle- GUID with the ownerGUID field (offset 1 in the advanced block) pointing back to their Player GUID. Damage attribution must follow the ownerGUID chain. On any mind-control encounter, you'll have entire chunks of damage where the source GUID is not a player at all — only the ownerGUID linkage tells you who actually did it.
11. Cheat-Death and Stagger Aren't Healing
A handful of "absorbs" are actually damage prevention or delayed self-damage, not healing. Excluding them is what separates accurate Brewmaster numbers from numbers inflated by ~95%. The list:
| Spell ID | Name | Class/Spec |
|---|---|---|
| 114556 | Purgatory | Blood Death Knight |
| 31850 | Ardent Defender | Protection Paladin |
| 31230 | Cheat Death | Subtlety Rogue |
| 115069 | Stagger | Brewmaster Monk |
12. The Aura Stack Field Is Only Valid on _DOSE Events
SPELL_AURA_APPLIED and SPELL_AURA_REMOVED have a field at position 13 that's NOT the stack count, despite parsers commonly reading it as such. For absorb buffs (Power Word: Shield, Reflective Shield), it's an absorb amount. For other auras, it varies. Only *_APPLIED_DOSE and *_REMOVED_DOSE carry stack counts there.
13. Pre-existing combat-log docs disagree with each other
Almost every published combat-log reference has at least one wrong claim. A few that turn up consistently in older docs and forum posts:
ENVIRONMENTAL_DAMAGEputs the environmental type after the advanced block (field 28), not before it (field 9). Several references claim field 9. Real logs say 28.SPELL_DAMAGEevents have 42 fields total in modern retail. The 42nd field carries anST/AOEability hint — not documented anywhere we could find before this page.SPELL_ABSORBEDevents carry two trailing fields afteramount(totalAmountandcritical) that older docs omit.ENCOUNTER_ENDhas a 6th field carrying fight duration in milliseconds — handy if you don't want to compute it from timestamps.SWING_DAMAGEandSWING_DAMAGE_LANDEDare the same swing reported with different advanced blocks (source's data and target's data, respectively). Counting both doubles damage.
When in doubt, count fields on a real log line and verify against this page. The offsets here are checked against actual M+ and raid logs and updated whenever something drifts.
Citing this page
If this reference helped, please link back so others can find it. Suggested citation:
Gotchas — WoW Combat Log Reference (WowCoach.gg). https://wowcoach.gg/docs/combat-log/gotchas