// Analytics service for BookWiz platform export const GTM_ID = 'GTM-PQX5H833' export const GA_MEASUREMENT_ID = 'G-JRS4P3QC9V' // Define event types for type safety export interface AnalyticsEvent { event: string [key: string]: any } // Initialize GTM dataLayer declare global { interface Window { dataLayer: any[] gtag: (...args: any[]) => void } } export const initializeAnalytics = () => { // Initialize dataLayer window.dataLayer = window.dataLayer || [] // GTM initialization const gtmScript = document.createElement('script') gtmScript.src = `https://www.googletagmanager.com/gtm.js?id=${GTM_ID}` gtmScript.async = true document.head.appendChild(gtmScript) // Push GTM initialization window.dataLayer.push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' }) } // Generic event tracking export const trackEvent = (eventData: AnalyticsEvent) => { if (typeof window !== 'undefined' && window.dataLayer) { window.dataLayer.push(eventData) } } // Page view tracking export const trackPageView = (url: string, title?: string) => { trackEvent({ event: 'page_view', page_location: url, page_title: title || document.title, }) } // User authentication events export const trackAuth = { login: (method: string = 'google') => { trackEvent({ event: 'login', method, timestamp: new Date().toISOString(), }) }, signUp: (method: string = 'google') => { trackEvent({ event: 'sign_up', method, timestamp: new Date().toISOString(), }) }, logout: () => { trackEvent({ event: 'logout', timestamp: new Date().toISOString(), }) } } // Book-related events export const trackBook = { create: (templateId?: string) => { trackEvent({ event: 'book_create', template_id: templateId, timestamp: new Date().toISOString(), }) }, open: (bookId: string) => { trackEvent({ event: 'book_open', book_id: bookId, timestamp: new Date().toISOString(), }) }, edit: (bookId: string, action: 'file_create' | 'file_edit' | 'file_delete') => { trackEvent({ event: 'book_edit', book_id: bookId, edit_action: action, timestamp: new Date().toISOString(), }) }, delete: (bookId: string) => { trackEvent({ event: 'book_delete', book_id: bookId, timestamp: new Date().toISOString(), }) } } // AI operations tracking export const trackAI = { chatMessage: (bookId: string, messageLength: number, model: string) => { trackEvent({ event: 'ai_chat_message', book_id: bookId, message_length: messageLength, ai_model: model, timestamp: new Date().toISOString(), }) }, operation: (operationType: string, bookId: string, success: boolean) => { trackEvent({ event: 'ai_operation', operation_type: operationType, book_id: bookId, success, timestamp: new Date().toISOString(), }) }, revert: (operationId: string, bookId: string) => { trackEvent({ event: 'ai_operation_revert', operation_id: operationId, book_id: bookId, timestamp: new Date().toISOString(), }) } } // Subscription and billing events export const trackSubscription = { checkoutStart: (planType: string, planPrice: number) => { trackEvent({ event: 'begin_checkout', currency: 'USD', value: planPrice, items: [{ item_id: planType, item_name: `BookWiz ${planType} Plan`, category: 'subscription', quantity: 1, price: planPrice, }], }) }, purchase: (planType: string, planPrice: number, transactionId: string) => { trackEvent({ event: 'purchase', transaction_id: transactionId, currency: 'USD', value: planPrice, items: [{ item_id: planType, item_name: `BookWiz ${planType} Plan`, category: 'subscription', quantity: 1, price: planPrice, }], }) }, cancel: (planType: string) => { trackEvent({ event: 'subscription_cancel', plan_type: planType, timestamp: new Date().toISOString(), }) }, upgrade: (fromPlan: string, toPlan: string) => { trackEvent({ event: 'subscription_upgrade', from_plan: fromPlan, to_plan: toPlan, timestamp: new Date().toISOString(), }) } } // Template usage tracking export const trackTemplate = { view: (templateId: string) => { trackEvent({ event: 'template_view', template_id: templateId, timestamp: new Date().toISOString(), }) }, use: (templateId: string) => { trackEvent({ event: 'template_use', template_id: templateId, timestamp: new Date().toISOString(), }) } } // Usage and engagement tracking export const trackUsage = { sessionStart: () => { trackEvent({ event: 'session_start', timestamp: new Date().toISOString(), }) }, featureUse: (feature: string, context?: string) => { trackEvent({ event: 'feature_use', feature_name: feature, context, timestamp: new Date().toISOString(), }) }, searchQuery: (query: string, resultsCount: number) => { trackEvent({ event: 'search', search_term: query, results_count: resultsCount, timestamp: new Date().toISOString(), }) } } // Blog and content engagement export const trackContent = { blogView: (slug: string, title: string) => { trackEvent({ event: 'blog_view', blog_slug: slug, blog_title: title, timestamp: new Date().toISOString(), }) }, blogEngagement: (slug: string, action: 'scroll_50' | 'scroll_90' | 'time_on_page') => { trackEvent({ event: 'blog_engagement', blog_slug: slug, engagement_type: action, timestamp: new Date().toISOString(), }) } } // Error tracking export const trackError = { jsError: (error: Error, context?: string) => { trackEvent({ event: 'exception', description: error.message, fatal: false, context, timestamp: new Date().toISOString(), }) }, apiError: (endpoint: string, statusCode: number, errorMessage: string) => { trackEvent({ event: 'api_error', endpoint, status_code: statusCode, error_message: errorMessage, timestamp: new Date().toISOString(), }) } }