diff --git a/app/models/cycle_analytics.rb b/app/models/cycle_analytics.rb
index 16072c35b64ec3d4b2c94eb96eb589c7199d1644..8ba275dd13a02c4374d75174bbe816019ba62ae9 100644
--- a/app/models/cycle_analytics.rb
+++ b/app/models/cycle_analytics.rb
@@ -15,18 +15,25 @@ class CycleAnalytics
   def code
     issues = Issue.all.to_a
     start_time_fn = -> (merge_request) { merge_request.created_at }
-    calculate_metric(issues.map { |issue| issue.closed_by_merge_requests(nil, check_if_open: false) }.flatten,
+    calculate_metric(Queries::merge_requests_closing_issues(issues),
                      start_time_fn,
                      Queries::mr_wip_flag_removed_or_assigned_to_user_other_than_author_time)
   end
 
   def review
     issues = Issue.all.to_a
-    calculate_metric(issues.map { |issue| issue.closed_by_merge_requests(nil, check_if_open: false) }.flatten,
+    calculate_metric(Queries::merge_requests_closing_issues(issues),
                      Queries::mr_wip_flag_removed_or_assigned_to_user_other_than_author_time,
                      Queries::mr_first_closed_or_merged_at)
   end
 
+  def staging
+    issues = Issue.all.to_a
+    calculate_metric(Queries::merge_requests_closing_issues(issues),
+                     Queries::mr_merged_at,
+                     Queries::mr_deployed_to_any_environment_at)
+  end
+
   private
 
   def calculate_metric(data, start_time_fn, end_time_fn)
diff --git a/app/models/cycle_analytics/queries.rb b/app/models/cycle_analytics/queries.rb
index 41081a4e08c77d3ab4f1b4462bb1ea5429a86d7f..9970941837d935ac9e34f1384509e63065780b20 100644
--- a/app/models/cycle_analytics/queries.rb
+++ b/app/models/cycle_analytics/queries.rb
@@ -1,6 +1,10 @@
 class CycleAnalytics
   module Queries
     class << self
+      def merge_requests_closing_issues(issues)
+        issues.map { |issue| issue.closed_by_merge_requests(nil, check_if_open: false) }.flatten
+      end
+
       def issue_first_associated_with_milestone_or_first_added_to_list_label_time
         lambda do |issue|
           if issue.metrics.present?
@@ -18,6 +22,24 @@ class CycleAnalytics
         end
       end
 
+      def mr_merged_at
+        lambda do |merge_request|
+          if merge_request.metrics.present?
+            merge_request.metrics.merged_at
+          end
+        end
+      end
+
+      def mr_deployed_to_any_environment_at
+        lambda do |merge_request|
+          if merge_request.metrics.present?
+            deployments = Deployment.where(ref: merge_request.target_branch).where("created_at > ?", merge_request.metrics.merged_at)
+            deployment = deployments.order(:created_at).first
+            deployment.created_at if deployment
+          end
+        end
+      end
+
       def issue_closing_merge_request_opened_time
         lambda do |issue|
           merge_requests = issue.closed_by_merge_requests(nil, check_if_open: false)
diff --git a/app/views/projects/cycle_analytics/show.html.haml b/app/views/projects/cycle_analytics/show.html.haml
index 271aae5d5fd50f6a47af52061b5ece845963e564..e1c13b3c7a5abd233f75bf50c21def5969cf48dd 100644
--- a/app/views/projects/cycle_analytics/show.html.haml
+++ b/app/views/projects/cycle_analytics/show.html.haml
@@ -26,3 +26,10 @@
       = distance_of_time_in_words review
     - else
       = "<Not enough data>"
+
+  %li.list-group-item
+    Staging:
+    - if staging = @cycle_analytics.staging.presence
+      = distance_of_time_in_words staging
+    - else
+      = "<Not enough data>"