Building a Custom D&D Encounter Manager in Notion

This work is reader-supported; if you buy through our links, we may earn an affiliate commission.

From what little DMing experience I've had so far I found that between notes and various stat blocks and initiative trackers in D&D Beyond elsewhere, I needed a lot of tabs open to run any given game. I set out to streamline this as much as possible. Ideally I wanted to manage as much as a game session as I could from one tab, or at least one tool. Enter Notion. I have a whole other post dedicated to how I use Notion for D&D note taking and worldbuilding and that goes into a little more detail on what Notion is if you're unfamiliar. I knew Notion had the capability to track all my notes and lore but could I use to fully manage all aspects of a combat encounter?

The Requirements

I wanted my encounter manager to be able to do the following:

  • Integrate with the rest of my game. I needed to be able to easily see all the encounter information without it being completely isolated from the rest of the session prep. My notes, quest hooks etc.
  • Show all encounter information in one window. My minimum requirement for this was to be able to see all stat block information and the initiative order in one window. No extra clicks, no additional tabs.
  • Act as a dynamic DM screen. I knew that with Notion formulas, I could create something that would remind me of the things I often forget as a DM. The rules for conditions, for the cleric to make concentration checks to keep bless up and to attack with advantage against my reckless barbarian. These reminders would display dynamically based on what conditions or effects the players had at that time
  • Reduce effort. Lastly and most importantly it needed to be low-effort to maintain. If I had to spend 30 minutes reformatting every stat block I pasted into Notion this was never going to work, and that's where my initial inspiration came from.

Integrate with the rest of my prep

I saw a YouTube short from Sly Flourish who copy pasted a stat block from a PDF. The pasted text was a complete mess as you might expect. He then used a simple prompt in Notion AI like 'reformat this like a D&D stat block' and the AI did a pretty good job of tidying that up and making it look exactly like a D&D stat block. Great, I knew I could get my stat blocks into Notion with pretty low effort but I wanted to take this prompt one step further. I created a database for all of my stat blocks and spent the time to build out one D&D stat block exactly how I wanted it to look. I then changed the AI prompt to reformat any pasted stat block as a D&D stat block using my example stat block as a reference. Identical stat blocks every time. I now had all the stat blocks I needed in the same place as the rest of my session notes.

A Note on Notion AI

Notion has a powerful free plan but its AI capabilities are an add-on subscription. This template heavily utilises Notion AI, it can of course still be used without AI but that is what I am using to solve my reduce effort requirement.

Consolidate in One Window

Next I added a second database called Encounters. I created a relation between my stat block database and the encounter database. I add the relevant stat blocks to each encounter. Now when I open each encounter I can see all the stat blocks needed for that encounter through a linked database.

So I've got my stat blocks into Notion pretty painlessly, and I can see all of those stat block pages in my encounter, but I still need to open the individual pages to see the stats. To resolve this, while keeping the process relatively low effort I took the AI prompting to the next level.

I added AI properties for each stat and created prompts to pull the numbers from the stat block on the page to the respective database property. This means I can view all of the stats at a database level. I can effectively manage the encounter from one tab. Here's an example of how I prompted the AI to pull the right information:

List the text beside Armor Class or Armour Class or AC on this page. If there is no such stat within the page leave this empty. Do not include the words Armor Class, Armour Class or AC. You can reference these example outputs for formatting. Example outputs: 17 13

I repeat for each stat as well as text properties for things like actions, reactions etc. I also always have the option to open a page in a side-peek view if I want to reference the more traditional stat block layout.

I explored this idea of building interrelated databases and viewing data contextually in more detail in my post here: My Notion Workspace methodology.

Tracking Turns and HP

AI properties were not the only ones added to this database. I used regular checkbox properties to track turns and reactions. I also built some automations that will automatically reset reactions at the start of a player's turn. There's also some automations to track how many rounds have passed in the encounter and how long each round has taken.

To track HP I added a number of properties:

  • Max HP. This is an AI property. It pulls the max hit points from the stat block.
  • Current HP. This is a number property.
  • Healing. This is a number property. The value of this field is added to Current HP.
  • Damage. This is a number property. The value of this field is deducted from Current HP.
  • Resisted Damage. This is a number property. The value of this field is halved and then deducted from Current HP.
  • Health Bar. Formula Property. Creates a visual health bar.
  • +/-. This is a button property. Clicking the button adds or subtracts the values in Healing, Damage or Resisted Damage from Current HP. If current HP is empty it subtracts from Max HP and then updates that value in Current HP.

