diff --git a/algo/test/_GTestTimeClusterTrigger.cxx b/algo/test/_GTestTimeClusterTrigger.cxx
index 7113b5f4c78042291be0e6226daf94804f89d8e8..35e8891a98217ed66c81f06fbbb0209557a1b00c 100644
--- a/algo/test/_GTestTimeClusterTrigger.cxx
+++ b/algo/test/_GTestTimeClusterTrigger.cxx
@@ -24,10 +24,16 @@ TEST(_GTestTimeClusterTrigger, CheckTriggerAlgorithmSimple)
     dataIn.push_back(i * inputSpacing);
   }
 
-  std::vector<double> dataOut = trigger(dataIn, windowSize, nMinNumber, deadTime);
+  cbm::algo::TimeClusterTrigger::resultType result  = trigger(dataIn, windowSize, nMinNumber, deadTime);
+  std::vector<double>& dataOut                      = result.first;
+  cbm::algo::TimeClusterTriggerMonitorData& monitor = result.second;
+
   EXPECT_EQ(dataOut.size(), 10);
 
   for (uint i = 0; i < dataOut.size(); i++) {
     EXPECT_EQ(dataOut[i], 495. + i * 1000.);
   }
+
+  EXPECT_EQ(dataIn.size(), monitor.fNum);
+  EXPECT_EQ(nMinNumber * dataOut.size(), monitor.fNumInTrigger);
 }
diff --git a/algo/trigger/TimeClusterTrigger.cxx b/algo/trigger/TimeClusterTrigger.cxx
index 85a35f8f99db0b6795f096c0b3a87f152f87a226..fe21815e2d1ac4ab0d7b5ee96d89ba5fb5ff12f3 100644
--- a/algo/trigger/TimeClusterTrigger.cxx
+++ b/algo/trigger/TimeClusterTrigger.cxx
@@ -14,13 +14,16 @@ using std::vector;
 namespace cbm::algo
 {
 
-  vector<double> TimeClusterTrigger::operator()(const vector<double>& dataVec, double winSize, int32_t minNumData,
-                                                double deadTime) const
+  TimeClusterTrigger::resultType TimeClusterTrigger::operator()(const vector<double>& dataVec, double winSize,
+                                                                int32_t minNumData, double deadTime) const
   {
-
     assert(std::is_sorted(dataVec.begin(), dataVec.end()));
 
-    vector<double> triggerVec;
+    // --- Output data
+    resultType result                      = {};
+    vector<double>& triggerVec             = result.first;
+    TimeClusterTriggerMonitorData& monitor = result.second;
+
     auto winStart = dataVec.begin();
     auto current  = dataVec.begin();
 
@@ -34,6 +37,9 @@ namespace cbm::algo
       if (std::distance(winStart, current) >= minNumData - 1) {
         triggerVec.push_back(0.5 * (*current + *winStart));
 
+        // Increment monitoring counter with number of digis used
+        monitor.fNumInTrigger += std::distance(winStart, current) + 1;
+
         // Start new window after dead time
         winStart = current + 1;
         while (winStart != dataVec.end() && *winStart - *current <= deadTime)
@@ -45,8 +51,10 @@ namespace cbm::algo
       else
         current++;
     }
+    // Store number of input data for monitoring
+    monitor.fNum += dataVec.size();
 
-    return triggerVec;
+    return result;
   }
 
 }  // namespace cbm::algo
diff --git a/algo/trigger/TimeClusterTrigger.h b/algo/trigger/TimeClusterTrigger.h
index e3794533e8a4af59bdbdfcdb6adb7ecafd5ed525..0ad85df3eee8efe449c101766cbaf6b41facce24 100644
--- a/algo/trigger/TimeClusterTrigger.h
+++ b/algo/trigger/TimeClusterTrigger.h
@@ -5,13 +5,23 @@
 #ifndef CBM_ALGO_TIMECLUSTERTRIGGER_H
 #define CBM_ALGO_TIMECLUSTERTRIGGER_H 1
 
-
+#include <cstddef>
 #include <cstdint>
 #include <vector>
 
 namespace cbm::algo
 {
 
+  /** @struct TimeClusterTriggerMonitorData
+   ** @author Dominik Smith <d.smith@gsi.de>
+   ** @since 23 Jun 2023
+   ** @brief Monitoring data for time cluster trigger algorithm
+   **/
+  struct TimeClusterTriggerMonitorData {
+    size_t fNumInTrigger = 0;  ///< Time stamps used for trigger building
+    size_t fNum          = 0;  ///< Total time stamps in input
+  };
+
   /** @class TimeClusterTrigger
    ** @author Volker Friese <v.friese@gsi.de>
    ** @author Dominik Smith <d.smith@gsi.de>
@@ -26,15 +36,17 @@ namespace cbm::algo
   class TimeClusterTrigger {
 
   public:
+    typedef std::pair<std::vector<double>, TimeClusterTriggerMonitorData> resultType;
+
     /** @brief Execution
      ** @param  dataVec     Source data vector
      ** @param  winSize     Size of trigger window
      ** @param  minNumData  Threshold on number of data within the trigger window
      ** @param  deadTime    Minimum time between two triggers
-     ** @return Vector of trigger times
+     ** @return Vector of trigger times and monitoring data
      **/
-    std::vector<double> operator()(const std::vector<double>& dataVec, double winSize, int32_t minNumData,
-                                   double deadTime) const;
+    resultType operator()(const std::vector<double>& dataVec, double winSize, int32_t minNumData,
+                          double deadTime) const;
   };
 
 
diff --git a/reco/mq/CbmDevTrigger.cxx b/reco/mq/CbmDevTrigger.cxx
index 29222c3475663cc279673f251d5fb1db7ac3f3e0..04acb3914eaceec8506aecc76a418c005100e169 100644
--- a/reco/mq/CbmDevTrigger.cxx
+++ b/reco/mq/CbmDevTrigger.cxx
@@ -148,7 +148,7 @@ std::vector<double> CbmDevTrigger::GetTriggerTimes(const CbmDigiTimeslice& ts)
     default: LOG(fatal) << "CbmDevTrigger::GetTriggerTimes(): Reading digis from unknown detector type!";
   }
   LOG(debug) << "CbmDevTrigger::GetTriggerTimes(): Building triggers from " << vDigiTimes.size() << " digis.";
-  return fTriggerAlgo(vDigiTimes, fTriggerWindow, fMinNumDigis, fDeadTime);
+  return fTriggerAlgo(vDigiTimes, fTriggerWindow, fMinNumDigis, fDeadTime).first;
 }
 
 bool CbmDevTrigger::SendTriggers(const std::vector<double>& vTriggers, FairMQParts& partsIn)
diff --git a/reco/tasks/CbmTaskTriggerDigi.cxx b/reco/tasks/CbmTaskTriggerDigi.cxx
index d1a1f6ba7eb9d567e69f3e6c3c73ffe66970962d..31eee2cbbab01c72b98105e5b5c66915842550bc 100644
--- a/reco/tasks/CbmTaskTriggerDigi.cxx
+++ b/reco/tasks/CbmTaskTriggerDigi.cxx
@@ -103,7 +103,7 @@ void CbmTaskTriggerDigi::Exec(Option_t*)
 
   // --- Call the trigger algorithm
   timerStep.Start();
-  *fTriggers = fAlgo(digiTimes, fTriggerWindow, fMinNumDigis, fDeadTime);
+  *fTriggers = fAlgo(digiTimes, fTriggerWindow, fMinNumDigis, fDeadTime).first;
   timerStep.Stop();
   fTimeFind += timerStep.RealTime();