/** * Unified Analytics Event Schema * * Consistent event tracking across all CREATE SOMETHING properties. * Philosophy: Each data point must answer a specific question about user intent. * * @packageDocumentation */ /** * CREATE SOMETHING property identifiers */ export type Property = 'space' | 'io' | 'agency' | 'ltd' | 'lms'; /** * Domain to property mapping for cross-property detection * Single source of truth for property identification */ export declare const PROPERTY_DOMAINS: Record; /** * Event categories aligned with user intent discovery */ export type EventCategory = 'navigation' | 'interaction' | 'search' | 'content' | 'conversion' | 'error' | 'performance'; /** * Unified analytics event structure */ export interface AnalyticsEvent { /** Unique event identifier */ eventId: string; /** Session identifier (persists across page views) */ sessionId: string; /** Authenticated user ID (optional) */ userId?: string; /** Which property this event occurred on */ property: Property; /** Property user came from (for cross-property tracking) */ sourceProperty?: Property; /** ISO 8601 timestamp */ timestamp: string; /** Current page URL */ url: string; /** Previous page URL */ referrer?: string; /** Event category */ category: EventCategory; /** Specific action within category */ action: string; /** Target element or content ID */ target?: string; /** Numeric value (scroll %, duration, etc.) */ value?: number; /** Additional context */ metadata?: Record; } export interface PageViewEvent extends AnalyticsEvent { category: 'navigation'; action: 'page_view'; metadata?: { title?: string; loadTime?: number; }; } export interface RouteChangeEvent extends AnalyticsEvent { category: 'navigation'; action: 'route_change'; metadata?: { fromPath?: string; toPath?: string; }; } export interface BackNavigationEvent extends AnalyticsEvent { category: 'navigation'; action: 'back_navigation'; } export interface SessionEndEvent extends AnalyticsEvent { category: 'navigation'; action: 'session_end'; /** Session duration in seconds */ value: number; } export interface PropertyTransitionEvent extends AnalyticsEvent { category: 'navigation'; action: 'property_transition'; metadata: { sourceProperty: Property; targetProperty: Property; }; } export interface ExternalLinkEvent extends AnalyticsEvent { category: 'navigation'; action: 'external_link'; target: string; } export interface ButtonClickEvent extends AnalyticsEvent { category: 'interaction'; action: 'button_click'; target: string; metadata?: { buttonType?: 'cta' | 'nav' | 'action'; }; } export interface FormStartEvent extends AnalyticsEvent { category: 'interaction'; action: 'form_start'; target: string; } export interface FormSubmitEvent extends AnalyticsEvent { category: 'interaction'; action: 'form_submit'; target: string; metadata?: { success?: boolean; fieldCount?: number; }; } export interface FormAbandonEvent extends AnalyticsEvent { category: 'interaction'; action: 'form_abandon'; target: string; metadata?: { lastField?: string; timeSpent?: number; }; } export interface RageClickEvent extends AnalyticsEvent { category: 'interaction'; action: 'rage_click'; target: string; value: number; metadata?: { timeWindow?: number; }; } export interface SearchQueryEvent extends AnalyticsEvent { category: 'search'; action: 'search_query'; target: string; metadata?: { resultCount?: number; }; } export interface SearchResultClickEvent extends AnalyticsEvent { category: 'search'; action: 'search_result_click'; target: string; value?: number; } export interface SearchNoResultsEvent extends AnalyticsEvent { category: 'search'; action: 'search_no_results'; target: string; } export interface SearchAbandonEvent extends AnalyticsEvent { category: 'search'; action: 'search_abandon'; target: string; metadata?: { resultCount?: number; }; } export interface ScrollDepthEvent extends AnalyticsEvent { category: 'content'; action: 'scroll_depth'; value: number; } export interface TimeOnPageEvent extends AnalyticsEvent { category: 'content'; action: 'time_on_page'; value: number; } export interface ContentCopyEvent extends AnalyticsEvent { category: 'content'; action: 'content_copy'; metadata?: { textLength?: number; }; } export interface ContentLinkClickEvent extends AnalyticsEvent { category: 'content'; action: 'content_link_click'; target: string; } export interface ErrorDisplayedEvent extends AnalyticsEvent { category: 'error'; action: 'error_displayed'; target: string; metadata?: { errorType?: string; component?: string; }; } export interface ValidationFailureEvent extends AnalyticsEvent { category: 'error'; action: 'validation_failure'; target: string; metadata?: { validationType?: string; formId?: string; }; } export interface NotFoundEvent extends AnalyticsEvent { category: 'error'; action: '404_page'; target: string; metadata?: { referrer?: string; }; } export interface WebVitalEvent extends AnalyticsEvent { category: 'performance'; action: 'web_vital_lcp' | 'web_vital_fid' | 'web_vital_cls' | 'web_vital_ttfb'; value: number; metadata?: { rating?: 'good' | 'needs-improvement' | 'poor'; }; } export interface ConversionEvent extends AnalyticsEvent { category: 'conversion'; action: string; metadata?: { conversionType?: string; value?: number; }; } export interface AnalyticsConfig { /** Property identifier */ property: Property; /** API endpoint for sending events */ endpoint?: string; /** Batch size before flush (default: 10) */ batchSize?: number; /** Batch timeout in ms (default: 5000) */ batchTimeout?: number; /** Respect Do Not Track (default: true) */ respectDNT?: boolean; /** Enable debug logging (default: false) */ debug?: boolean; /** User has opted out of analytics (from profile setting) */ userOptedOut?: boolean; /** Authenticated user ID for cross-property tracking */ userId?: string; } export declare const DEFAULT_CONFIG: Partial; export interface EventBatch { events: AnalyticsEvent[]; sentAt: string; } export interface BatchResponse { success: boolean; received: number; errors?: string[]; } /** * Aggregated user analytics for Tufte-style visualization * Philosophy: Show variation and patterns, not raw counts */ export interface UserAnalytics { /** Total sessions across all properties */ totalSessions: number; /** Total page views across all properties */ totalPageViews: number; /** Total time spent in minutes */ totalTimeMinutes: number; /** Daily activity for sparkline visualization */ dailyActivity: DailyActivityPoint[]; /** Breakdown by property for distribution bar */ propertyBreakdown: PropertyBreakdown[]; /** Top pages visited for high-density table */ topPages: TopPage[]; /** Category breakdown for distribution visualization */ categoryBreakdown: CategoryBreakdown[]; } /** * Single day's activity count */ export interface DailyActivityPoint { /** ISO date string (YYYY-MM-DD) */ date: string; /** Event count for this day */ count: number; } /** * Analytics breakdown per property */ export interface PropertyBreakdown { /** Property identifier */ property: Property; /** Number of sessions on this property */ sessions: number; /** Number of page views on this property */ pageViews: number; /** Time spent on this property in minutes */ timeMinutes: number; } /** * Top page entry for high-density table */ export interface TopPage { /** Page URL path */ url: string; /** Property this page belongs to */ property: Property; /** Number of views */ views: number; } /** * Category breakdown for visualization */ export interface CategoryBreakdown { /** Event category */ category: EventCategory; /** Count of events in this category */ count: number; } /** * Per-property analytics response (internal) * Returned by each property's /api/user/analytics endpoint */ export interface PropertyAnalytics { /** Which property this data is from */ property: Property; /** Sessions on this property */ sessions: { total: number; pageViews: number; durationSeconds: number; }; /** Daily event counts */ dailyActivity: DailyActivityPoint[]; /** Category breakdown */ categoryBreakdown: CategoryBreakdown[]; /** Top pages */ topPages: Array<{ url: string; views: number; }>; }