Chapter 06
Playtesting and iteration
No homebrew monster survives contact with a party unchanged, and that's fine. The published books were playtested for years and still produced imbalanced monsters. This chapter covers the checks worth doing before the session, and the adjustments that worth making during and after it.
Pre-flight math checks
Verifying against the benchmark table catches most problems before they reach the table:
- Row check. Put the creature's AC, HP, attack bonus, DC, and damage per round next to its CR row. One or two deliberate deviations that express its role: good. Everything high or everything low: relabel the CR.
- Offense/defense split. Estimate the CR row its defenses resemble and the row its offense resembles, and average them. If the average deviates from the printed CR by more than a point, adjust.
- Nova check. Compute the creature's best possible round (everything hits, recharge available). If that round can take the party's squishiest member from full to zero, decide if this is on purpose or not. If you keep it, make sure it's telegraphed.
- Worst-case round for the monster. Now assume it's stunned, restrained, or banished round one. Does it still get to do anything this fight? If not, back to action economy.
- Comparison smell test. Teos Abadía's favorite check is also the oldest one: put your statblock next to a published monster of the same CR (the SRD library is right here) and ask which one you'd rather run.
Gauge the encounter, not just the monster
The Lazy GM's Resource Document offers a benchmark simple enough to do in your head (CC-BY 4.0): an encounter might be deadly if the sum of monster CRs is greater than ¼ of the sum of character levels (levels 1–4), or ½ of the sum (level 5+).
Five 4th-level characters (total 20, ÷4 = 5) against four CR 2 ogres (total 8): potentially deadly. The same party at 5th level (total 25, ÷2 = 12): a manageable fight. "Deadly" here means characters dropping and a real chance someone dies. The benchmark is a guideline, and circumstances (terrain, rest state, waves, surprise) can push fights across it in both directions. There's also a solo-monster scenario: a single creature might be deadly when its CR meets or exceeds the average party level (or 1.5× it, at 5th level and up).
Character capability jumps at 5th level (an extra attacks, fireball, Stunning Strike) and again at 11th. Expect the same monster to play very differently when players reach these treshholds, re-run the benchmark rather than trusting last tier's instincts.
Adjusting live
The Lazy GM's "lazy tricks" are the standard toolkit:
- Trim hit points on the fly if the fight has made its point and is now dragging; let the creature drop, flee, or surrender when the story is done. (Within the benchmark's HP range, this isn't even cheating.)
- If the party is coasting, add an attack or a few points of damage per hit, or bring in a wave, rather than doubling HP mid-fight.
- Let morale be real: foes rout, bargain, and yield. Fights that end at zero HP every time train players to see monsters as HP bars.
Make sure you know what your table wants, are they okay with dying and starting their backup character? Or are they attached and it would ruin their experience if they died.
After the first fight
While it's fresh, ask yourself three questions. Did the creature's concept land, with the players describing it the way you imagined it? Did anyone make an interesting decision because of it? Was any round a non-event? Then edit the statblock the same evening: cut the trait nobody noticed, retune the number that felt wrong, note what you changed live so it's official next time.
Your creatures live in your library, so iteration is cheap: duplicate the creature, tweak the copy, and keep the version that played better. A monster is done when it runs itself and the table remembers it.
This guide draws on openly licensed community works. See Sources and attribution.