type EventParams = Record; const GA_MEASUREMENT_ID = import.meta.env.VITE_GA_MEASUREMENT_ID as string | undefined; const MIXPANEL_TOKEN = import.meta.env.VITE_MIXPANEL_TOKEN as string | undefined; declare global { interface Window { gtag?: (command: string, target: string, params?: EventParams) => void; mixpanel?: { track: (event: string, params?: EventParams) => void }; dataLayer?: unknown[]; } } function initGA() { if (!GA_MEASUREMENT_ID || typeof window === 'undefined') return; if (window.gtag) return; const script = document.createElement('script'); script.async = true; script.src = `https://www.googletagmanager.com/gtag/js?id=${GA_MEASUREMENT_ID}`; document.head.appendChild(script); window.dataLayer = window.dataLayer || []; window.gtag = function gtag() { window.dataLayer!.push(arguments); }; window.gtag('js', new Date()); window.gtag('config', GA_MEASUREMENT_ID); } function initMixpanel() { if (!MIXPANEL_TOKEN || typeof window === 'undefined') return; if (window.mixpanel) return; const script = document.createElement('script'); script.async = true; script.src = 'https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js'; document.head.appendChild(script); script.onload = () => { window.mixpanel = window.mixpanel || { track: () => {} }; window.mixpanel.init?.(MIXPANEL_TOKEN); }; } export function initAnalytics() { initGA(); initMixpanel(); } export function trackEvent(name: string, params?: EventParams) { if (typeof window === 'undefined') return; if (window.gtag) { window.gtag('event', name, params); } if (window.mixpanel) { window.mixpanel.track(name, params); } } export function trackWaitlistSignup(email: string, source?: string, tier?: string) { trackEvent('waitlist_signup', { email, source: source || 'landing_page', tier: tier || 'unknown', }); } export function trackPageView(path: string, title?: string) { trackEvent('page_view', { page_path: path, page_title: title || document.title, }); }