UNPKG

@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
// 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 };