diff --git a/app/models/project.rb b/app/models/project.rb
index 436834a07969bc39a0c58fe1a50e64b428ffa796..424c61c9cf685aff9813588fb48722f8cb7f88e7 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -3111,6 +3111,8 @@ def package_already_taken?(package_name, package_version, package_type:)
       ).exists?
   end
 
+  # TODO: Remove with the rollout of the FF npm_extract_npm_package_model
+  # https://gitlab.com/gitlab-org/gitlab/-/issues/501469
   def has_namespaced_npm_packages?
     packages.with_npm_scope(root_namespace.path)
             .not_pending_destruction
diff --git a/app/services/projects/transfer_service.rb b/app/services/projects/transfer_service.rb
index da655de35663eaa202840e67fa91276788258601..96fb527fb5245dae34823c3e23dc632b8674f84a 100644
--- a/app/services/projects/transfer_service.rb
+++ b/app/services/projects/transfer_service.rb
@@ -94,7 +94,7 @@ def transfer(project)
 
       verify_if_container_registry_tags_can_be_handled(project)
 
-      if !new_namespace_has_same_root?(project) && project.has_namespaced_npm_packages?
+      if !new_namespace_has_same_root?(project) && project_has_namespaced_npm_packages?
         raise TransferError, s_("TransferProject|Root namespace can't be updated if the project has NPM packages scoped to the current root level namespace.")
       end
 
@@ -331,6 +331,17 @@ def publish_event
 
       Gitlab::EventStore.publish(event)
     end
+
+    def project_has_namespaced_npm_packages?
+      if Feature.enabled?(:npm_extract_npm_package_model, Feature.current_request)
+        ::Packages::Npm::Package.for_projects(project)
+                                .with_npm_scope(project.root_namespace.path)
+                                .not_pending_destruction
+                                .exists?
+      else
+        project.has_namespaced_npm_packages?
+      end
+    end
   end
 end
 
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index 9dfb7a88115cace60d568915fbb25b036f7dbfc8..d04efb7de58d58299702bf2053e54d51dd9e5835 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -8222,6 +8222,8 @@ def has_external_wiki
     end
   end
 
+  # TODO: Remove with the rollout of the FF npm_extract_npm_package_model
+  # https://gitlab.com/gitlab-org/gitlab/-/issues/501469
   describe '#has_namespaced_npm_packages?' do
     let_it_be(:namespace) { create(:namespace, path: 'test') }
     let_it_be(:project) { create(:project, :public, namespace: namespace) }
diff --git a/spec/services/projects/transfer_service_spec.rb b/spec/services/projects/transfer_service_spec.rb
index a83b72c14aecd62cf918ab46787c90ee51e36a73..c0d348c88ba1db015e6f0abb0d7ff3731b13f700 100644
--- a/spec/services/projects/transfer_service_spec.rb
+++ b/spec/services/projects/transfer_service_spec.rb
@@ -26,21 +26,46 @@
 
     let!(:package) { create(:npm_package, project: project, name: "@testscope/test") }
 
-    context 'with a root namespace change' do
-      it 'allow the transfer' do
-        expect(transfer_service.execute(group)).to be true
+    shared_examples 'allow the transfer' do
+      it 'allows the transfer' do
+        expect(transfer_service.execute(namespace)).to be true
         expect(project.errors[:new_namespace]).to be_empty
       end
     end
 
+    context 'with a root namespace change' do
+      it_behaves_like 'allow the transfer' do
+        let(:namespace) { group }
+      end
+
+      context 'when npm_extract_npm_package_model is disabled' do
+        before do
+          stub_feature_flags(npm_extract_npm_package_model: false)
+        end
+
+        it_behaves_like 'allow the transfer' do
+          let(:namespace) { group }
+        end
+      end
+    end
+
     context 'with pending destruction package' do
       before do
         package.pending_destruction!
       end
 
-      it 'allow the transfer' do
-        expect(transfer_service.execute(group)).to be true
-        expect(project.errors[:new_namespace]).to be_empty
+      it_behaves_like 'allow the transfer' do
+        let(:namespace) { group }
+      end
+
+      context 'when npm_extract_npm_package_model is disabled' do
+        before do
+          stub_feature_flags(npm_extract_npm_package_model: false)
+        end
+
+        it_behaves_like 'allow the transfer' do
+          let(:namespace) { group }
+        end
       end
     end
 
@@ -51,6 +76,17 @@
         expect(transfer_service.execute(group)).to be false
         expect(project.errors[:new_namespace]).to include("Root namespace can't be updated if the project has NPM packages scoped to the current root level namespace.")
       end
+
+      context 'when npm_extract_npm_package_model is disabled' do
+        before do
+          stub_feature_flags(npm_extract_npm_package_model: false)
+        end
+
+        it 'does not allow the transfer' do
+          expect(transfer_service.execute(group)).to be false
+          expect(project.errors[:new_namespace]).to include("Root namespace can't be updated if the project has NPM packages scoped to the current root level namespace.")
+        end
+      end
     end
 
     context 'without a root namespace change' do
@@ -63,9 +99,18 @@
         other_group.add_owner(user)
       end
 
-      it 'allow the transfer' do
-        expect(transfer_service.execute(other_group)).to be true
-        expect(project.errors[:new_namespace]).to be_empty
+      it_behaves_like 'allow the transfer' do
+        let(:namespace) { other_group }
+      end
+
+      context 'when npm_extract_npm_package_model is disabled' do
+        before do
+          stub_feature_flags(npm_extract_npm_package_model: false)
+        end
+
+        it_behaves_like 'allow the transfer' do
+          let(:namespace) { other_group }
+        end
       end
     end
   end