Add comprehensive visitor engagement tracking and scroll-to-top on navigation

Tracks scroll depth (25/50/75/90%), time on page, UTM parameters, outbound
link clicks, search queries, audio pause/completion/listen time, and 404s.
Logged-in study users are now tied to their visitor record and surfaced in
the admin recent visits table. Scroll position resets on every route change.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
nmemmert
2026-06-17 14:06:21 -04:00
parent a6f0c39c35
commit 31426fccba
11 changed files with 498 additions and 4 deletions
+10
View File
@@ -540,6 +540,7 @@ export interface AdminStats {
returningVisitor: boolean
visitCount: number
pageHistory?: Array<{ at: string; path: string; referrer?: string }>
studyUser?: { userId: string; username: string; displayName: string }
}>
}
writeStatus: {
@@ -570,6 +571,15 @@ export interface AdminStats {
byDay: Record<string, number>
last30Days: Array<{ day: string; plays: number }>
}>
engagement?: {
scrollDepth: Array<{ path: string; 25?: number; 50?: number; 75?: number; 90?: number }>
timeOnPage: Array<{ path: string; avgSeconds: number; count: number }>
topOutboundClicks: Array<{ url: string; count: number }>
topUTMSources: Array<{ source: string; count: number }>
topSearchQueries: Array<{ query: string; count: number }>
top404s: Array<{ path: string; count: number }>
audioEvents: Array<{ title: string; pauses: number; completions: number; totalListenSeconds: number }>
}
}
interface AdminAsset {