Add console.log to trackRevenue to verify what currency code is being sent to OpenPanel for debugging USD display issue.
80 lines
2.2 KiB
TypeScript
80 lines
2.2 KiB
TypeScript
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<void> {
|
|
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<void> {
|
|
try {
|
|
console.log(`Tracking revenue: ${data.amount} ${data.currency} for order ${data.orderNumber}`);
|
|
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<string, unknown>): Promise<void> {
|
|
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;
|