Add duoUsedCount metric to duo usage table

Background

Following on from this discussion

We should add the duoUsedCount metric to the Duo usage metrics table on the GitLab Duo and SDLC trends dashboard.

Screenshot_2025-09-29_at_17.30.17

TODO

  • Add the duoUsedCount metric to the duo usage table
  • Update relevant tests
  • Update related docs

Possible solution

diff --git a/app/assets/javascripts/analytics/shared/constants.js b/app/assets/javascripts/analytics/shared/constants.js
index 36bc1edfdaab..e10e38fda2c9 100644
--- a/app/assets/javascripts/analytics/shared/constants.js
+++ b/app/assets/javascripts/analytics/shared/constants.js
@@ -198,6 +198,7 @@ export const AI_METRICS = {
   DUO_CHAT_USAGE_RATE: 'duo_chat_usage_rate',
   DUO_USAGE_RATE: 'duo_usage_rate',
   DUO_RCA_USAGE_RATE: 'duo_rca_usage_rate',
+  DUO_USED_COUNT: 'duo_used_count',
 };
 
 export const VALUE_STREAM_METRIC_DISPLAY_UNITS = {
@@ -409,6 +410,16 @@ export const VALUE_STREAM_METRIC_METADATA = {
       anchor: 'root-cause-analysis-use-cases',
     }),
   },
+  [AI_METRICS.DUO_USED_COUNT]: {
+    description: s__(
+      'AiImpactAnalytics|Monthly user engagement with Duo Root Cause Analysis. Percentage ratio calculated as total monthly unique Duo Root Cause Analysis users / monthly unique Duo Chat users.',
+    ),
+    groupLink: '',
+    projectLink: '',
+    docsLink: helpPagePath('user/gitlab_duo/use_cases', {
+      anchor: 'root-cause-analysis-use-cases',
+    }),
+  },
   ...PIPELINE_ANALYTICS_METRIC_METADATA,
 };
 
diff --git a/ee/app/assets/javascripts/analytics/dashboards/ai_impact/api.js b/ee/app/assets/javascripts/analytics/dashboards/ai_impact/api.js
index 1ee2270da851..a9d43317359e 100644
--- a/ee/app/assets/javascripts/analytics/dashboards/ai_impact/api.js
+++ b/ee/app/assets/javascripts/analytics/dashboards/ai_impact/api.js
@@ -37,6 +37,7 @@ export const extractGraphqlAiData = ({
   duoChatContributorsCount = null,
   rootCauseAnalysisUsersCount = null,
   duoAssignedUsersCount = null,
+  duoUsedCount = null,
 } = {}) => {
   const codeSuggestionsUsageRate = calculateRate({
     numerator: codeSuggestionsContributorsCount,
@@ -91,5 +92,9 @@ export const extractGraphqlAiData = ({
         denominator: duoAssignedUsersCount,
       }),
     },
+    [AI_METRICS.DUO_USED_COUNT]: {
+      identifier: AI_METRICS.DUO_USED_COUNT,
+      value: duoUsedCount ?? '-',
+    },
   };
 };
diff --git a/ee/app/assets/javascripts/analytics/dashboards/ai_impact/constants.js b/ee/app/assets/javascripts/analytics/dashboards/ai_impact/constants.js
index e20215b13522..f018d84f953f 100644
--- a/ee/app/assets/javascripts/analytics/dashboards/ai_impact/constants.js
+++ b/ee/app/assets/javascripts/analytics/dashboards/ai_impact/constants.js
@@ -10,12 +10,14 @@ export const SUPPORTED_AI_METRICS = [
   AI_METRICS.CODE_SUGGESTIONS_ACCEPTANCE_RATE,
   AI_METRICS.DUO_CHAT_USAGE_RATE,
   AI_METRICS.DUO_RCA_USAGE_RATE,
+  AI_METRICS.DUO_USED_COUNT,
 ];
 export const HIDE_METRIC_DRILL_DOWN = [
   AI_METRICS.CODE_SUGGESTIONS_USAGE_RATE,
   AI_METRICS.CODE_SUGGESTIONS_ACCEPTANCE_RATE,
   AI_METRICS.DUO_CHAT_USAGE_RATE,
   AI_METRICS.DUO_RCA_USAGE_RATE,
+  AI_METRICS.DUO_USED_COUNT,
 ];
 
 // The AI impact metrics supported for over time tiles
@@ -44,6 +46,10 @@ export const AI_IMPACT_USAGE_METRICS = {
     label: s__('AiImpactAnalytics|Duo RCA: Usage'),
     units: UNITS.PERCENT,
   },
+  [AI_METRICS.DUO_USED_COUNT]: {
+    label: s__('AiImpactAnalytics|Duo used count'),
+    units: UNITS.COUNT,
+  },
 };
 
 export const AI_IMPACT_TABLE_METRICS = {
diff --git a/ee/lib/gitlab/analytics/ai_impact_dashboard/visualizations/ai_impact_lifecycle_metrics_table.yaml b/ee/lib/gitlab/analytics/ai_impact_dashboard/visualizations/ai_impact_lifecycle_metrics_table.yaml
index 75c7857ddcae..d9d992d071d7 100644
--- a/ee/lib/gitlab/analytics/ai_impact_dashboard/visualizations/ai_impact_lifecycle_metrics_table.yaml
+++ b/ee/lib/gitlab/analytics/ai_impact_dashboard/visualizations/ai_impact_lifecycle_metrics_table.yaml
@@ -19,6 +19,7 @@ data:
         - code_suggestions_acceptance_rate
         - duo_chat_usage_rate
         - duo_rca_usage_rate
+        - duo_used_count
         - pipeline_count
         - pipeline_success_rate
         - pipeline_failed_rate
diff --git a/ee/lib/gitlab/analytics/ai_impact_dashboard/visualizations/pipeline_metrics_table.yaml b/ee/lib/gitlab/analytics/ai_impact_dashboard/visualizations/pipeline_metrics_table.yaml
index 7ff258162387..c5fa84f2bded 100644
--- a/ee/lib/gitlab/analytics/ai_impact_dashboard/visualizations/pipeline_metrics_table.yaml
+++ b/ee/lib/gitlab/analytics/ai_impact_dashboard/visualizations/pipeline_metrics_table.yaml
@@ -24,4 +24,5 @@ data:
         - code_suggestions_acceptance_rate
         - duo_chat_usage_rate
         - duo_rca_usage_rate
+        - duo_used_count
 options: {}
Edited by Ezekiel Kigbo