diff --git a/src/mpgame/Game_local.cpp b/src/mpgame/Game_local.cpp
--- a/src/mpgame/Game_local.cpp
+++ b/src/mpgame/Game_local.cpp
@@ -9068,6 +9068,44 @@ int idGameLocal::GetBotItemEntry( const char* name ) {
 
 /*
 ======================
+idGameLocal::GetSpawnedBotEntityCount
+======================
+*/
+int idGameLocal::GetSpawnedBotEntityCount( void ) const {
+	int count = 0;
+
+	for ( int clientNum = 0; clientNum < MAX_CLIENTS; ++clientNum ) {
+		if ( !networkSystem->ServerIsBotClient( clientNum ) ) {
+			continue;
+		}
+
+		idEntity* entity = entities[ clientNum ];
+		if ( entity == NULL || !entity->IsType( rvmBot::GetClassType() ) ) {
+			continue;
+		}
+
+		const rvmBot* bot = static_cast<const rvmBot*>( entity );
+		if ( !bot->HasSpawned() ) {
+			continue;
+		}
+
+		bool registered = false;
+		for ( int botIndex = 0; botIndex < registeredBots.Num(); ++botIndex ) {
+			if ( registeredBots[ botIndex ] == bot ) {
+				registered = true;
+				break;
+			}
+		}
+		if ( registered ) {
+			++count;
+		}
+	}
+
+	return count;
+}
+
+/*
+======================
 idGameLocal::AddBot
 ======================
 */
diff --git a/src/mpgame/Game_local.h b/src/mpgame/Game_local.h
--- a/src/mpgame/Game_local.h
+++ b/src/mpgame/Game_local.h
@@ -638,6 +638,7 @@ public:
 	void					UnRegisterBot( rvmBot* bot ) {
 		registeredBots.Remove( bot );
 	}
+	int					GetSpawnedBotEntityCount( void ) const;
 
 	float					SysScriptTime( void ) const {
 		return MS2SEC( realClientTime );
diff --git a/src/mpgame/bots/Bot.h b/src/mpgame/bots/Bot.h
--- a/src/mpgame/bots/Bot.h
+++ b/src/mpgame/bots/Bot.h
@@ -852,6 +852,7 @@ public:
 	virtual void	InflictedDamageEvent(idEntity* target) override;
 	virtual void	StateThreadChanged(void) override;
 	virtual bool	IsBot(void) override { return true; }
+	bool			HasSpawned(void) const { return hasSpawned; }
 
 	void			SetEnemy( idPlayer* player, idVec3 origin );
 
diff --git a/src/mpgame/gamesys/SysCmds.cpp b/src/mpgame/gamesys/SysCmds.cpp
--- a/src/mpgame/gamesys/SysCmds.cpp
+++ b/src/mpgame/gamesys/SysCmds.cpp
@@ -3355,6 +3355,15 @@ void Cmd_FillBots_f( const idCmdArgs& args ) {
 	common->Printf( "bot_minplayers set to %d bots\n", target );
 }
 
+void Cmd_BotStatus_f( const idCmdArgs& ) {
+	common->Printf(
+		"botStatus slots=%d entities=%d active=%d\n",
+		networkSystem->ServerGetNumBotClients(),
+		gameLocal.GetSpawnedBotEntityCount(),
+		networkSystem->ServerGetNumActiveClients()
+	);
+}
+
 /*
 =================
 idGameLocal::InitConsoleCommands
@@ -3366,6 +3375,7 @@ idGameLocal::InitConsoleCommands
 void idGameLocal::InitConsoleCommands( void ) {
 	cmdSystem->AddCommand( "addbot", Cmd_AddBot_f, CMD_FL_GAME, "adds a multiplayer bot" );
 	cmdSystem->AddCommand( "fillbots", Cmd_FillBots_f, CMD_FL_GAME, "maintains a minimum bot population", NULL );
+	cmdSystem->AddCommand( "botStatus", Cmd_BotStatus_f, CMD_FL_GAME, "reports bot slots, fully spawned bot entities, and active clients" );
 // RAVEN BEGIN
 // jscott: typeinfo gone - didn't work, it was unfinished
 //	cmdSystem->AddCommand( "listTypeInfo",			ListTypeInfo_f,				CMD_FL_GAME,				"list type info" );
