diff --git a/ee/app/models/ee/epic.rb b/ee/app/models/ee/epic.rb
index 303205c41bb710eb1f686d0e7804a116ee70ddb4..95d0b0ca07f84d469793cec4ac957d6886f150ba 100644
--- a/ee/app/models/ee/epic.rb
+++ b/ee/app/models/ee/epic.rb
@@ -307,11 +307,26 @@ def parent_class
         ::Group
       end
 
+      # TODO: both nullification and cache count update can be removed when
+      # cross-group epic relationships are enabled: https://gitlab.com/gitlab-org/gitlab/-/issues/373977
       def nullify_lost_group_parents(groups, lost_groups)
         epics_to_update = in_selected_groups(groups).where(parent: in_selected_groups(lost_groups))
+        schedule_parent_cache_update(epics_to_update)
         epics_to_update.update_all(parent_id: nil)
       end
 
+      # rubocop:disable Scalability/BulkPerformWithContext
+      def schedule_parent_cache_update(epics)
+        return unless ::Feature.enabled?(:cache_issue_sums)
+
+        parent_ids = epics.distinct.pluck(:parent_id)
+        ::Epics::UpdateCachedMetadataWorker.bulk_perform_in(
+          1.minute,
+          parent_ids.each_slice(::Epics::UpdateCachedMetadataWorker::BATCH_SIZE).map { |ids| [ids] }
+        )
+      end
+      # rubocop:enable Scalability/BulkPerformWithContext
+
       # Return the deepest relation level for an epic.
       # Example 1:
       # epic1 - parent: nil
diff --git a/ee/spec/services/groups/transfer_service_spec.rb b/ee/spec/services/groups/transfer_service_spec.rb
index b00103aafd5faa9c54ac88bdaf582a1b0f70c201..5e8693551decba59b4210fc414aa6f50be1a9fe8 100644
--- a/ee/spec/services/groups/transfer_service_spec.rb
+++ b/ee/spec/services/groups/transfer_service_spec.rb
@@ -148,6 +148,31 @@
           expect(level_2_epic_2.reload.parent).to be_nil
         end
       end
+
+      describe 'update cached metadata' do
+        subject { described_class.new(subgroup_group_level_1, user).execute(new_group) }
+
+        it 'schedules update of issue counts for removed parent epic references' do
+          expect(::Epics::UpdateCachedMetadataWorker).to receive(:bulk_perform_in) do |delay, ids|
+            expect(delay).to eq(1.minute)
+            expect(ids.flatten).to match_array([level_1_epic_1.parent_id, level_2_epic_1.parent_id].uniq)
+          end.once
+
+          subject
+        end
+
+        context 'when cache_issue_sums flag is disabled' do
+          before do
+            stub_feature_flags(cache_issue_sums: false)
+          end
+
+          it 'does not schedule update of issue counts for removed parent epic references' do
+            expect(::Epics::UpdateCachedMetadataWorker).not_to receive(:bulk_perform_in)
+
+            subject
+          end
+        end
+      end
     end
   end