133 lines
4.4 KiB
TypeScript
133 lines
4.4 KiB
TypeScript
import { z } from 'zod';
|
|
|
|
// Environment variables for analytics
|
|
const envSchema = z.object({
|
|
MIXPANEL_TOKEN: z.string(),
|
|
MIXPANEL_API_SECRET: z.string().optional(),
|
|
GA4_MEASUREMENT_ID: z.string(),
|
|
GA4_API_SECRET: z.string().optional(),
|
|
STRIPE_WEBHOOK_SECRET: z.string(),
|
|
ANALYTICS_ENV: z.enum(['development', 'production', 'staging']).default('development'),
|
|
});
|
|
|
|
export const analyticsEnv = envSchema.parse({
|
|
MIXPANEL_TOKEN: process.env.MIXPANEL_TOKEN,
|
|
MIXPANEL_API_SECRET: process.env.MIXPANEL_API_SECRET,
|
|
GA4_MEASUREMENT_ID: process.env.GA4_MEASUREMENT_ID,
|
|
GA4_API_SECRET: process.env.GA4_API_SECRET,
|
|
STRIPE_WEBHOOK_SECRET: process.env.STRIPE_WEBHOOK_SECRET,
|
|
ANALYTICS_ENV: process.env.ANALYTICS_ENV,
|
|
});
|
|
|
|
// Event taxonomy
|
|
export enum EventType {
|
|
// User events
|
|
USER_SIGNED_UP = 'user_signed_up',
|
|
USER_LOGGED_IN = 'user_logged_in',
|
|
USER_LOGGED_OUT = 'user_logged_out',
|
|
USER_UPGRADED = 'user_upgraded',
|
|
USER_DOWNGRADED = 'user_downgraded',
|
|
|
|
// Subscription events
|
|
SUBSCRIPTION_CREATED = 'subscription_created',
|
|
SUBSCRIPTION_UPDATED = 'subscription_updated',
|
|
SUBSCRIPTION_CANCELLED = 'subscription_cancelled',
|
|
SUBSCRIPTION_RENEWED = 'subscription_renewed',
|
|
|
|
// DarkWatch events
|
|
DARK_WEB_SCAN_STARTED = 'dark_web_scan_started',
|
|
DARK_WEB_SCAN_COMPLETED = 'dark_web_scan_completed',
|
|
EXPOSURE_DETECTED = 'exposure_detected',
|
|
EXPOSURE_RESOLVED = 'exposure_resolved',
|
|
WATCHLIST_ITEM_ADDED = 'watchlist_item_added',
|
|
WATCHLIST_ITEM_REMOVED = 'watchlist_item_removed',
|
|
|
|
// VoicePrint events
|
|
VOICE_ENROLLED = 'voice_enrolled',
|
|
VOICE_ANALYZED = 'voice_analyzed',
|
|
VOICE_MATCH_FOUND = 'voice_match_found',
|
|
SYNTHETIC_VOICE_DETECTED = 'synthetic_voice_detected',
|
|
|
|
// SpamShield events
|
|
CALL_ANALYZED = 'call_analyzed',
|
|
SMS_ANALYZED = 'sms_analyzed',
|
|
SPAM_BLOCKED = 'spam_blocked',
|
|
SPAM_FLAGGED = 'spam_flagged',
|
|
SPAM_FEEDBACK_SUBMITTED = 'spam_feedback_submitted',
|
|
|
|
// KPI events
|
|
MRR_UPDATED = 'mrr_updated',
|
|
CONVERSION_OCCURRED = 'conversion_occurred',
|
|
CHURN_OCCURRED = 'churn_occurred',
|
|
REFERRAL_SENT = 'referral_sent',
|
|
REFERRAL_CONVERTED = 'referral_converted',
|
|
}
|
|
|
|
// Event properties schema
|
|
export const eventPropertiesSchema = z.object({
|
|
userId: z.string().optional(),
|
|
sessionId: z.string().optional(),
|
|
timestamp: z.date().optional(),
|
|
platform: z.enum(['web', 'mobile', 'desktop', 'api']).optional(),
|
|
version: z.string().optional(),
|
|
environment: z.string().optional(),
|
|
});
|
|
|
|
// KPI definitions
|
|
export const kpiDefinitions = {
|
|
mau: {
|
|
name: 'Monthly Active Users',
|
|
description: 'Unique users who performed an action in the last 30 days',
|
|
calculation: 'COUNT(DISTINCT userId) WHERE timestamp > NOW() - INTERVAL 30 DAYS',
|
|
},
|
|
payingUsers: {
|
|
name: 'Paying Users',
|
|
description: 'Users with active subscriptions',
|
|
calculation: 'COUNT(DISTINCT userId) WHERE subscription.status = "active"',
|
|
},
|
|
mrr: {
|
|
name: 'Monthly Recurring Revenue',
|
|
description: 'Total monthly subscription revenue',
|
|
calculation: 'SUM(subscription.amount) WHERE subscription.status = "active"',
|
|
},
|
|
conversionRate: {
|
|
name: 'Conversion Rate',
|
|
description: 'Percentage of free users who upgrade to paid',
|
|
calculation: 'COUNT(upgrade events) / COUNT(signup events)',
|
|
},
|
|
churn: {
|
|
name: 'Churn Rate',
|
|
description: 'Percentage of paying users who cancel',
|
|
calculation: 'COUNT(cancel events) / COUNT(active subscriptions)',
|
|
},
|
|
cac: {
|
|
name: 'Customer Acquisition Cost',
|
|
description: 'Average cost to acquire a new paying user',
|
|
calculation: 'Total marketing spend / COUNT(new paying users)',
|
|
},
|
|
ltv: {
|
|
name: 'Lifetime Value',
|
|
description: 'Average revenue per user over their lifetime',
|
|
calculation: 'Average subscription amount / Churn rate',
|
|
},
|
|
nps: {
|
|
name: 'Net Promoter Score',
|
|
description: 'Customer satisfaction metric (-100 to 100)',
|
|
calculation: '% Promoters - % Detractors',
|
|
},
|
|
viralCoefficient: {
|
|
name: 'Viral Coefficient',
|
|
description: 'Average number of referrals per user',
|
|
calculation: 'COUNT(referral events) / COUNT(users)',
|
|
},
|
|
};
|
|
|
|
// Alert thresholds
|
|
export const alertThresholds = {
|
|
churn: { warning: 0.05, critical: 0.10 },
|
|
conversionRate: { warning: 0.02, critical: 0.01 },
|
|
mrr: { warning: 0.90, critical: 0.80 }, // Percentage of target
|
|
nps: { warning: 50, critical: 40 },
|
|
viralCoefficient: { warning: 0.4, critical: 0.3 },
|
|
};
|