For example, your raging Barbarian is at full health at the start of combat. Their Max HP is 100. Their Current HP is likely empty unless you have manually populated it. They take a hit that does 10 poison damage and 20 bludgeoning damage. You add 10 to the damage field and 20 to the Resisted damage field and hit +/-. Since they took 20 damage on that attack you'll see 80 in their current points. If they take the same damage on a second attack their Current HP would then reduce from 80 to 60.

I went into more detail on Notion's automation capabilities that make these kinds of workflows possible in my post here: Notion Automation Improvements: A quick look.

A tip for AI properties

Generally, I set my AI properties to automatically update. This means that during my session prep when I’m adding stat blocks etc. I don’t need to click on each of the properties to pull the data from the page. When AI properties are set to automatically update they can not be manually overwritten. If there are properties you would like to manually update when

Other Properties

I’ve added a couple of other properties that are useful but not something I need to see when running the actual encounter, like CR ratings and whether the creature is an ally or enemy. The Ally/Enemy property is a helpful one because I use it to trigger an automation. If an enemy falls to 0 HP, their initiative is cleared which removes them from the main database view.

Database Views

Since the stat blocks have a lot of properties, I added a couple of different database views within the encounter to better manage it. The idea here was to minimise the amount of properties I had on display when running the encounter so as to not get overwhelmed with all the information in front of me.

Initiative

The first one is a simple initiative tracker. It shows the stat block's Initiative modifier and then a number property for me to add their initiative score for the encounter. I use it at the start of the encounter to get the run order. I also don't need to go down in descending order to get everyone's roll. I just sort the combat view by initiative descending, so they'll always be in order. If you get 2 stat blocks with the same initiative for the encounter, after deciding which one goes first I'll add a .5 to their score, to keep the order correct. So if I have 2 13s, I'll make one a 13.5 and leave the other at 13.

Combat

This has everything I need to run the encounter. Skill modifiers/saves, health tracking and info on actions etc. That's it. I don't keep the initiative properties since we've already ordered the view by initiative and some of the extra properties like CR rating etc. are hidden from here too. I also hid max HP here as well since current HP is where the damage taken will be recorded.

All

Last is just an everything view. It has every property for each stat block related to the encounter. It's not one I need to reference very often but it can be handy to have those extra properties available to reference if needed.

A Dynamic DM screen.

Last but not least. I’ve checked off my other requirements but it hasn’t changed the fact that I’m a forgetful DM. I wanted to build something that acted as a DM partner to help remind me of the things I’m most likely to forget. The first addition was a reminder to call out initiative. Who’s up now and who’s up after them. A gentle reminder for the next player to have a think about what they want to do. I built a simple formula that checks which stat blocks have taken their turn (Turn checkbox checked) and it calls out the next 2 in the initiative order.

The next was a dynamic conditions reminder. I built another database to store condition information, like exhaustion, restrained etc. I related that database to the stat blocks database. So when a character becomes affected by a condition I add it to their stat block. The formula then updates to show me what character is affected by what condition and what that condition does. This way I only see the condition information that’s relevant. It will only appear when a character is affected by it. It’s been really helpful. I also added some items here that aren't strictly conditions like 'concentration', and 'reckless'. You can use them for any kind of reminder really. You can add your own conditions to the database as well, the formula will still be able to pull that information into your encounter for you.

Putting it into Practice

I've already used this tracker both as a player and DM and I'm super happy with how it's working so far. I likely won't continue to track everything as I go. As a DM I'm not so concerned about tracking my party's HP and as a player I might not always track how much damage is dealt to a monster but the option is there if I find it useful. Even if I strip it back to the bare bones to just track turns and reactions it's very helpful. I'm pretty happy with how it's turned out. It's likely one I'll iterate on over time as I use it more but if you want to try it out it's available for free here: D&D Encounter Manager. I also have a version that's fully integrated with my worldbuilding template available for purchase as well: Worldbuilding Kit 1.0.0

More from the Blog

Previous
Previous

Automating Blog Publishing Between Notion and Squarespace

Next
Next

How I Built a Worldbuilding System in Notion for D&D