diff --git a/app/controllers/projects/cycle_analytics_controller.rb b/app/controllers/projects/cycle_analytics_controller.rb
index f3dea88862f219ed2a6b256b4e82121a7a29052d..da0bda19602cc2f7f56044f8a5af2b8505b9dc44 100644
--- a/app/controllers/projects/cycle_analytics_controller.rb
+++ b/app/controllers/projects/cycle_analytics_controller.rb
@@ -6,10 +6,10 @@ class Projects::CycleAnalyticsController < Projects::ApplicationController
   include CycleAnalyticsParams
   include GracefulTimeoutHandling
   include ProductAnalyticsTracking
+  include Gitlab::Utils::StrongMemoize
   extend ::Gitlab::Utils::Override
 
   before_action :authorize_read_cycle_analytics!
-  before_action :load_value_stream, only: :show
 
   track_event :show,
     name: 'p_analytics_valuestream',
@@ -51,12 +51,13 @@ def show
 
   override :all_cycle_analytics_params
   def all_cycle_analytics_params
-    super.merge({ namespace: @project.project_namespace, value_stream: @value_stream })
+    super.merge({ namespace: @project.project_namespace, value_stream: value_stream })
   end
 
-  def load_value_stream
-    @value_stream = Analytics::CycleAnalytics::ValueStream.build_default_value_stream(@project.project_namespace)
+  def value_stream
+    Analytics::CycleAnalytics::ValueStream.build_default_value_stream(@project.project_namespace)
   end
+  strong_memoize_attr :value_stream
 
   def cycle_analytics_json
     {
@@ -74,3 +75,5 @@ def tracking_project_source
     project
   end
 end
+
+Projects::CycleAnalyticsController.prepend_mod
diff --git a/ee/app/controllers/ee/projects/cycle_analytics_controller.rb b/ee/app/controllers/ee/projects/cycle_analytics_controller.rb
new file mode 100644
index 0000000000000000000000000000000000000000..7854fc234b1c513024f5710094bd1eefad056093
--- /dev/null
+++ b/ee/app/controllers/ee/projects/cycle_analytics_controller.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+module EE
+  module Projects
+    module CycleAnalyticsController
+      include ::Gitlab::Utils::StrongMemoize
+      extend ::Gitlab::Utils::Override
+
+      override :value_stream
+      def value_stream
+        return super unless params[:value_stream_id]
+
+        project.project_namespace.value_streams.find_by_id(params[:value_stream_id])
+      end
+      strong_memoize_attr :value_stream
+    end
+  end
+end
diff --git a/ee/spec/requests/ee/projects/cycle_analytics_controller_spec.rb b/ee/spec/requests/ee/projects/cycle_analytics_controller_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..83eca1b0f512b200c71b3e08aff31fc5dcf6f883
--- /dev/null
+++ b/ee/spec/requests/ee/projects/cycle_analytics_controller_spec.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::CycleAnalyticsController, feature_category: :product_analytics do
+  let_it_be(:project) { create(:project) }
+  let_it_be(:user) { create(:user) }
+
+  before do
+    sign_in(user)
+    project.add_maintainer(user)
+  end
+
+  context 'with project and value stream id params' do
+    let(:value_stream) { create(:cycle_analytics_value_stream, namespace: project.project_namespace) }
+
+    it 'builds request params with project and value stream' do
+      expect_next_instance_of(Gitlab::Analytics::CycleAnalytics::RequestParams) do |instance|
+        expect(instance).to have_attributes(namespace: project.project_namespace, value_stream: value_stream)
+      end
+
+      get project_cycle_analytics_path(project, value_stream_id: value_stream)
+    end
+  end
+end