Skip to content

RaidKit · Web tool

Raid Ledger

Paste a Warcraft Logs report and see who was flasked, fed, enchanted, gemmed and resist-capped, per player, per pull.

Web toolTBC Classic Anniversary2026-09-12Live For raid leaders, officers and loot or attendance managers who log to Warcraft Logs and want a fast, defensible answer to "who came unprepared" — and raiders checking their own prep

Nobody: it is a web page · In your browser; the audit runs on the RaidKit server and the report is cached for everyone · Nothing. Send them the report link and they see the same tables; an account is needed only for private reportsLive at raidkit.app: all three audits, the shared report cache and the Warcraft Logs connection for private reports. Per-guild race and Mage talent settings still come from seed files for one guild, and there is no settings page or export yet.

Overview

Raid Ledger is the audit tool inside RaidKit for Classic Anniversary raids, currently the Burning Crusade phase. After a raid night you want to know who actually showed up prepared. The Warcraft Logs site can tell you, but only one player, one slot and one fight at a time, and its own gems and enchants column mislabels enchants. Raid Ledger reads the combat log data instead: the gear and buff snapshot Warcraft Logs records at every boss pull, plus the buff and cast events during each fight. It turns that into three color-coded tables with a Flags column that says in plain words what each person is missing.

The three audits are shadow resistance (for Mother Shahraz in Black Temple: each raider's resistance from gear and from buffs at the pull, scored against 244 buffed and 160 gear), enchants and gems (is every enchantable slot enchanted and every socket filled, with the exact missing slots named) and consumables (flask or elixir uptime, food uptime and potions used against a two-minute cooldown budget, per player across every boss of the night, optionally including trash). One note on wording: on this page SR means shadow resistance. In Gargul Persistence Bonus, RaidKit's loot ledger tool, SR means soft reserve.

Using it feels like pasting a link. There is nothing to install and no account is needed for public or unlisted reports. You paste the report URL or its 16-character code, a fight list appears, you click an audit, and a sortable table comes back. Every fetch is cached on the server, so a report opened once is served from the cache for everyone after. Private reports open too once you sign in and connect your own Warcraft Logs account under Settings > Connections.

Raid Ledger reads reports through the Warcraft Logs API. Warcraft Logs is a separate service; RaidKit is not affiliated with or endorsed by it. World of Warcraft is a trademark of Blizzard Entertainment, and RaidKit is a fan-made project with no affiliation to Blizzard. The other RaidKit tools (Broken Dice, Gargul Persistence Bonus, Grudge List and Raid Ping) are separate products; Raid Ledger shares no data with them today.

What it does, in detail

What the audit reads and what it cannot see

Warcraft Logs stores a combatant-info snapshot at the start of every boss pull: each player's equipped items with enchant, temporary enchant and gem ids, and the auras on them at that moment. Raid Ledger resolves those ids against an offline item, enchant and gem database built from the wowsims project's tooltip dumps, plus an extra.json file for Anniversary-only items the dump predates. An item id the database does not know is never silently dropped: the shadow resistance audit lists it in Flags as "Unknown items: [ids]", and the enchants and gems audit treats an unknown off-hand item as one that needs an enchant, although it cannot know the item's socket count and does not mark the row. The audits therefore describe the state at each pull, not between pulls, and a player who died before a snapshot's pull can show fewer buffs than they actually used.

Two things are not in the log at all: race and talent ranks. Draenei and Undead get +10 shadow resistance, and a Mage's Magic Absorption talent gives +2 resistance to everything per point (up to 5). Today these come from two seed files carried over from the Python tool; the race file is keyed by character name, and a Name-Server key also works. Alliance Shamans are inferred as Draenei and Horde Paladins as Blood Elf from class and faction, where the faction comes from the report's guild (or from a character probe stored with the snapshot), so a report with no guild attached gets no inference. Everyone else without an entry shows ? and a flag. A per-guild settings page is the planned replacement.

Shadow resistance for Mother Shahraz

For the selected fight, each raider gets a Gear SR (items, assumed green suffixes, enchants, armor kits, glyphs and resist-all gems) and a Buffed SR (gear plus the strongest protection buff, flask, Broiled Bloodfin, Gift of Arthas, Mage or Demon Armor, racial and talent). The targets are buffed at or above 244 and gear at or above 160; green means at target, red means below, and tanks are never colored. Each row also shows Race / Class and Role. The table is sorted by gear SR so the weakest links are at the bottom.

Buffs in one group do not stack, so only the strongest counts: Prayer of Shadow Protection at +70 beats Gift of the Wild at +25 in the protection group, and the flask, food, Gift of Arthas and armor groups each count once. The buff columns are headed Shadow Protection, Flask, Broiled Bloodfin, Gift of Arthas and Mage (the armor column, which shows n/a for any class other than Mage or Warlock). Hover a buff cell to see which buff was actually found. Random-suffix greens (the "of Shadow Protection" pieces most people wear for this fight) are a special case because the log does not store the suffix. Every random-suffix item is counted as its shadow-resistance roll: known items use a Wowhead-verified table, unlisted ones are interpolated from same-slot greens at that item level and listed in Flags as "Estimated green suffix value", and items with no SR suffix at all count 0. The engine notes every assumed green as "ASSUMED SR suffix — verify in game", but the site does not show per-item notes, so a green with a known suffix value produces no visible flag; check the Greens column instead.

Enchants and gems

The enchants and gems audit answers one question per slot: should it carry an enchant, and does it. Head, shoulder, back, chest, wrist, hands, legs, feet and main hand always need one. Off hand needs one only if it is a weapon or shield: a one-hand weapon in the off hand is required, a Held In Off-hand item is n/a, and an item the offline database does not know is treated as required. Ranged needs one only if it is a bow, gun or crossbow, and neck, waist, trinkets, shirt and tabard never do. Socket counts come from the offline database, so an empty socket is caught even though the log only records filled ones. An enchant id the database does not know is counted as present, and a log that shows more gems than the item has sockets is noted in the engine; neither note is shown on the site.

Each row shows Enchants done/needed, Gems filled/sockets, a Status of OK or MISSING, and a Missing column with the exact problem ("Legs: no enchant", "Head: 2 empty sockets"). Rings follow the auto policy: ring enchants exist only for Enchanters, so both rings are required only for a player who already has one ring enchanted. A separate Warnings column lists things that do not change Status: a poor, common or uncommon quality gem, a meta socket filled with a non-meta gem, and no temporary weapon enchant (oil, sharpening stone, poison or shaman imbue) on the main hand at the pull.

Consumables across the whole night

The consumables audit covers every boss encounter in the report rather than one pull. For each player it shows Fights (how many of the covered fights they attended), Flask / elixirs as the average uptime of whichever was up (a flask, a battle elixir or a guardian elixir; under the "any" policy a flask or a single elixir is a complete setup), Food as the average Well Fed uptime shown as a percentage (the engine resolves which food was eaten, but the site does not display the name), and Potions as used / possible. The budget is one potion per two minutes of fight plus the opener, because every TBC potion shares a two-minute cooldown. A Potion breakdown lists what was used (for example 4× Haste Potion, 2× Super Mana Potion). Rows are grouped Tanks, Healers, DPS. A player who appears only on trash and attended no boss fight is left out.

Uptime cells are green at 90 percent or better and red under 50 percent. Potion cells are green at 50 percent of budget or better and red under 25 percent. Flags spell it out: "No flask or elixir in n/N fights" with the boss names, which fires for any fight where the best flask or elixir uptime was under 50 percent, "No food in n/N fights", "Food dropped below 90% in n fights (died / ate late)", "0 potions in n/N boss fights", "Potion usage x/y possible (z%)" when under half the budget, and "Unverified classification" when a flask, elixir or food buff was recognized only by its name rather than a known spell id (potions, healthstones, drums and runes matched by name are counted without that flag). The engine also has an "Only one elixir, no flask ... counts as 50% coverage" flag, but it only fires under the both policy, which the site does not run. Healthstones, drums and runes are tracked in the engine but not yet shown as columns.

Trash pulls have no aura snapshot, so they are off by default. Include trash carries each player's flask, elixir and food state forward from the last boss pull or event, capped at the buff's duration (flask two hours, elixirs one hour, food thirty minutes), until the next boss snapshot resets it. Potions used on trash never count against the budget; they appear as "(+n on trash)" in the breakdown. Treat trash numbers as approximate.

Tables you can sort and share

Click any column header to sort, click again to flip. Sorting is value-aware: "17/21" sorts by the ratio and "72%" by the number. The first click on a number column sorts descending, which puts "?" and blanks at the bottom; the second click flips to ascending and they move to the top. Text columns such as Player and Flags start ascending. The Flags, Missing, Warnings and Potion breakdown columns wrap as text so a long list stays readable. Every audit lives at a plain URL, so sharing a result is pasting a link into Discord; whoever opens it sees the same cached tables without signing in, unless the report is private.

Caching, refresh and the live window

Every fetch from Warcraft Logs is stored once in the RaidKit database and shared by all viewers. A report that ended less than 24 hours ago is treated as live: opening it re-checks the fight list against the API, a fight whose end time moved is refetched, and the consumables lines are rebuilt when new fights appear. Older reports are served from cache until someone asks for a refetch. The Refresh button on the report page adds ?refresh=1 to the report URL, which refetches only the report header (title, fight list, visibility); the audit links it renders carry no refresh flag, so a cached audit is still served unless its fight's end time or the set of fights changed. To refetch an audit itself, add ?refresh=1 to that audit's own URL. Signed in, /ledger lists the reports you have opened (most recently opened first, up to 12) and the homepage the last 4; the list is yours alone — no one else's reports appear in it and yours appear in no one else's — and a Forget button drops a report from it. Signed out, nothing is listed.

Public, unlisted and private reports

Public and unlisted reports are read with RaidKit's own Warcraft Logs API client, exactly as Warcraft Logs would serve them to anyone with the link, and the site finds the report across the www, classic and fresh partitions on its own. A private report is different: it is read only with the token of a signed-in person who connected a Warcraft Logs account that can see it, and cached data for a private report is served only after Warcraft Logs confirms on that request that the viewer's token still opens it. The cache never makes a private report more public than it is on Warcraft Logs.

When a fetch fails, the notice says the next step for you specifically: Sign in, Connect Warcraft Logs, or Reconnect Warcraft Logs when a link has expired. Long-lived tokens are refreshed automatically near expiry; a refused refresh asks you to reconnect. What RaidKit keeps for the connection is your Warcraft Logs username and the tokens it issued. Disconnecting deletes them. A RaidKit account itself is created with Google, GitHub or an email address and password (with email verification, forgot and reset password, and an optional authenticator app as a second factor); Warcraft Logs shares no email address, so Continue with Warcraft Logs only signs in an account that already connected it from Settings.

Where the engine came from

The audit engine is a line-for-line TypeScript port of the author's wow-audit Python tool, and parity tests hold both implementations to the same numbers on the same fixtures (for example one character at 174 gear and 244 buffed shadow resistance, matched against the in-game character sheet). The Python tool remains the offline reference and still has a few things the web version does not: an editable Magic Absorption rank picker and per-audit Excel workbooks. The web table's Talent cell already carries the rank-picker data (player, talent, rank, maximum), but the site does not render a picker yet.

Functions

20 features · 15 URLs · 13 settings. Grouped by what you are doing; open a group to see its items.

Features

The four audits9
Shadow resistance audit
Gear SR and Buffed SR per raider for the selected fight, with Race / Class and Role, Items, Greens, Enchants and Gems source columns, one column per buff group (the Mage column shows n/a for classes other than Mage and Warlock), Racial and Talent columns, and Flags. Colored against buffed 244 and gear 160; tanks are not colored; sorted by gear SR.
Greens counted as their SR suffix
The log does not store a random suffix, so every random-suffix item is counted as its of Shadow Protection or of Shadow Resistance roll: Wowhead-verified values for known items, interpolated for unlisted ones and listed in Flags as an estimated green suffix value, 0 for items with no SR suffix. The engine's per-item "ASSUMED SR suffix" note is not shown on the site, so verify greens in game.
Plain-language SR flags
Per non-tank: no Glyph of Shadow Warding (+20), Shadow Armor Kits on n/4 slots, no SR cloak enchant (+15 available), no Medallion of Karabor (+40), only a weaker protection buff (or none) at pull, no Flask of Chromatic Wonder (+35), no Broiled Bloodfin (+8), no Gift of Arthas (+10). Tanks get a single "Tank — no SR gear expected" flag instead. For Mages and Warlocks: Fel Armor instead of Demon Armor, or armor spell not in the snapshot. Also race unknown, Magic Absorption rank not on file, estimated green values and unknown item ids.
Enchants & gems audit
Enchants done/needed, Gems filled/sockets, Status OK or MISSING, and a Missing column naming the slot and problem. TBC slot rules built in: nine slots always, off hand only for weapons and shields (a one-hand weapon there is required, a Held In Off-hand item is n/a, an item unknown to the database is treated as required), ranged only for bows, guns and crossbows, never for neck, waist, trinkets, shirt or tabard. Sorted by number of missing items.
Ring enchant policy (auto)
Both rings are required only for a player who already has one ring enchanted, since ring enchants exist only for Enchanters. The engine also supports require and ignore, but the web UI always uses auto today.
Gear warnings that do not change Status
Poor, common or uncommon quality gems, a meta socket without a meta gem, and "Main Hand: no temporary weapon enchant (oil / stone / poison) at pull". The engine resolves the name of a temporary enchant that is present, but the site does not show it.
Buffs at the pull
One column per raid buff family for the selected fight — Fortitude, Spirit, Intellect, Mark of the Wild, Shadow Protection, the six blessings, Shout, Blood Pact — with a Missing count and Flags. A buff is expected only when someone in the raid has it; Intellect, Spirit and Wisdom apply to mana classes; blessings are judged as a set (N paladins, N blessings), Salvation never on a tank, and with two paladins Kings for all, Might for melee, Wisdom for mana users. Low ranks are marked.
Consumables audit for the whole report
Per player across every boss encounter: Fights attended, Flask / elixirs uptime, Food uptime, Potions used / possible with a two-minute cooldown budget, a Potion breakdown by type, and Flags. Rows grouped Tanks, Healers, DPS; players seen only on trash are skipped.
Include trash
Adds every trash pull with flask, elixir and food state carried forward from the last boss snapshot (capped at two hours, one hour and thirty minutes). Potions on trash are shown as (+n on trash) and never count against the budget.
Reports and tables6
Paste a report, get a fight list
Paste a Warcraft Logs URL or a bare 16-character report code on the homepage or /ledger. A ?fight= parameter in the URL carries over. The report page shows title, zone, date, boss and trash counts, guild and logger, then every boss pull with Kill or Wipe (with percent left), length, and per-pull SR and Enchants & gems links. The /ledger page also has a Docs button that opens this page.
Sortable, color-coded tables
Click a header to sort, again to flip; ratios and percentages sort by value. Number columns start descending with blanks and "?" at the bottom; flipping to ascending moves them to the top. Cells are toned ok, warn or bad; hovering a buff cell shows which buff was found.
Shared report cache with a 24-hour live window
Each fetch is stored once and shared by every viewer. Reports that ended less than 24 hours ago are re-checked on open so a log loaded mid-raid does not stay frozen. The report page's Refresh button refetches the report header; ?refresh=1 on an audit URL refetches that audit.
Your recent reports
Signed in, /ledger remembers the reports you open (up to 12, most recently opened first) and the homepage shows the last 4. The list is private to your account: other people's reports never appear in it, and yours never appear in theirs. Forget removes one.
Fight selection
?fight= accepts last (the last boss pull, the default), last-kill, a fight id, or a boss-name substring, which picks the last kill of that boss or else the last pull.
Configuration warning
When the site's Warcraft Logs API credentials are missing, /ledger shows "Warcraft Logs is not configured on this site, so new reports cannot be fetched yet" instead of failing on the first paste.
Accounts and private reports4
Private reports through your own Warcraft Logs account
Sign in, connect Warcraft Logs under Settings > Connections, and private reports you can see there open here. Cached private data is served only after Warcraft Logs re-confirms your access on that request. Errors name the next step: Sign in, Connect Warcraft Logs or Reconnect Warcraft Logs.
Connections settings
Warcraft Logs is listed first with Connect, Reconnect and Disconnect, the connected username and date, and an expired-access notice. Disconnecting deletes the stored tokens and is refused if it would leave the account with no other way to sign in.
RaidKit account with email and password
Accounts are created with Google, GitHub, or an email address and password. Sign-up sends an email verification, forgot and reset password exist, and you can add an authenticator app (TOTP) as a second factor. Continue with Warcraft Logs on the sign-in page only signs in an account that already connected Warcraft Logs from Settings, because Warcraft Logs shares no email address.
Character memory and manual overrides
Race and professions per character, learned from every report and settable by hand from the audit tables when signed in. Manual entries beat automatic ones and persist across reports.
Game data1
Offline game data with overrides
Item, enchant and gem lookups use compact JSON built from the wowsims dumps plus extra.json for Anniversary-only items. TBC enchant names are corrected (Arcanum of becomes Glyph of). An unknown item id is listed in the SR audit's Flags; an unknown enchant id is counted as present.

URLs

Open a report3
CommandWhat it does
/ledgerFront door. Paste a Warcraft Logs report URL or 16-character code; signed in, it also lists the reports you have opened, whether your Warcraft Logs account is connected, and a Docs button to this page.
/ledger/open?ref=<url or code>Resolves a report reference and redirects to /ledger/<code>, carrying any ?fight= from the pasted URL. A bad reference goes back to /ledger with the reason. This is what the homepage form submits to, so it works without JavaScript.
/ledger/<code>Report view: title, zone, date, boss and trash counts, guild and logger; the boss pull table with per-pull SR and Enchants & gems links; the three audit buttons and a Consumables + trash button; a Refresh button.
Pick a fight4
CommandWhat it does
/ledger/<code>?fight=lastSelects the pull the per-fight audits run on. last is the default (last boss pull).
/ledger/<code>?fight=last-killSelects the last boss kill in the report. lastkill and kill also work.
/ledger/<code>?fight=<id>Selects a specific fight by its Warcraft Logs fight id (the # column on the report page).
/ledger/<code>?fight=shahrazSelects by boss-name substring: the last kill of that boss, or the last pull if there was no kill.
Run an audit4
CommandWhat it does
/ledger/<code>/sr?fight=last-killShadow resistance audit for the selected fight.
/ledger/<code>/gear?fight=last-killEnchants & gems audit for the selected fight.
/ledger/<code>/consumablesConsumables audit across every boss encounter of the report.
/ledger/<code>/consumables?scope=allConsumables audit including trash pulls, with carried-forward buff state.
Refresh2
CommandWhat it does
/ledger/<code>?refresh=1What the Refresh button opens: refetches the report header (fight list, title, visibility) from Warcraft Logs. Cached audits are not refetched by this alone.
/ledger/<code>/sr?fight=last&refresh=1?refresh=1 on an audit URL (sr, gear or consumables) refetches that audit's data from Warcraft Logs instead of serving the cache.
Account2
CommandWhat it does
/settings/connectionsConnect, reconnect or disconnect your Warcraft Logs account. Needed only for private reports; requires being signed in.
/sign-upCreate a RaidKit account with an email address and password (a verification email follows), or with Google or GitHub. Needed only for private reports.

Settings

Audit thresholds and policies5
SR targets: buffed 244, gear 160
The Mother Shahraz thresholds in the anniversary rules (srThresholdBuffed, srThresholdGear). Gear SR at or above 160 and Buffed SR at or above 244 color green, below colors red, tanks are never colored. The table function accepts overrides, but the web UI does not expose them yet.
ELIXIR policy: any
A flask or a single elixir counts as full coverage in the Flask / elixirs column. The engine also understands both, which would require two elixirs in place of a flask, count one elixir as 50 percent and add an "Only one elixir, no flask" flag; the site runs any.
Potion budget: one per 120 seconds plus the opener
potionCooldownS is 120 because every TBC potion shares a two-minute cooldown with no potion sickness. Possible potions per boss fight = floor(fight seconds / 120) + 1. Trash pulls have a budget of zero.
Food target uptime: 90 percent
foodTargetUptime is 0.9. A fight where food was up less than 90 percent of the time is flagged as dropped, which usually means a death or eating late.
Ring policy: auto
ringPolicyDefault is auto: both rings are required only when the player already has one ring enchanted (an Enchanter). require and ignore exist in the engine but are not selectable on the site.
Per view3
Fight selection (?fight=)
Which pull the shadow resistance and enchants & gems audits use: last (default), last-kill, a fight id, or a boss-name substring.
Consumables scope: Boss encounters only / Include trash
A toggle button on the consumables audit (the report page also has a Consumables + trash button). Include trash is ?scope=all.
Refresh (?refresh=1)
Bypasses the cache for that request only. On the report URL (the Refresh button) it refetches the header; on an audit URL it refetches that audit. A report that ended less than 24 hours ago is re-checked automatically anyway.
Guild settings2
Guild setting: player races (seed file today)
Race is not in the Warcraft Logs data. Draenei and Undead are worth +10 shadow resistance. Today races come from data/races.seed.json, a name-to-race map for one guild that also accepts Name-Server keys; Alliance Shamans and Horde Paladins are inferred from class and the report's guild faction (or a character probe), so a report with no guild gets no inference. Unknown races show ? and a flag. Not editable on the site yet.
Guild setting: Mage Magic Absorption ranks and manual adjustments (seed file today)
Rank 0 to 5 gives +2 resistance to everything per point. Any player can also have a manual +N with a note. Today these come from data/sr_adjustments.seed.json. A Mage without an entry shows ? in the Talent column and is flagged. Not editable on the site yet, although the Python tool has a rank picker and the web Talent cell already carries the picker data.
Account and deployment3
Warcraft Logs connection (Settings > Connections)
Connect, Reconnect or Disconnect your Warcraft Logs account. Required only for private reports. Stores your Warcraft Logs username and the OAuth tokens it issued; Disconnect deletes them.
Deployment: WCL_CLIENT_ID and WCL_CLIENT_SECRET
The site's own Warcraft Logs API client credentials, used for public and unlisted reports. When either is missing, /ledger shows "Warcraft Logs is not configured on this site" and new reports cannot be fetched. Values live in the server environment, never on the page.
Deployment: AUTH_WARCRAFTLOGS_ID and AUTH_WARCRAFTLOGS_SECRET
The OAuth client used for Connect Warcraft Logs and for refreshing a connected user's token near expiry. When they are missing, an expired connection cannot refresh and the notice asks you to reconnect.

How-to guides

01First raid night with Raid LedgerThe whole loop for a raid leader after the first logged night: paste the report, read the three audits, and send the links. Nothing to install and no account needed for a public or unlisted log.8 steps
  1. 1After the raid, open your report on Warcraft Logs and copy its URL from the address bar (something like https://fresh.warcraftlogs.com/reports/<code>?fight=last). The 16-character code on its own also works.
  2. 2Go to raidkit.app/ledger, paste the URL into the box and click Open report. On the homepage the same form is labeled Audit it.
  3. 3You land on /ledger/<code>. Check the header: zone, date, number of boss encounters and trash pulls, and the guild name. The table lists every boss pull with Kill or Wipe (and percent left), the length, and SR and Enchants & gems links for that pull.
  4. 4The first open fetches from Warcraft Logs. After that the report is cached and shared by everyone who opens the same link.
  5. 5Click Enchants & gems. The button hint tells you which pull it uses (the last boss pull unless the URL said otherwise). Sort by Status or read the Missing column for the exact slot each person forgot.
  6. 6Go back with Fight list and click Consumables. This covers every boss of the night. Read Flags for who had a flask or elixir up less than half the fight, no food, or almost no potions, and which bosses it happened on.
  7. 7If you raid Black Temple, click Shadow resistance on the Mother Shahraz pull. Gear SR under 160 or Buffed SR under 244 shows red; tanks are not colored.
  8. 8Copy the audit URLs and paste them into your raid channel. Anyone can open them without signing in. Officers who want to check a different pull can change ?fight= in the URL.
02Check shadow resistance before Mother ShahrazShadow resistance (SR on this page, not soft reserve) is what Mother Shahraz's fight demands. This audit reads each raider's gear and pull-time buffs and scores them against 244 buffed and 160 gear.7 steps
  1. 1On the report page click SR next to the Shahraz pull, or click the Shadow resistance button, or set ?fight=shahraz in the URL. Any pull works if you only care about gear; a Shahraz pull also shows the buffs that were up for the real attempt.
  2. 2Read Gear SR (unbuffed, target 160) and Buffed SR (with pull-time buffs, target 244). Green is at or above target, red is below. Tanks are never colored and carry the flag "Tank — no SR gear expected".
  3. 3Use Items, Greens, Enchants and Gems to see where a number comes from. Greens are counted as their shadow-resistance suffix; only interpolated ones show an "Estimated green suffix value" flag, and a green with a known suffix value shows no flag at all, so verify a borderline player's greens in game.
  4. 4Read the buff columns: Shadow Protection (the strongest of Prayer of Shadow Protection, Shadow Protection, Shadow Resistance Aura and Gift of the Wild, since they do not stack), Flask, Broiled Bloodfin, Gift of Arthas, and Mage, the armor column, which counts Mage Armor or Demon Armor and shows n/a for every other class. Hover a cell to see which buff was found.
  5. 5Read Flags. They name the missing pieces with their value: Glyph of Shadow Warding (+20), Shadow Armor Kits on n/4 slots, an SR cloak enchant (+15), Medallion of Karabor (+40), Flask of Chromatic Wonder (+35), Broiled Bloodfin (+8), Gift of Arthas (+10), and Fel Armor on a Warlock who should be in Demon Armor.
  6. 6A ? in Racial or Talent means the race or the Mage's Magic Absorption rank is not on file, so that player's Buffed SR may be up to 10 short. Today those values come from a seed file; a settings page is planned.
  7. 7Click Gear SR or Buffed SR to sort by that column; click again to flip. The default order is gear SR descending, so the players to talk to are at the bottom.
03Find who is missing enchants or gemsOne table per pull that names the exact slot and problem for every raider, using TBC slot rules so an unenchantable off hand or relic never counts against anyone.6 steps
  1. 1On the report page click Enchants & gems, or the Enchants & gems link on a specific pull. The URL is /ledger/<code>/gear?fight=<id>.
  2. 2Status is OK or MISSING. Enchants shows done/needed and Gems shows filled/total sockets for that player.
  3. 3The Missing column names the exact problem: "Chest: no enchant", "Head: 1 empty socket". Rows with the most problems sort to the top by default.
  4. 4Rings follow the auto policy: a player with one ring enchanted is an Enchanter and is expected to have both, everyone else's rings are ignored.
  5. 5Warnings are informational and do not change Status: a poor, common or uncommon quality gem, a meta socket without a meta gem, and "Main Hand: no temporary weapon enchant (oil / stone / poison) at pull".
  6. 6This table does not mark items the offline database does not know: their socket count is unknown, so an empty socket on such an item is not caught, and an unknown off-hand item is treated as needing an enchant. Open the SR audit for the same pull to see "Unknown items: [ids]" in Flags. Anniversary-only items need adding to extra.json.
04Review flasks, food and potions for the whole nightThe consumables audit reads buff uptimes and potion casts across every boss encounter of the report, so one table covers the whole raid.6 steps
  1. 1Open the SR or Enchants & gems audit once first. The consumables view borrows roles and specs from a cached fight snapshot of the same report; without one, everyone shows as DPS with no spec.
  2. 2On the report page click Consumables. The title tells you how many boss encounters and kills it covers, and the Fights column shows how many each player attended.
  3. 3Flask / elixirs and Food are average uptime over the fights each player attended, shown as percentages. A flask or a single elixir counts as a full setup. Green at 90 percent or better, red under 50 percent.
  4. 4Potions is used / possible on boss fights, where possible is one per two minutes of fight plus the opener. Green at half the budget or better, red under a quarter.
  5. 5The Potion breakdown lists what was used, for example 4× Haste Potion, 2× Super Mana Potion. Flags list the bosses where a player's best flask or elixir uptime was under 50 percent, where they had no food, or zero potions, and note when food dropped below 90 percent (usually a death).
  6. 6Click Include trash to add trash pulls. Buff state on trash is carried forward from the last boss snapshot and capped at the buff's duration, so treat those numbers as approximate. Potions used on trash appear as (+n on trash) and never count against the budget. Click Boss encounters only to go back.
05Open a private reportPublic and unlisted reports need nothing. A private report is read only with the token of someone whose Warcraft Logs account can see it, so you connect yours once.6 steps
  1. 1Create a RaidKit account or sign in. Accounts are created with Google, GitHub, or an email address and password on /sign-up (a verification email follows; forgot and reset password exist, and you can add an authenticator app later). Continue with Warcraft Logs on the sign-in page only works for an account that has already connected Warcraft Logs, because Warcraft Logs shares no email address.
  2. 2Go to Settings > Connections. Warcraft Logs is listed first. Click Connect Warcraft Logs; you are sent to warcraftlogs.com to approve RaidKit and come straight back with a Connected badge showing your username and the date.
  3. 3Return to /ledger and paste the private report. The report page shows a "Private report" badge, and Warcraft Logs re-confirms your access every time cached data for it is served.
  4. 4If a report errors with a private or not-found message, the notice offers the next step for you: Sign in, Connect Warcraft Logs, or Reconnect Warcraft Logs when the link has expired. Tokens refresh on their own when they can; a refused refresh asks you to reconnect.
  5. 5A private report appears only in your own recent list, and other viewers without access get the same private notice, even for a cached report.
  6. 6To stop RaidKit reading your logs, click Disconnect on the Connections page. The stored tokens are deleted with it. Disconnect is refused if Warcraft Logs is the only way into your account and no password is set; set a password first.
06Re-audit a log that is still uploadingLogs are often uploaded live during the raid. The cache knows this and re-checks young reports, and Refresh exists for everything else.5 steps
  1. 1A report that ended less than 24 hours ago is treated as live. Opening it re-checks the fight list against Warcraft Logs, so new pulls appear as they upload.
  2. 2If a fight was cached while it was still in progress, its end time changes on the next check and the site refetches that fight on its own. The consumables lines are rebuilt when the set of fights changes.
  3. 3Reports older than 24 hours are served from cache until someone asks for a refetch.
  4. 4Refresh on the report page opens /ledger/<code>?refresh=1, which refetches only the report header (fight list, title, visibility). The audit links on that page carry no refresh flag, so a cached audit is still served unless its fight's end time or the set of fights changed.
  5. 5To force a refetch of an audit itself, add ?refresh=1 to that audit's own URL, for example /ledger/<code>/consumables?refresh=1 or /ledger/<code>/sr?fight=last&refresh=1.

Good to know

  • SR on this page means shadow resistance. In Gargul Persistence Bonus, RaidKit's loot ledger tool, SR means soft reserve.
  • Anniversary (TBC phase) is the only ruleset. Other Classic eras are not supported yet.
  • Every random-suffix green is counted as its shadow-resistance variant because the log does not store the suffix. Only interpolated greens show an "Estimated green suffix value" flag; a green with a known suffix value shows no flag, and the engine's per-item ASSUMED note is not displayed. Verify in game before trusting a borderline number.
  • Race is not in the Warcraft Logs data. Only Alliance Shamans (Draenei) and Horde Paladins (Blood Elf) are inferred, and only when the report has a guild faction (or a character probe) to read it from; everyone else needs an entry in the race seed file or shows ? and a flag. Draenei and Undead are worth +10.
  • Mage Magic Absorption ranks are not in the log. A Mage without an entry shows ? in the Talent column (counted as 0) and is flagged. The site cannot edit this yet.
  • The race and adjustment seed files hold one guild's roster, so other guilds' players show unknown race and talent flags until per-guild settings exist.
  • Consumables roles and specs are borrowed from a cached fight snapshot of the same report. Open Consumables before any SR or Enchants & gems audit and everyone shows as DPS with no spec.
  • Only boss pulls carry a gear and buff snapshot, and Warcraft Logs only serves events inside fights. The audits reflect the state at each pull, not between pulls.
  • Buffs drop on death, so a player who died before a snapshot's pull can show fewer buffs than they actually used.
  • Trash pulls have no snapshot. Include trash carries flask, elixir and food state forward, so a buff that quietly expired between pulls can be over-counted on trash.
  • Potions on trash never count against the budget; the budget is boss fights only. A player who attended no boss fight at all is left out of the consumables table.
  • "No flask or elixir in n/N fights" fires for any fight where the best flask or elixir uptime was under 50 percent, not only when nothing was up.
  • A flask, elixir or food buff recognized only by its name is flagged "Unverified classification"; potions, healthstones, drums and runes matched by name are counted without a flag, and any unknown elixir is assumed to be a battle elixir.
  • Fel Armor gives 0 resistance and is flagged for Warlocks; an armor spell missing from the pull snapshot is flagged rather than guessed. The armor column is headed Mage and shows n/a for every class other than Mage and Warlock.
  • Ring enchants are required only for players who already have one ring enchanted. The require and ignore policies exist in the engine but are not selectable on the site.
  • The 244 / 160 targets are fixed on the site even though the engine accepts overrides.
  • An item id the offline database does not know is listed in the SR audit's Flags as "Unknown items: [ids]". The Enchants & gems table does not mark it: its socket count is unknown, and if it sits in the off hand it is treated as needing an enchant. An unknown enchant id is counted as present. Anniversary-only items need adding to extra.json.
  • The temporary weapon enchant's name and the resolved food name are computed by the engine but not shown on the site; you see only the "no temporary weapon enchant" warning and a food uptime percentage.
  • Cached results are shared by everyone. A report that ended more than 24 hours ago is served from cache until someone asks for a refetch, and the report page's Refresh button refetches only the header; add ?refresh=1 to an audit URL to refetch that audit.
  • Sorting a number column descending puts "?" and blanks at the bottom; the second click (ascending) moves them to the top.
  • Your recent reports are ordered by when you opened them, not by the raid's date; /ledger shows 12, the homepage 4, and only when you are signed in.
  • There is no site-wide recent list: nobody sees which reports you open, and a private report's cache is served only after Warcraft Logs re-confirms the viewer's token on that request.
  • Continue with Warcraft Logs cannot create an account: Warcraft Logs shares no email address, so it only signs in an account that already connected it from Settings. Create the account with Google, GitHub or email and password first.
  • You cannot disconnect Warcraft Logs if it is the only way into your account and no password is set.
  • No Excel or workbook export in the web version yet; the Python tool has it.
  • Healthstones, drums and runes are computed per fight in the engine but not shown as columns yet.
  • Do not trust the Warcraft Logs site's own gems and enchants column for this; it mislabels enchants such as Glyph of Shadow Warding. Raid Ledger resolves the raw enchant effect ids instead.
  • Race comes from the log when it can (a racial ability seen in the report, or class plus the faction the Warcraft Logs character API reports). A player who never used a racial and whose class does not pin the race shows as ? and gets no racial bonus.

Visuals

From one pasted Warcraft Logs link to three audit tables: the page flow of Raid Ledger.
How a report travels from the Warcraft Logs API through the shared cache and the TypeScript engine into the audit table.
What goes into Gear SR and Buffed SR for one raider, measured against the Mother Shahraz targets of 160 and 244.

Requirements & credits

Requirements

  • A Warcraft Logs report from a Classic Anniversary (TBC phase) raid. Public or unlisted works as-is; private needs a signed-in RaidKit account with a connected Warcraft Logs account.
  • A modern web browser. Nothing to install.
  • Optional: a RaidKit account (created with Google, GitHub, or an email address and password) and a Warcraft Logs account connected under Settings > Connections, only for private reports. Continue with Warcraft Logs signs in only an account that already made that connection.
  • For race and Mage talent values in the shadow resistance audit: an entry in the seed files, which today hold one guild's roster. Other guilds' players show ? and a flag until per-guild settings exist.
  • For the site operator: Warcraft Logs API credentials (WCL_CLIENT_ID and WCL_CLIENT_SECRET) in the server environment, and an OAuth client (AUTH_WARCRAFTLOGS_ID and AUTH_WARCRAFTLOGS_SECRET) for Connect Warcraft Logs; without the first, /ledger says Warcraft Logs is not configured.

Credits

  • Warcraft Logs — All report data comes from the Warcraft Logs v2 API, with the site's own client for public and unlisted reports and your own Warcraft Logs account for private ones. Warcraft Logs is a separate service; RaidKit is not affiliated with or endorsed by it.
  • wowsims — The offline item, enchant and gem databases are built from the open-source wowsims TBC and WotLK repositories' tooltip dumps. Not affiliated.
  • Wowhead — Resistance values, random-suffix tables and spell effects were verified against Wowhead TBC tooltips. Not affiliated.
  • Blizzard Entertainment — World of Warcraft and all related names are trademarks of Blizzard Entertainment. RaidKit is a fan-made project and is not affiliated with or endorsed by Blizzard.
  • Blizzard Entertainment — character race, class and faction come from Blizzard's profile API; World of Warcraft and that data are Blizzard's. RaidKit is not affiliated with or endorsed by Blizzard.

Download & install

Nothing to install

  1. 1Nothing to install. Open raidkit.app/ledger in any modern browser.
  2. 2Paste a Warcraft Logs report URL or its 16-character code and click Open report (Audit it on the homepage). Public and unlisted reports need no account.
  3. 3For private reports: create a RaidKit account with Google, GitHub or an email address and password, sign in, go to Settings > Connections and click Connect Warcraft Logs. You approve RaidKit on warcraftlogs.com and come straight back.
  4. 4Share any /ledger/<code> or audit URL with your raid; they open without signing in unless the report is private.

Changelog

  1. 2026-09-22
    • Meta gems are checked for activation, not just presence. A TBC meta does nothing until the rest of the gear meets its color requirement and the game never says so, so the Enchants & gems table has a Meta column — active, INACTIVE, empty, ? or — — with the requirement and the gear's actual color counts in the tooltip. An inactive meta counts as missing gear, so it reaches the Status column, the night grid and the player's history. Requirements come from Wowhead's own tooltip text for all eighteen TBC metas, in both of its forms ("at least 2 Red Gems" and "more Red gems than Blue gems"); an orange gem counts as a red and a yellow, purple as red and blue, green as yellow and blue. A gem the offline data cannot color leaves the verdict at ? rather than accusing anyone.
    • Docs: a /docs section with a guide per tool and six for Raid Ledger — how to read every table and flag, the fight and link syntax, private reports, the shadow-resistance arithmetic, and what an unknown item means. Every audit header links to its section.
    • Live logs: a report whose last fight is within a day is re-fetched at most once every five minutes however many people are watching, and the report page and night grid show a Live pill, poll for the next pull for two hours after the last one, and refresh themselves when it lands.
  2. vguilds2026-09-13
    • Buffs at the pull: a fourth audit with one column per raid buff family (Fortitude, Spirit, Intellect, Mark of the Wild, Shadow Protection, the six blessings, Shout, Blood Pact), a Missing count and Flags such as 'no Kings', 'no Might', 'Salvation on a tank' and low ranks. A buff is expected only when at least half the raid visibly carries it, because Warcraft Logs cannot see a buff cast before logging began.
    • Guilds: create yours with realm, region and faction; roles read Guild Master, Officer and Raider; Discord-pasteable join links with a role, an expiry and an optional use cap; email invites for the individual case.
    • Per-guild roster: talent ranks (a Mage's Magic Absorption) and manual SR bonuses live on /guilds/<slug>/roster and on the Talent cell of any SR audit; an audit reads the guild named on the report, or your own; one click adds a report's missing players to the roster; raiders unseen for sixty days are marked stale.
    • Automatic posts: turn it on beside the webhook and every new log's summary lands in the channel the morning after the raid — nobody pastes a link.
    • Player history: every name in a table links to that character's page — the latest audited pull of each public report, an enchants trend, consumables night by night, and the things that keep coming back (the same missing slot on three or more reports).
    • Gear sanity under the enchants table: PvP pieces named, empty slots, armor lighter than the class wears, and an item level far under the raid's — warnings, never a Status.
    • Hit & expertise: every dps against the boss caps — 9% melee and ranged, 16% spell, 26 expertise — from the ratings in the log plus the talent hit that spec usually carries, named so you can disagree; the Flags say how many rating points short.
    • Sign in with Warcraft Logs alone: no email or password needed to open your private reports; add an address later from Settings if you want notifications.
    • The night: /ledger/<code>/night is every player by every boss pull with one dot per audit — gear, buffs, shadow resistance on Mother Shahraz — a consumables dot for the whole night and a Red count per player; pulls not yet cached load one at a time while you watch.
    • Summary: /ledger/<code>/summary shows the last kill as three or four tiles — enchanted & gemmed, buffed at the pull, flasked & fed, shadow resistance on Mother Shahraz — with the names that did not make it, and the link unfurls into a card with the same numbers.
    • Post to Discord: an Officer saves the raid channel's webhook on the guild page, and every audit page gets a button that posts the same text Copy for Discord produces. A flag on every audit row files 'this looks wrong' with the row as shown.
    • Attendance: who was in the raid for which pulls, from the report header alone — boss pulls, kills, first and last pull, joined late / left early / sat out, and a bench-swaps table per pull.
    • Your guild's latest logs: with a guild set up here (realm and region), /ledger lists its newest Warcraft Logs reports with an 'audited' mark and a link straight to the night — no hunting for the URL in Discord.
    • Compare with last week: /ledger/<code>/compare lines this report up against the previous one from the same guild — or any report you paste — and says per player what was fixed, what is new and what is still there.
    • Pre-pots: the consumables audit now knows when each potion was used, so a Pre-pots column counts the boss pulls that opened with one and the Flags say which pulls did not.
    • Consumables: the wrong flask for the job is flagged — Mighty Restoration on a Rogue, Healing Power on a Warrior, Fortification on a Mage — judged as tank, healer, caster or physical from the spec, and only when the spec is known. Hybrids get the benefit of the doubt.
    • Account export is raidkit-export-*.json with your Warcraft Logs link (never its tokens), guilds, opened reports and the character facts you set; the only Guild Master of a guild cannot delete their account until someone else leads it.
  3. 2026-09-13
    • Character memory: the site now remembers each character's race and professions by name and realm, learned from every report (racial casts, Blizzard, class rules, profession-only gear and casts, ring enchants) and reused on the next one.
    • Click-to-set: signed in, a pencil on any uncertain Race or Engineer cell lets a raid leader set the race or the two professions; a manual entry wins over every automatic source from then on.
    • Professions rule things out: two known professions without Engineering means "not an Engineer"; without Enchanting, ring enchants are no longer expected of that player.
    • Races from Blizzard's character profile API where the log cannot name them, cached per character. On a typical Anniversary raid this resolves most of the remaining unknowns; the audit says which source each race came from.
    • A privacy page (/privacy) describing what the site stores, including the Blizzard character data.

Full changelog for Raid Ledger

More from RaidKit