@akson/cortex-landing-analytics
Version:
Enhanced analytics for landing pages with lead scoring, multi-channel conversion tracking, and A/B testing support
128 lines (126 loc) • 3.47 kB
JavaScript
// src/conversion-tracking/index.ts
var ConversionTracker = class {
constructor(config) {
this.conversions = [];
this.config = config;
}
/**
* Track form submission conversion
*/
trackFormSubmission(data) {
const events = [];
const gtmEvent = {
event: "form_submission",
value: data.value || 0,
currency: "CHF",
conversionLabel: this.config.gtm.conversionLabels.FORM_SUBMISSION,
timestamp: /* @__PURE__ */ new Date(),
source: "gtm",
metadata: {
form_type: data.formType,
lead_score: data.leadScore,
...data.metadata
}
};
events.push(gtmEvent);
const posthogEvent = {
event: "lead_form_submitted",
value: data.leadScore || 100,
timestamp: /* @__PURE__ */ new Date(),
source: "posthog",
metadata: {
form_type: data.formType,
conversion_value: data.value,
...data.metadata
}
};
events.push(posthogEvent);
this.conversions.push(...events);
return events;
}
/**
* Track WhatsApp contact conversion
*/
trackWhatsAppContact(data) {
const events = [];
const gtmEvent = {
event: "whatsapp_contact",
value: 0,
currency: "CHF",
conversionLabel: this.config.gtm.conversionLabels.WHATSAPP_CONTACT,
timestamp: /* @__PURE__ */ new Date(),
source: "gtm",
metadata: {
phone_number: data.phoneNumber,
message_length: data.message?.length || 0,
lead_score: data.leadScore,
...data.metadata
}
};
events.push(gtmEvent);
const posthogEvent = {
event: "lead_whatsapp_contact",
value: data.leadScore || 85,
timestamp: /* @__PURE__ */ new Date(),
source: "posthog",
metadata: {
contact_method: "whatsapp",
has_message: !!data.message,
...data.metadata
}
};
events.push(posthogEvent);
this.conversions.push(...events);
return events;
}
/**
* Get conversion funnel data
*/
getFunnelData(timeRange) {
const filtered = timeRange ? this.conversions.filter(
(c) => c.timestamp >= timeRange.start && c.timestamp <= timeRange.end
) : this.conversions;
const bySource = filtered.reduce((acc, conv) => {
acc[conv.source] = (acc[conv.source] || 0) + 1;
return acc;
}, {});
const byEvent = filtered.reduce((acc, conv) => {
acc[conv.event] = (acc[conv.event] || 0) + 1;
return acc;
}, {});
const totalValue = filtered.reduce((sum, conv) => sum + (conv.value || 0), 0);
return {
total_conversions: filtered.length,
by_source: bySource,
by_event: byEvent,
total_value: totalValue,
conversion_rate: this.calculateConversionRate(filtered)
};
}
/**
* Export conversion data for reporting
*/
exportConversions(format = "json") {
if (format === "json") {
return {
conversions: this.conversions.map((conv) => ({
event: conv.event,
source: conv.source,
value: conv.value,
currency: conv.currency,
conversion_label: conv.conversionLabel,
timestamp: conv.timestamp.toISOString(),
metadata: conv.metadata
})),
summary: this.getFunnelData()
};
}
return this.conversions;
}
calculateConversionRate(conversions) {
return conversions.length > 0 ? 0.05 : 0;
}
};
export {
ConversionTracker
};