import { OpenPanel } from "@openpanel/nextjs"; // Initialize OpenPanel for server-side tracking const op = new OpenPanel({ clientId: process.env.NEXT_PUBLIC_OPENPANEL_CLIENT_ID || "", clientSecret: process.env.OPENPANEL_CLIENT_SECRET || "", apiUrl: process.env.OPENPANEL_API_URL || "https://op.nodecrew.me/api", }); export interface OrderAnalyticsData { orderId: string; orderNumber: string; total: number; currency: string; itemCount: number; customerEmail: string; eventType: string; } export interface RevenueData { amount: number; currency: string; orderId: string; orderNumber: string; } class AnalyticsService { private static instance: AnalyticsService; static getInstance(): AnalyticsService { if (!AnalyticsService.instance) { AnalyticsService.instance = new AnalyticsService(); } return AnalyticsService.instance; } async trackOrderReceived(data: OrderAnalyticsData): Promise { try { await op.track("order_received", { order_id: data.orderId, order_number: data.orderNumber, total: data.total, currency: data.currency, item_count: data.itemCount, customer_email: data.customerEmail, event_type: data.eventType, }); } catch (error) { console.error("Failed to track order received:", error); // Don't throw - analytics should not break the main flow } } async trackRevenue(data: RevenueData): Promise { try { await op.revenue(data.amount, { currency: data.currency, order_id: data.orderId, order_number: data.orderNumber, }); } catch (error) { console.error("Failed to track revenue:", error); // Don't throw - analytics should not break the main flow } } async track(eventName: string, properties: Record): Promise { try { await op.track(eventName, properties); } catch (error) { console.error(`Failed to track event ${eventName}:`, error); // Don't throw - analytics should not break the main flow } } } export const analyticsService = AnalyticsService.getInstance(); export default analyticsService;