feat(analytics): complete Rybbit tracking integration
Some checks failed
Build and Deploy / build (push) Has been cancelled
Some checks failed
Build and Deploy / build (push) Has been cancelled
- Add Rybbit server-side tracking to analytics-server.ts for order completion and revenue - Add trackNewsletterSignup to analytics.ts and wire up NewsletterSection - Add cart tracking to CartDrawer (cart view, remove from cart) - All ecommerce events now track to both OpenPanel and Rybbit
This commit is contained in:
@@ -9,6 +9,11 @@ const op = new OpenPanel({
|
||||
apiUrl: process.env.OPENPANEL_API_URL || "https://op.nodecrew.me/api",
|
||||
});
|
||||
|
||||
// Rybbit server-side tracking
|
||||
const RYBBIT_HOST = process.env.NEXT_PUBLIC_RYBBIT_HOST || "https://rybbit.nodecrew.me";
|
||||
const RYBBIT_API_KEY = process.env.RYBBIT_API_KEY;
|
||||
const RYBBIT_SITE_ID = process.env.NEXT_PUBLIC_RYBBIT_SITE_ID || "1";
|
||||
|
||||
export interface ServerOrderData {
|
||||
orderId: string;
|
||||
orderNumber: string;
|
||||
@@ -26,6 +31,34 @@ export interface ServerEventData {
|
||||
properties?: Record<string, any>;
|
||||
}
|
||||
|
||||
async function trackRybbitServer(eventName: string, properties?: Record<string, any>) {
|
||||
try {
|
||||
const headers: Record<string, string> = {
|
||||
"Content-Type": "application/json",
|
||||
};
|
||||
if (RYBBIT_API_KEY) {
|
||||
headers["Authorization"] = `Bearer ${RYBBIT_API_KEY}`;
|
||||
}
|
||||
|
||||
const response = await fetch(`${RYBBIT_HOST}/api/track`, {
|
||||
method: "POST",
|
||||
headers,
|
||||
body: JSON.stringify({
|
||||
site_id: RYBBIT_SITE_ID,
|
||||
type: "custom_event",
|
||||
event_name: eventName,
|
||||
properties: JSON.stringify(properties || {}),
|
||||
}),
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
console.warn("[Rybbit Server] Track failed:", await response.text());
|
||||
}
|
||||
} catch (error) {
|
||||
console.warn("[Rybbit Server] Track error:", error);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Server-side analytics tracking
|
||||
* Called from API routes or Server Components
|
||||
@@ -34,7 +67,7 @@ export async function trackOrderCompletedServer(data: ServerOrderData) {
|
||||
try {
|
||||
console.log("[Server Analytics] Tracking order:", data.orderNumber, "Total:", data.total);
|
||||
|
||||
// Track order event
|
||||
// Track order event with OpenPanel
|
||||
await op.track("order_completed", {
|
||||
order_id: data.orderId,
|
||||
order_number: data.orderNumber,
|
||||
@@ -48,7 +81,7 @@ export async function trackOrderCompletedServer(data: ServerOrderData) {
|
||||
source: "server",
|
||||
});
|
||||
|
||||
// Track revenue (this is the important part!)
|
||||
// Track revenue with OpenPanel
|
||||
await op.revenue(data.total, {
|
||||
currency: data.currency,
|
||||
transaction_id: data.orderNumber,
|
||||
@@ -56,6 +89,21 @@ export async function trackOrderCompletedServer(data: ServerOrderData) {
|
||||
source: "server",
|
||||
});
|
||||
|
||||
// Track conversion/revenue with Rybbit
|
||||
await trackRybbitServer("order_completed", {
|
||||
order_id: data.orderId,
|
||||
order_number: data.orderNumber,
|
||||
total: data.total,
|
||||
currency: data.currency,
|
||||
item_count: data.itemCount,
|
||||
customer_email: data.customerEmail,
|
||||
payment_method: data.paymentMethod,
|
||||
shipping_cost: data.shippingCost,
|
||||
coupon_code: data.couponCode,
|
||||
revenue: data.total,
|
||||
source: "server",
|
||||
});
|
||||
|
||||
console.log("[Server Analytics] Order tracked successfully");
|
||||
return { success: true };
|
||||
} catch (error) {
|
||||
@@ -74,6 +122,10 @@ export async function trackServerEvent(data: ServerEventData) {
|
||||
...data.properties,
|
||||
source: "server",
|
||||
});
|
||||
|
||||
// Also track to Rybbit
|
||||
await trackRybbitServer(data.event, data.properties);
|
||||
|
||||
return { success: true };
|
||||
} catch (error) {
|
||||
console.error("[Server Analytics] Event tracking failed:", error);
|
||||
|
||||
Reference in New Issue
Block a user