diff --git a/app/assets/javascripts/discourse/app/models/topic-tracking-state.js b/app/assets/javascripts/discourse/app/models/topic-tracking-state.js
index aff8f8699f8..bd6d49ef8aa 100644
--- a/app/assets/javascripts/discourse/app/models/topic-tracking-state.js
+++ b/app/assets/javascripts/discourse/app/models/topic-tracking-state.js
@@ -582,6 +582,14 @@ const TopicTrackingState = EmberObject.extend({
         return false;
       }
 
+      if (
+        categoryId &&
+        topic.is_category_topic &&
+        categoryId !== topic.category_id
+      ) {
+        return false;
+      }
+
       if (tagId && !topic.tags?.includes(tagId)) {
         return false;
       }
diff --git a/app/models/topic_tracking_state.rb b/app/models/topic_tracking_state.rb
index 7c6f85c8933..82e6b0cd3e1 100644
--- a/app/models/topic_tracking_state.rb
+++ b/app/models/topic_tracking_state.rb
@@ -388,6 +388,13 @@ class TopicTrackingState
         new_filter_sql
       end
 
+    category_topic_id_column_select =
+      if SiteSetting.show_category_definitions_in_topic_lists
+        ""
+      else
+        "c.topic_id AS category_topic_id,"
+      end
+
     select_sql =
       select ||
         "
@@ -398,6 +405,7 @@ class TopicTrackingState
            #{highest_post_number_column_select(whisperer)},
            last_read_post_number,
            c.id as category_id,
+           #{category_topic_id_column_select}
            tu.notification_level,
            us.first_unread_at,
            GREATEST(
diff --git a/app/serializers/topic_tracking_state_item_serializer.rb b/app/serializers/topic_tracking_state_item_serializer.rb
index b84473b0cec..31df3ad67a3 100644
--- a/app/serializers/topic_tracking_state_item_serializer.rb
+++ b/app/serializers/topic_tracking_state_item_serializer.rb
@@ -6,6 +6,7 @@ class TopicTrackingStateItemSerializer < ApplicationSerializer
              :last_read_post_number,
              :created_at,
              :category_id,
+             :is_category_topic,
              :notification_level,
              :created_in_new_period,
              :treat_as_new_topic_start_date,
@@ -19,4 +20,12 @@ class TopicTrackingStateItemSerializer < ApplicationSerializer
   def include_tags?
     object.respond_to?(:tags)
   end
+
+  def is_category_topic
+    object.topic_id == object.category_topic_id
+  end
+
+  def include_is_category_topic?
+    object.respond_to?(:category_topic_id)
+  end
 end
diff --git a/config/site_settings.yml b/config/site_settings.yml
index 8a5082f32fc..1e5f21c43ca 100644
--- a/config/site_settings.yml
+++ b/config/site_settings.yml
@@ -2564,6 +2564,7 @@ uncategorized:
   show_category_definitions_in_topic_lists:
     default: false
     hidden: true
+    client: true
 
   create_revision_on_bulk_topic_moves:
     default: true
diff --git a/spec/system/page_objects/components/topic_list.rb b/spec/system/page_objects/components/topic_list.rb
index 1c1b86c74ff..844f9a52ea5 100644
--- a/spec/system/page_objects/components/topic_list.rb
+++ b/spec/system/page_objects/components/topic_list.rb
@@ -3,10 +3,15 @@
 module PageObjects
   module Components
     class TopicList < PageObjects::Components::Base
-      TOPIC_LIST_BODY_CLASS = ".topic-list-body"
+      TOPIC_LIST_BODY_SELECTOR = ".topic-list-body"
+      TOPIC_LIST_ITEM_SELECTOR = "#{TOPIC_LIST_BODY_SELECTOR} .topic-list-item"
 
       def topic_list
-        TOPIC_LIST_BODY_CLASS
+        TOPIC_LIST_BODY_SELECTOR
+      end
+
+      def has_topics?(count:)
+        page.has_css?(TOPIC_LIST_ITEM_SELECTOR, count: count)
       end
 
       def has_topic?(topic)
@@ -18,13 +23,13 @@ module PageObjects
       end
 
       def visit_topic_with_title(title)
-        find(".topic-list-body a", text: title).click
+        find("#{TOPIC_LIST_BODY_SELECTOR} a", text: title).click
       end
 
       private
 
       def topic_list_item_class(topic)
-        "#{TOPIC_LIST_BODY_CLASS} .topic-list-item[data-topic-id='#{topic.id}']"
+        "#{TOPIC_LIST_ITEM_SELECTOR}[data-topic-id='#{topic.id}']"
       end
     end
   end
diff --git a/spec/system/page_objects/pages/category.rb b/spec/system/page_objects/pages/category.rb
index 2fa00475847..547d9f865cf 100644
--- a/spec/system/page_objects/pages/category.rb
+++ b/spec/system/page_objects/pages/category.rb
@@ -58,6 +58,20 @@ module PageObjects
         find(".select-kit-collection .select-kit-row", text: template_name).click
         find(".select-category-template").click
       end
+
+      CATEGORY_NAVIGATION_NEW_NAV_ITEM_SELECTOR = ".category-navigation .nav-item_new"
+
+      def has_no_new_topics?
+        page.has_no_css?(CATEGORY_NAVIGATION_NEW_NAV_ITEM_SELECTOR)
+      end
+
+      def has_new_topics?
+        page.has_css?(CATEGORY_NAVIGATION_NEW_NAV_ITEM_SELECTOR)
+      end
+
+      def click_new
+        page.find(CATEGORY_NAVIGATION_NEW_NAV_ITEM_SELECTOR).click
+      end
     end
   end
 end
diff --git a/spec/system/viewing_category_spec.rb b/spec/system/viewing_category_spec.rb
new file mode 100644
index 00000000000..a1a7628bf69
--- /dev/null
+++ b/spec/system/viewing_category_spec.rb
@@ -0,0 +1,55 @@
+# frozen_string_literal: true
+
+RSpec.describe "Viewing a category", type: :system, js: true do
+  fab!(:category) { Fabricate(:category) }
+  fab!(:user) { Fabricate(:user) }
+  let(:category_page) { PageObjects::Pages::Category.new }
+  let(:topic_list) { PageObjects::Components::TopicList.new }
+
+  describe "when a new child category is created with a new category topic" do
+    fab!(:child_category) { Fabricate(:category, parent_category: category) }
+
+    fab!(:child_category_topic) do
+      Fabricate(:topic, category: child_category).tap do |topic|
+        child_category.update!(topic: topic)
+      end
+    end
+
+    it "should show a new count on the parent and child category when 'show_category_definitions_in_topic_lists' is true" do
+      SiteSetting.show_category_definitions_in_topic_lists = true
+
+      sign_in(user)
+
+      category_page.visit(category)
+      category_page.click_new
+
+      expect(topic_list).to have_topics(count: 1)
+      expect(topic_list).to have_topic(child_category_topic)
+
+      category_page.visit(child_category)
+      category_page.click_new
+
+      expect(topic_list).to have_topics(count: 1)
+      expect(topic_list).to have_topic(child_category_topic)
+    end
+
+    it "should only show a new count on the child category when 'show_category_definitions_in_topic_lists' site setting is false" do
+      SiteSetting.show_category_definitions_in_topic_lists = false
+
+      sign_in(user)
+
+      category_page.visit(category)
+
+      expect(category_page).to have_no_new_topics
+
+      category_page.visit(child_category)
+
+      expect(category_page).to have_new_topics
+
+      category_page.click_new
+
+      expect(topic_list).to have_topics(count: 1)
+      expect(topic_list).to have_topic(child_category_topic)
+    end
+  end
+end