diff --git a/algo/global/Reco.cxx b/algo/global/Reco.cxx
index a15bc7fd268c2e0fc7ba40fbf2c0ce7c33237efe..8fb3e2d622ac1f5c0142624fdc1bcfa99435a5b7 100644
--- a/algo/global/Reco.cxx
+++ b/algo/global/Reco.cxx
@@ -97,7 +97,9 @@ RecoResults Reco::Run(const fles::Timeslice& ts)
   L_(info) << ">>> Processing TS " << ts.index();
   xpu::set<cbm::algo::Params>(Params());
 
-  CbmDigiTimeslice digiTs;
+  std::vector<CbmStsDigi> digis;
+  UnpackMonitorData unpackMonitor;
+
   if (Opts().HasStep(Step::Unpack)) {
     switch (Params().sts.unpackMode) {
       case RecoParams::UnpackMode::XPU:
@@ -105,7 +107,11 @@ RecoResults Reco::Run(const fles::Timeslice& ts)
         throw std::runtime_error("XPU unpacker currently not implemented");
         break;
       default:
-      case RecoParams::UnpackMode::CPU: digiTs = fUnpack.Run(ts).first; break;
+      case RecoParams::UnpackMode::CPU:
+        auto result   = fUnpack.Run(ts);
+        digis         = result.first.fData.fSts.fDigis;
+        unpackMonitor = result.second;
+        break;
     }
   }
 
@@ -119,10 +125,7 @@ RecoResults Reco::Run(const fles::Timeslice& ts)
 
   xpu::timings ts_times = xpu::pop_timer();
 
-  if (HasMonitor())
-    GetMonitor().QueueMetric("cbm_reco", {{"hostname", fles::system::current_hostname()}},
-                             {{"tsProcessed", 1}, {"bytesProcessed", ts_utils::SizeBytes(ts)}});
-
+  QueueUnpackerMetrics(ts, unpackMonitor);
 
   PrintTimings(ts_times);
 
@@ -158,3 +161,11 @@ void Reco::PrintTimings(xpu::timings& timings)
     L_(info) << "TS Processing time (Wall): " << timings.wall() << " ms";
   }
 }
+
+void Reco::QueueUnpackerMetrics(const fles::Timeslice& ts, const UnpackMonitorData& monitor)
+{
+  if (!HasMonitor()) return;
+
+  GetMonitor().QueueMetric("cbmreco", {{"hostname", fles::system::current_hostname()}},
+                           {{"bytesInSts", monitor.fNumBytesInSts}, {"bytesInTof", monitor.fNumBytesInTof}});
+}
diff --git a/algo/global/Reco.h b/algo/global/Reco.h
index 2eef46610da84fcfca7c410dc62897925d114a9f..ed30d43d1c7a8e527d2ee9fecc1b98afa411f3a6 100644
--- a/algo/global/Reco.h
+++ b/algo/global/Reco.h
@@ -48,6 +48,8 @@ namespace cbm::algo
     EventbuildChain fEventBuild;
 
     void Validate(const Options& opts);
+
+    void QueueUnpackerMetrics(const fles::Timeslice&, const UnpackMonitorData&);
   };
 }  // namespace cbm::algo
 
