diff --git a/app/serializers/post_serializer.rb b/app/serializers/post_serializer.rb
index 3f1b2a7254d..f12ad4fccac 100644
--- a/app/serializers/post_serializer.rb
+++ b/app/serializers/post_serializer.rb
@@ -82,7 +82,7 @@ class PostSerializer < BasicPostSerializer
   end
 
   def topic_slug
-    object.topic && object.topic.slug
+    topic&.slug
   end
 
   def include_topic_title?
@@ -98,15 +98,15 @@ class PostSerializer < BasicPostSerializer
   end
 
   def topic_title
-    object.topic.title
+    topic&.title
   end
 
   def topic_html_title
-    object.topic.fancy_title
+    topic&.fancy_title
   end
 
   def category_id
-    object.topic.category_id
+    topic&.category_id
   end
 
   def moderator?
@@ -376,6 +376,12 @@ class PostSerializer < BasicPostSerializer
 
   private
 
+    def topic
+      @topic = object.topic
+      @topic ||= Topic.with_deleted.find(object.topic_id) if scope.is_staff?
+      @topic
+    end
+
     def post_actions
       @post_actions ||= (@topic_view&.all_post_actions || {})[object.id]
     end
diff --git a/spec/serializers/web_hook_post_serializer_spec.rb b/spec/serializers/web_hook_post_serializer_spec.rb
index 6190f8e27ef..51cd4507461 100644
--- a/spec/serializers/web_hook_post_serializer_spec.rb
+++ b/spec/serializers/web_hook_post_serializer_spec.rb
@@ -3,10 +3,13 @@ require 'rails_helper'
 RSpec.describe WebHookPostSerializer do
   let(:admin) { Fabricate(:admin) }
   let(:post) { Fabricate(:post) }
-  let(:serializer) { WebHookPostSerializer.new(post, scope: Guardian.new(admin), root: false) }
+
+  def serialized_for_user(u)
+    WebHookPostSerializer.new(post, scope: Guardian.new(u), root: false).as_json
+  end
 
   it 'should only include the required keys' do
-    count = serializer.as_json.keys.count
+    count = serialized_for_user(admin).keys.count
     difference = count - 41
 
     expect(difference).to eq(0), lambda {
@@ -21,4 +24,18 @@ RSpec.describe WebHookPostSerializer do
       message << "\nPlease verify if those key(s) are required as part of the web hook's payload."
     }
   end
+
+  it 'should only include deleted topic title for staffs' do
+    topic = post.topic
+    PostDestroyer.new(Discourse.system_user, post).destroy
+    post.reload
+
+    [nil, post.user, Fabricate(:user)].each do |user|
+      expect(serialized_for_user(user)[:topic_title]).to eq(nil)
+    end
+
+    [Fabricate(:moderator), admin].each do |user|
+      expect(serialized_for_user(user)[:topic_title]).to eq(topic.title)
+    end
+  end
 end