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:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user