diff --git a/algo/unpack/Unpack.cxx b/algo/unpack/Unpack.cxx
index f9cf7e11a8f2431178678f9d7f999ea66c425327..f8fbe902a5ad521369494326da4b7a99572eadae 100644
--- a/algo/unpack/Unpack.cxx
+++ b/algo/unpack/Unpack.cxx
@@ -28,11 +28,13 @@ namespace cbm::algo
     UnpackMonitorData& monitor = result.second;
 
     if (DetectorEnabled(Subsystem::STS)) {
-      ParallelMsLoop(Subsystem::STS, monitor, digiTs.fData.fSts.fDigis, monitor.fSts, *timeslice, fAlgoSts, 0x20);
+      monitor.fNumBytesInSts +=
+        ParallelMsLoop(Subsystem::STS, monitor, digiTs.fData.fSts.fDigis, monitor.fSts, *timeslice, fAlgoSts, 0x20);
     }
 
     if (DetectorEnabled(Subsystem::TOF)) {
-      ParallelMsLoop(Subsystem::TOF, monitor, digiTs.fData.fTof.fDigis, monitor.fTof, *timeslice, fAlgoTof, 0x00);
+      monitor.fNumBytesInTof +=
+        ParallelMsLoop(Subsystem::TOF, monitor, digiTs.fData.fTof.fDigis, monitor.fTof, *timeslice, fAlgoTof, 0x00);
     }
 
     if (DetectorEnabled(Subsystem::BMON)) {
@@ -147,9 +149,9 @@ namespace cbm::algo
 
   // ----------------------------------------------------------------------------
   template<class Digi, class UnpackAlgo, class Monitor>
-  void Unpack::ParallelMsLoop(const Subsystem subsystem, UnpackMonitorData& genericMonitor, std::vector<Digi>& digisOut,
-                              std::vector<Monitor>& monitorOut, const fles::Timeslice& ts,
-                              const std::map<u16, UnpackAlgo>& algos, u8 sys_ver)
+  size_t Unpack::ParallelMsLoop(const Subsystem subsystem, UnpackMonitorData& genericMonitor,
+                                std::vector<Digi>& digisOut, std::vector<Monitor>& monitorOut,
+                                const fles::Timeslice& ts, const std::map<u16, UnpackAlgo>& algos, u8 sys_ver)
   {
     xpu::scoped_timer t_(fles::to_string(subsystem));
 
@@ -193,6 +195,8 @@ namespace cbm::algo
     xpu::pop_timer();
 
     monitorOut = std::move(monitor);
+
+    return sizeBytes;
   }
   // ----------------------------------------------------------------------------
 
diff --git a/algo/unpack/Unpack.h b/algo/unpack/Unpack.h
index 6804b37a6e1b2a74b2903452a32d90ae75d88d7f..13cb0b7d9257e50be01936ccd8ba5b0f0abb1738 100644
--- a/algo/unpack/Unpack.h
+++ b/algo/unpack/Unpack.h
@@ -48,6 +48,13 @@ namespace cbm::algo
     std::vector<UnpackRichMonitorData> fRich;    ///< Monitoring data for RICH
     size_t fNumMs       = 0;
     size_t fNumBytes    = 0;
+    size_t fNumBytesInSts       = 0;
+    size_t fNumBytesInMuch      = 0;
+    size_t fNumBytesInTof       = 0;
+    size_t fNumBytesInBmon      = 0;
+    size_t fNumBytesInTrd       = 0;
+    size_t fNumBytesInTrd2d     = 0;
+    size_t fNumBytesInRich      = 0;
     size_t fNumDigis    = 0;
     size_t fNumCompUsed = 0;
     size_t fNumErrInvalidEqId   = 0;
@@ -141,9 +148,9 @@ namespace cbm::algo
 
     /** @brief Parallel microslice loop **/
     template<class Digi, class UnpackAlgo, class Monitor>
-    void ParallelMsLoop(const Subsystem subsystem, UnpackMonitorData& monitor, std::vector<Digi>& digisOut,
-                        std::vector<Monitor>& monitorOut, const fles::Timeslice& ts,
-                        const std::map<u16, UnpackAlgo>& algos, u8 sys_ver);
+    size_t ParallelMsLoop(const Subsystem subsystem, UnpackMonitorData& monitor, std::vector<Digi>& digisOut,
+                          std::vector<Monitor>& monitorOut, const fles::Timeslice& ts,
+                          const std::map<u16, UnpackAlgo>& algos, u8 sys_ver);
 
     std::pair<size_t, size_t> ParallelInit(const fles::Timeslice& ts, Subsystem subsystem,
                                            gsl::span<const uint16_t> legalEqIds, uint8_t sys_ver,