diff --git a/app/services/projects/after_rename_service.rb b/app/services/projects/after_rename_service.rb
index 2a35a07d55541175a02ea2d8d292fdf7622ace54..f9022b3afe3d3fca3423c70de5e960efb84f8d6a 100644
--- a/app/services/projects/after_rename_service.rb
+++ b/app/services/projects/after_rename_service.rb
@@ -96,9 +96,23 @@ module Projects
           .rename_project(path_before, project_path, namespace_full_path)
       end
 
-      Gitlab::PagesTransfer
-        .new
-        .rename_project(path_before, project_path, namespace_full_path)
+      if ::Feature.enabled?(:async_pages_move_project_rename, project)
+        # Block will be evaluated in the context of project so we need
+        # to bind to a local variable to capture it, as the instance
+        # variable and method aren't available on Project
+        path_before_local = @path_before
+
+        project.run_after_commit_or_now do
+          Gitlab::PagesTransfer
+            .new
+            .async
+            .rename_project(path_before_local, path, namespace.full_path)
+        end
+      else
+        Gitlab::PagesTransfer
+          .new
+          .rename_project(path_before, project_path, namespace_full_path)
+      end
     end
 
     def log_completion
diff --git a/config/feature_flags/development/async_pages_move_project_rename.yml b/config/feature_flags/development/async_pages_move_project_rename.yml
new file mode 100644
index 0000000000000000000000000000000000000000..6f5d30a6420ff7972768c6f2150e8ea7482218b8
--- /dev/null
+++ b/config/feature_flags/development/async_pages_move_project_rename.yml
@@ -0,0 +1,7 @@
+---
+name: async_pages_move_project_rename
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40087
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/235802
+group: team::Scalability
+type: development
+default_enabled: false
diff --git a/spec/services/projects/after_rename_service_spec.rb b/spec/services/projects/after_rename_service_spec.rb
index 52136b37c66df7ed065e37068b545f66bdfac6fc..11e3604c38ac2636c1f8c2f9faf8c60fb2535c26 100644
--- a/spec/services/projects/after_rename_service_spec.rb
+++ b/spec/services/projects/after_rename_service_spec.rb
@@ -62,11 +62,21 @@ RSpec.describe Projects::AfterRenameService do
 
       context 'gitlab pages' do
         before do
-          expect(project_storage).to receive(:rename_repo) { true }
+          allow(project_storage).to receive(:rename_repo) { true }
+        end
+
+        context 'when async_pages_move_project_rename is disabled' do
+          it 'moves pages folder to new location' do
+            stub_feature_flags(async_pages_move_project_rename: false)
+
+            expect_any_instance_of(Gitlab::PagesTransfer).to receive(:rename_project)
+
+            service_execute
+          end
         end
 
-        it 'moves pages folder to new location' do
-          expect_any_instance_of(Gitlab::PagesTransfer).to receive(:rename_project)
+        it 'schedules a move of the pages directory' do
+          expect(PagesTransferWorker).to receive(:perform_async).with('rename_project', anything)
 
           service_execute
         end
@@ -160,8 +170,18 @@ RSpec.describe Projects::AfterRenameService do
       end
 
       context 'gitlab pages' do
-        it 'moves pages folder to new location' do
-          expect_any_instance_of(Gitlab::PagesTransfer).to receive(:rename_project)
+        context 'when async_pages_move_project_rename is disabled' do
+          it 'moves pages folder to new location' do
+            stub_feature_flags(async_pages_move_project_rename: false)
+
+            expect_any_instance_of(Gitlab::PagesTransfer).to receive(:rename_project)
+
+            service_execute
+          end
+        end
+
+        it 'schedules a move of the pages directory' do
+          expect(PagesTransferWorker).to receive(:perform_async).with('rename_project', anything)
 
           service_execute
         end