diff --git a/ee/spec/features/analytics/cycle_analytics/cycle_analytics_spec.rb b/ee/spec/features/analytics/cycle_analytics/cycle_analytics_spec.rb
index 4c1d155f7973e07a917361158013a7cabb3596f8..cbc345da2b477c5393b5e684c73d5536919e00b5 100644
--- a/ee/spec/features/analytics/cycle_analytics/cycle_analytics_spec.rb
+++ b/ee/spec/features/analytics/cycle_analytics/cycle_analytics_spec.rb
@@ -385,51 +385,6 @@ def create_merge_request(id, extra_params = {})
     end
   end
 
-  describe 'Tasks by type chart', :js do
-    context 'enabled' do
-      before do
-        sign_in(user)
-      end
-
-      context 'with data available' do
-        before do
-          3.times do |i|
-            create(:labeled_issue, created_at: i.days.ago, project: create(:project, group: group), labels: [group_label1])
-            create(:labeled_issue, created_at: i.days.ago, project: create(:project, group: group), labels: [group_label2])
-          end
-
-          select_group
-        end
-
-        it 'displays the chart' do
-          expect(page).to have_text(s_('CycleAnalytics|Type of work'))
-
-          expect(page).to have_text(s_('CycleAnalytics|Tasks by type'))
-        end
-
-        it 'has 2 labels selected' do
-          expect(page).to have_text('Showing Issues and 2 labels')
-        end
-
-        it 'has chart filters' do
-          expect(page).to have_css('.js-tasks-by-type-chart-filters')
-        end
-      end
-
-      context 'no data available' do
-        before do
-          select_group
-        end
-
-        it 'shows the no data available message' do
-          expect(page).to have_text(s_('CycleAnalytics|Type of work'))
-
-          expect(page).to have_text(_('There is no data available. Please change your selection.'))
-        end
-      end
-    end
-  end
-
   describe 'Customizable cycle analytics', :js do
     custom_stage_name = 'Cool beans'
     custom_stage_with_labels_name = 'Cool beans - now with labels'
@@ -920,52 +875,6 @@ def active_stages
           end
         end
       end
-
-      context 'Duration chart' do
-        let(:duration_chart_dropdown) { page.find(duration_stage_selector) }
-
-        let_it_be(:translated_default_stage_names) do
-          Gitlab::Analytics::CycleAnalytics::DefaultStages.names.map do |name|
-            stage = Analytics::CycleAnalytics::GroupStage.new(name: name)
-            Analytics::CycleAnalytics::StagePresenter.new(stage).title
-          end.freeze
-        end
-
-        def duration_chart_stages
-          duration_chart_dropdown.all('.dropdown-item').collect(&:text)
-        end
-
-        def toggle_duration_chart_dropdown
-          duration_chart_dropdown.click
-        end
-
-        before do
-          select_group
-        end
-
-        it 'has all the default stages' do
-          toggle_duration_chart_dropdown
-
-          expect(duration_chart_stages).to eq(translated_default_stage_names)
-        end
-
-        context 'hidden stage' do
-          before do
-            toggle_more_options(first_default_stage)
-
-            click_button(_('Hide stage'))
-
-            # wait for the stage list to laod
-            expect(nav).to have_content(s_('CycleAnalyticsStage|Plan'))
-          end
-
-          it 'will not appear in the duration chart dropdown' do
-            toggle_duration_chart_dropdown
-
-            expect(duration_chart_stages).not_to include(s_('CycleAnalyticsStage|Issue'))
-          end
-        end
-      end
     end
   end
 
