import { randomUUID } from "node:crypto"; export type EventType = | "click" | "booking" | "offer_presented" | "payment_succeeded" | "payment_failed" | "refund" | "dispute" | "fulfillment_completed"; export type ConversionState = | "traffic" | "pipeline" | "revenue" | "retained" | "lost"; export interface CommercialEvent { id: string; type: EventType; timestamp: string; campaignId?: string; visitorId?: string; sessionId?: string; linkId?: string; bookingId?: string; offerId?: string; customerId?: string; paymentId?: string; amountCents?: number; currency?: string; refundCents?: number; fulfillmentCostCents?: number; routeId?: string; source: string; raw: Record; } export interface Visitor { id: string; firstSeen: string; lastSeen: string; clickCount: number; bookingCount: number; paymentCount: number; totalRevenueCents: number; totalRefundCents: number; } export interface Customer { id: string; stripeCustomerId?: string; calendlyInviteeId?: string; visitorId?: string; email?: string; name?: string; totalRevenueCents: number; totalRefundCents: number; repeatPurchaseCount: number; } export interface Offer { id: string; campaignId: string; name: string; priceCents: number; currency: string; bookingType?: string; fulfillmentCostCents: number; refundProbability: number; active: boolean; metadata: Record; } export interface Route { id: string; campaignId: string; offerId: string; linkId: string; bookingType?: string; expectedBookingProbability: number; expectedPaymentProbability: number; expectedPaymentCents: number; expectedRefundProbability: number; expectedFulfillmentCostCents: number; presentationCount: number; bookingCount: number; paymentCount: number; revenueCents: number; refundCents: number; retainedCents: number; } export interface LedgerEntry { event: CommercialEvent; conversionState: ConversionState; attributedRouteId?: string; attributedOfferId?: string; attributedCustomerId?: string; retainedCents?: number; }