diff --git a/app/events/pages/page_deployed_event.rb b/app/events/pages/page_deployed_event.rb
new file mode 100644
index 0000000000000000000000000000000000000000..52e53772a517c912aedd91829894671aa34e8ba4
--- /dev/null
+++ b/app/events/pages/page_deployed_event.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module Pages
+  class PageDeployedEvent < ::Gitlab::EventStore::Event
+    def schema
+      {
+        'type' => 'object',
+        'properties' => {
+          'project_id' => { 'type' => 'integer' },
+          'namespace_id' => { 'type' => 'integer' },
+          'root_namespace_id' => { 'type' => 'integer' }
+        },
+        'required' => %w[project_id namespace_id root_namespace_id]
+      }
+    end
+  end
+end
diff --git a/app/services/projects/update_pages_service.rb b/app/services/projects/update_pages_service.rb
index 8ded2516b97a1713a17809279acaff622dd2dd19..217c492bd72daeaed41451fc6a9d86b34bf7c220 100644
--- a/app/services/projects/update_pages_service.rb
+++ b/app/services/projects/update_pages_service.rb
@@ -53,6 +53,7 @@ def execute
     def success
       @commit_status.success
       @project.mark_pages_as_deployed
+      publish_deployed_event
       super
     end
 
@@ -203,6 +204,16 @@ def entries_count
     def pages_file_entries_limit
       project.actual_limits.pages_file_entries
     end
+
+    def publish_deployed_event
+      event = ::Pages::PageDeployedEvent.new(data: {
+        project_id: project.id,
+        namespace_id: project.namespace_id,
+        root_namespace_id: project.root_namespace.id
+      })
+
+      Gitlab::EventStore.publish(event)
+    end
   end
 end
 
diff --git a/spec/events/pages/page_deployed_event_spec.rb b/spec/events/pages/page_deployed_event_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..0c33a95b281a8e6d14344815e4fa557ea7411ddf
--- /dev/null
+++ b/spec/events/pages/page_deployed_event_spec.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Pages::PageDeployedEvent do
+  where(:data, :valid) do
+    [
+      [{ project_id: 1, namespace_id: 2, root_namespace_id: 3 }, true],
+      [{ project_id: 1 }, false],
+      [{ namespace_id: 1 }, false],
+      [{ project_id: 'foo', namespace_id: 2 }, false],
+      [{ project_id: 1, namespace_id: 'foo' }, false],
+      [{ project_id: [], namespace_id: 2 }, false],
+      [{ project_id: 1, namespace_id: [] }, false],
+      [{ project_id: {}, namespace_id: 2 }, false],
+      [{ project_id: 1, namespace_id: {} }, false],
+      ['foo', false],
+      [123, false],
+      [[], false]
+    ]
+  end
+
+  with_them do
+    it 'validates data' do
+      constructor = -> { described_class.new(data: data) }
+
+      if valid
+        expect { constructor.call }.not_to raise_error
+      else
+        expect { constructor.call }.to raise_error(Gitlab::EventStore::InvalidEvent)
+      end
+    end
+  end
+end
diff --git a/spec/services/projects/update_pages_service_spec.rb b/spec/services/projects/update_pages_service_spec.rb
index cbbed82aa0bf9878d1c855f8f600d2876e9af9ac..06e39ccc8c73d8e4274fdf02dd4e121f4e111ff6 100644
--- a/spec/services/projects/update_pages_service_spec.rb
+++ b/spec/services/projects/update_pages_service_spec.rb
@@ -43,6 +43,16 @@
         expect(project.pages_deployed?).to be_truthy
       end
 
+      it 'publishes a PageDeployedEvent event with project id and namespace id' do
+        expected_data = {
+          project_id: project.id,
+          namespace_id: project.namespace_id,
+          root_namespace_id: project.root_namespace.id
+        }
+
+        expect { subject.execute }.to publish_event(Pages::PageDeployedEvent).with(expected_data)
+      end
+
       it 'creates pages_deployment and saves it in the metadata' do
         expect do
           expect(execute).to eq(:success)