diff --git a/ee/spec/features/groups/analytics/cycle_analytics/charts_spec.rb b/ee/spec/features/groups/analytics/cycle_analytics/charts_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..38ef63eb201bfcccd44a2a4eeea1217058aacd3b
--- /dev/null
+++ b/ee/spec/features/groups/analytics/cycle_analytics/charts_spec.rb
@@ -0,0 +1,141 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+RSpec.describe 'Value stream analytics charts', :js do
+  let_it_be(:user) { create(:user) }
+  let_it_be(:group) { create(:group, name: 'CA-test-group') }
+  let_it_be(:group2) { create(:group, name: 'CA-bad-test-group') }
+  let_it_be(:project) { create(:project, :repository, namespace: group, group: group, name: 'Cool fun project') }
+  let_it_be(:group_label1) { create(:group_label, group: group) }
+  let_it_be(:group_label2) { create(:group_label, group: group) }
+  let_it_be(:label) { create(:group_label, group: group2) }
+
+  3.times do |i|
+    let_it_be("issue_#{i}".to_sym) { create(:issue, title: "New Issue #{i}", project: project, created_at: 2.days.ago) }
+  end
+
+  def wait_for_stages_to_load
+    expect(page).to have_selector '.js-stage-table'
+  end
+
+  def select_group(target_group = group)
+    visit group_analytics_cycle_analytics_path(target_group)
+
+    wait_for_stages_to_load
+  end
+
+  def toggle_more_options(stage)
+    stage.hover
+
+    stage.find('.more-actions-toggle').click
+  end
+
+  before do
+    stub_licensed_features(cycle_analytics_for_groups: true)
+
+    group.add_owner(user)
+
+    sign_in(user)
+  end
+
+  context 'Duration chart' do
+    duration_stage_selector = '.js-dropdown-stages'
+    stage_nav_selector = '.stage-nav'
+
+    let(:duration_chart_dropdown) { page.find(duration_stage_selector) }
+    let(:first_default_stage) { page.find('.stage-nav-item-cell', text: 'Issue').ancestor('.stage-nav-item') }
+    let(:nav) { page.find(stage_nav_selector) }
+
+    let_it_be(:translated_default_stage_names) do
+      Gitlab::Analytics::CycleAnalytics::DefaultStages.names.map do |name|
+        stage = Analytics::CycleAnalytics::GroupStage.new(name: name)
+        Analytics::CycleAnalytics::StagePresenter.new(stage).title
+      end.freeze
+    end
+
+    def duration_chart_stages
+      duration_chart_dropdown.all('.dropdown-item').collect(&:text)
+    end
+
+    def toggle_duration_chart_dropdown
+      duration_chart_dropdown.click
+    end
+
+    before do
+      select_group
+    end
+
+    it 'has all the default stages' do
+      toggle_duration_chart_dropdown
+
+      expect(duration_chart_stages).to eq(translated_default_stage_names)
+    end
+
+    context 'hidden stage' do
+      before do
+        toggle_more_options(first_default_stage)
+
+        click_button(_('Hide stage'))
+
+        # wait for the stage list to laod
+        expect(nav).to have_content(s_('CycleAnalyticsStage|Plan'))
+      end
+
+      it 'will not appear in the duration chart dropdown' do
+        toggle_duration_chart_dropdown
+
+        expect(duration_chart_stages).not_to include(s_('CycleAnalyticsStage|Issue'))
+      end
+    end
+  end
+
+  describe 'Tasks by type chart', :js do
+    before do
+      stub_licensed_features(cycle_analytics_for_groups: true, type_of_work_analytics: true)
+
+      group.add_owner(user)
+      project.add_maintainer(user)
+
+      sign_in(user)
+    end
+
+    context 'enabled' do
+      context 'with data available' do
+        before do
+          3.times do |i|
+            create(:labeled_issue, created_at: i.days.ago, project: create(:project, group: group), labels: [group_label1])
+            create(:labeled_issue, created_at: i.days.ago, project: create(:project, group: group), labels: [group_label2])
+          end
+
+          select_group
+        end
+
+        it 'displays the chart' do
+          expect(page).to have_text(s_('CycleAnalytics|Type of work'))
+
+          expect(page).to have_text(s_('CycleAnalytics|Tasks by type'))
+        end
+
+        it 'has 2 labels selected' do
+          expect(page).to have_text('Showing Issues and 2 labels')
+        end
+
+        it 'has chart filters' do
+          expect(page).to have_css('.js-tasks-by-type-chart-filters')
+        end
+      end
+
+      context 'no data available' do
+        before do
+          select_group
+        end
+
+        it 'shows the no data available message' do
+          expect(page).to have_text(s_('CycleAnalytics|Type of work'))
+
+          expect(page).to have_text(_('There is no data available. Please change your selection.'))
+        end
+      end
+    end
+  end
+end