diff --git a/app/Jobs/ProcessTrackingPayload.php b/app/Jobs/ProcessTrackingPayload.php index c02fb80..f0a8817 100644 --- a/app/Jobs/ProcessTrackingPayload.php +++ b/app/Jobs/ProcessTrackingPayload.php @@ -110,9 +110,14 @@ class ProcessTrackingPayload implements ShouldQueue ]); } + // Calculate duration, ensuring it's never negative (handle out-of-order events) + // Use max() to ensure we use the latest timestamp for ended_at + $endedAt = $session->ended_at ? max($now, $session->ended_at) : $now; + $duration = max(0, (int) $endedAt->diffInSeconds($session->started_at, false)); + $session->update([ - 'ended_at' => $now, - 'duration' => $now->diffInSeconds($session->started_at), + 'ended_at' => $endedAt, + 'duration' => $duration, 'exit_page' => $this->payload['path'] ?? $this->payload['url'] ?? $session->exit_page, 'pages_count' => $session->pageViews()->count(), 'is_bounce' => $session->pageViews()->count() <= 1,