// src/lib/constants.js // PostHog Event Names and Constants // Organized by AARRR Framework (Acquisition, Activation, Retention, Referral, Revenue) // ============================================================================ // ACQUISITION (获客) - Landing page, marketing website events // ============================================================================ export const ACQUISITION_EVENTS = { // Landing page LANDING_PAGE_VIEWED: 'Landing Page Viewed', CTA_BUTTON_CLICKED: 'CTA Button Clicked', FEATURE_CARD_VIEWED: 'Feature Card Viewed', FEATURE_VIDEO_PLAYED: 'Feature Video Played', // Pricing page PRICING_PAGE_VIEWED: 'Pricing Page Viewed', PRICING_PLAN_VIEWED: 'Pricing Plan Viewed', PRICING_PLAN_SELECTED: 'Pricing Plan Selected', // How to use page HOW_TO_USE_PAGE_VIEWED: 'How To Use Page Viewed', TUTORIAL_STEP_VIEWED: 'Tutorial Step Viewed', // Roadmap page ROADMAP_PAGE_VIEWED: 'Roadmap Page Viewed', ROADMAP_ITEM_CLICKED: 'Roadmap Item Clicked', }; // ============================================================================ // ACTIVATION (激活) - Sign up, login, onboarding // ============================================================================ export const ACTIVATION_EVENTS = { // Auth pages LOGIN_PAGE_VIEWED: 'Login Page Viewed', SIGNUP_PAGE_VIEWED: 'Signup Page Viewed', // Login method selection PHONE_LOGIN_INITIATED: 'Phone Login Initiated', // 用户开始填写手机号 WECHAT_LOGIN_INITIATED: 'WeChat Login Initiated', // 用户选择微信登录 // Phone verification code flow VERIFICATION_CODE_SENT: 'Verification Code Sent', VERIFICATION_CODE_SEND_FAILED: 'Verification Code Send Failed', VERIFICATION_CODE_INPUT_CHANGED: 'Verification Code Input Changed', VERIFICATION_CODE_RESENT: 'Verification Code Resent', VERIFICATION_CODE_SUBMITTED: 'Verification Code Submitted', PHONE_NUMBER_VALIDATED: 'Phone Number Validated', // WeChat login flow WECHAT_QR_DISPLAYED: 'WeChat QR Code Displayed', WECHAT_QR_SCANNED: 'WeChat QR Code Scanned', WECHAT_QR_EXPIRED: 'WeChat QR Code Expired', WECHAT_QR_REFRESHED: 'WeChat QR Code Refreshed', WECHAT_STATUS_CHANGED: 'WeChat Status Changed', WECHAT_H5_REDIRECT: 'WeChat H5 Redirect', // 移动端跳转微信H5 // Login/Signup results USER_LOGGED_IN: 'User Logged In', USER_SIGNED_UP: 'User Signed Up', LOGIN_FAILED: 'Login Failed', SIGNUP_FAILED: 'Signup Failed', // User behavior details AUTH_FORM_FOCUSED: 'Auth Form Field Focused', AUTH_FORM_VALIDATION_ERROR: 'Auth Form Validation Error', NICKNAME_PROMPT_SHOWN: 'Nickname Prompt Shown', NICKNAME_PROMPT_ACCEPTED: 'Nickname Prompt Accepted', NICKNAME_PROMPT_SKIPPED: 'Nickname Prompt Skipped', USER_AGREEMENT_LINK_CLICKED: 'User Agreement Link Clicked', PRIVACY_POLICY_LINK_CLICKED: 'Privacy Policy Link Clicked', // Error tracking LOGIN_ERROR_OCCURRED: 'Login Error Occurred', NETWORK_ERROR_OCCURRED: 'Network Error Occurred', SESSION_EXPIRED: 'Session Expired', API_ERROR_OCCURRED: 'API Error Occurred', // Onboarding ONBOARDING_STARTED: 'Onboarding Started', ONBOARDING_STEP_COMPLETED: 'Onboarding Step Completed', ONBOARDING_COMPLETED: 'Onboarding Completed', ONBOARDING_SKIPPED: 'Onboarding Skipped', // User agreement (deprecated, use link clicked events instead) USER_AGREEMENT_VIEWED: 'User Agreement Viewed', USER_AGREEMENT_ACCEPTED: 'User Agreement Accepted', PRIVACY_POLICY_VIEWED: 'Privacy Policy Viewed', PRIVACY_POLICY_ACCEPTED: 'Privacy Policy Accepted', }; // ============================================================================ // RETENTION (留存) - Core product usage, feature engagement // ============================================================================ export const RETENTION_EVENTS = { // Dashboard DASHBOARD_VIEWED: 'Dashboard Viewed', DASHBOARD_CENTER_VIEWED: 'Dashboard Center Viewed', FUNCTION_CARD_CLICKED: 'Function Card Clicked', // Core功能卡片点击 // Navigation TOP_NAV_CLICKED: 'Top Navigation Clicked', SIDEBAR_MENU_CLICKED: 'Sidebar Menu Clicked', MENU_ITEM_CLICKED: 'Menu Item Clicked', BREADCRUMB_CLICKED: 'Breadcrumb Clicked', // Search SEARCH_INITIATED: 'Search Initiated', SEARCH_QUERY_SUBMITTED: 'Search Query Submitted', SEARCH_RESULT_CLICKED: 'Search Result Clicked', SEARCH_NO_RESULTS: 'Search No Results', SEARCH_FILTER_APPLIED: 'Search Filter Applied', // News/Community (新闻催化分析) COMMUNITY_PAGE_VIEWED: 'Community Page Viewed', NEWS_LIST_VIEWED: 'News List Viewed', NEWS_ARTICLE_CLICKED: 'News Article Clicked', NEWS_DETAIL_OPENED: 'News Detail Opened', NEWS_TAB_CLICKED: 'News Tab Clicked', // 相关标的, 相关概念, etc. NEWS_FILTER_APPLIED: 'News Filter Applied', NEWS_SORTED: 'News Sorted', // Concept Center (概念中心) CONCEPT_PAGE_VIEWED: 'Concept Page Viewed', CONCEPT_LIST_VIEWED: 'Concept List Viewed', CONCEPT_CLICKED: 'Concept Clicked', CONCEPT_DETAIL_VIEWED: 'Concept Detail Viewed', CONCEPT_STOCK_CLICKED: 'Concept Stock Clicked', // Stock Center (个股中心) STOCK_OVERVIEW_VIEWED: 'Stock Overview Page Viewed', STOCK_LIST_VIEWED: 'Stock List Viewed', STOCK_SEARCHED: 'Stock Searched', STOCK_CLICKED: 'Stock Clicked', STOCK_DETAIL_VIEWED: 'Stock Detail Viewed', STOCK_TAB_CLICKED: 'Stock Tab Clicked', // 公司概览, 股票行情, 财务全景, 盈利预测 // Company Details COMPANY_OVERVIEW_VIEWED: 'Company Overview Viewed', COMPANY_FINANCIALS_VIEWED: 'Company Financials Viewed', COMPANY_FORECAST_VIEWED: 'Company Forecast Viewed', COMPANY_MARKET_DATA_VIEWED: 'Company Market Data Viewed', // Limit Analysis (涨停分析) LIMIT_ANALYSE_PAGE_VIEWED: 'Limit Analyse Page Viewed', LIMIT_BOARD_CLICKED: 'Limit Board Clicked', LIMIT_SECTOR_EXPANDED: 'Limit Sector Expanded', LIMIT_SECTOR_ANALYSIS_VIEWED: 'Limit Sector Analysis Viewed', LIMIT_STOCK_CLICKED: 'Limit Stock Clicked', // Trading Simulation (模拟盘交易) TRADING_SIMULATION_ENTERED: 'Trading Simulation Entered', SIMULATION_ORDER_PLACED: 'Simulation Order Placed', SIMULATION_HOLDINGS_VIEWED: 'Simulation Holdings Viewed', SIMULATION_HISTORY_VIEWED: 'Simulation History Viewed', SIMULATION_STOCK_SEARCHED: 'Simulation Stock Searched', // Event Details EVENT_DETAIL_VIEWED: 'Event Detail Viewed', EVENT_ANALYSIS_VIEWED: 'Event Analysis Viewed', EVENT_TIMELINE_CLICKED: 'Event Timeline Clicked', // Profile & Settings PROFILE_PAGE_VIEWED: 'Profile Page Viewed', PROFILE_UPDATED: 'Profile Updated', SETTINGS_PAGE_VIEWED: 'Settings Page Viewed', SETTINGS_CHANGED: 'Settings Changed', // Subscription Management SUBSCRIPTION_PAGE_VIEWED: 'Subscription Page Viewed', UPGRADE_PLAN_CLICKED: 'Upgrade Plan Clicked', }; // ============================================================================ // REFERRAL (推荐) - Sharing, inviting // ============================================================================ export const REFERRAL_EVENTS = { // Sharing SHARE_BUTTON_CLICKED: 'Share Button Clicked', CONTENT_SHARED: 'Content Shared', SHARE_LINK_GENERATED: 'Share Link Generated', SHARE_MODAL_OPENED: 'Share Modal Opened', SHARE_MODAL_CLOSED: 'Share Modal Closed', // Referral REFERRAL_PAGE_VIEWED: 'Referral Page Viewed', REFERRAL_LINK_COPIED: 'Referral Link Copied', REFERRAL_INVITE_SENT: 'Referral Invite Sent', }; // ============================================================================ // REVENUE (收入) - Payment, subscription, monetization // ============================================================================ export const REVENUE_EVENTS = { // Paywall PAYWALL_SHOWN: 'Paywall Shown', PAYWALL_DISMISSED: 'Paywall Dismissed', PAYWALL_UPGRADE_CLICKED: 'Paywall Upgrade Clicked', // Payment PAYMENT_PAGE_VIEWED: 'Payment Page Viewed', PAYMENT_METHOD_SELECTED: 'Payment Method Selected', PAYMENT_INITIATED: 'Payment Initiated', PAYMENT_SUCCESSFUL: 'Payment Successful', PAYMENT_FAILED: 'Payment Failed', // Subscription SUBSCRIPTION_CREATED: 'Subscription Created', SUBSCRIPTION_RENEWED: 'Subscription Renewed', SUBSCRIPTION_UPGRADED: 'Subscription Upgraded', SUBSCRIPTION_DOWNGRADED: 'Subscription Downgraded', SUBSCRIPTION_CANCELLED: 'Subscription Cancelled', SUBSCRIPTION_EXPIRED: 'Subscription Expired', // Refund REFUND_REQUESTED: 'Refund Requested', REFUND_PROCESSED: 'Refund Processed', }; // ============================================================================ // SPECIAL EVENTS (特殊事件) - Errors, performance, chatbot // ============================================================================ export const SPECIAL_EVENTS = { // Errors ERROR_OCCURRED: 'Error Occurred', API_ERROR: 'API Error', NOT_FOUND_404: '404 Not Found', // Performance PAGE_LOAD_TIME: 'Page Load Time', API_RESPONSE_TIME: 'API Response Time', // Chatbot (Dify) CHATBOT_OPENED: 'Chatbot Opened', CHATBOT_CLOSED: 'Chatbot Closed', CHATBOT_MESSAGE_SENT: 'Chatbot Message Sent', CHATBOT_MESSAGE_RECEIVED: 'Chatbot Message Received', CHATBOT_FEEDBACK_PROVIDED: 'Chatbot Feedback Provided', // Scroll depth SCROLL_DEPTH_25: 'Scroll Depth 25%', SCROLL_DEPTH_50: 'Scroll Depth 50%', SCROLL_DEPTH_75: 'Scroll Depth 75%', SCROLL_DEPTH_100: 'Scroll Depth 100%', // Session SESSION_STARTED: 'Session Started', SESSION_ENDED: 'Session Ended', USER_IDLE: 'User Idle', USER_RETURNED: 'User Returned', // Logout USER_LOGGED_OUT: 'User Logged Out', }; // ============================================================================ // USER PROPERTIES (用户属性) // ============================================================================ export const USER_PROPERTIES = { // Identity EMAIL: 'email', USERNAME: 'username', USER_ID: 'user_id', PHONE: 'phone', // Subscription SUBSCRIPTION_TIER: 'subscription_tier', // 'free', 'pro', 'enterprise' SUBSCRIPTION_STATUS: 'subscription_status', // 'active', 'expired', 'cancelled' SUBSCRIPTION_START_DATE: 'subscription_start_date', SUBSCRIPTION_END_DATE: 'subscription_end_date', // Engagement REGISTRATION_DATE: 'registration_date', LAST_LOGIN: 'last_login', LOGIN_COUNT: 'login_count', DAYS_SINCE_REGISTRATION: 'days_since_registration', LIFETIME_VALUE: 'lifetime_value', // Preferences PREFERRED_LANGUAGE: 'preferred_language', THEME_PREFERENCE: 'theme_preference', // 'light', 'dark' NOTIFICATION_ENABLED: 'notification_enabled', // Attribution UTM_SOURCE: 'utm_source', UTM_MEDIUM: 'utm_medium', UTM_CAMPAIGN: 'utm_campaign', REFERRER: 'referrer', // Behavioral FAVORITE_FEATURES: 'favorite_features', MOST_VISITED_PAGES: 'most_visited_pages', TOTAL_SESSIONS: 'total_sessions', AVERAGE_SESSION_DURATION: 'average_session_duration', }; // ============================================================================ // SUBSCRIPTION TIERS (订阅等级) // ============================================================================ export const SUBSCRIPTION_TIERS = { FREE: 'free', PRO: 'pro', ENTERPRISE: 'enterprise', }; // ============================================================================ // PAGE TYPES (页面类型) // ============================================================================ export const PAGE_TYPES = { LANDING: 'landing', DASHBOARD: 'dashboard', FEATURE: 'feature', DETAIL: 'detail', AUTH: 'auth', SETTINGS: 'settings', PAYMENT: 'payment', ERROR: 'error', }; // ============================================================================ // CONTENT TYPES (内容类型) // ============================================================================ export const CONTENT_TYPES = { NEWS: 'news', STOCK: 'stock', CONCEPT: 'concept', ANALYSIS: 'analysis', EVENT: 'event', COMPANY: 'company', }; // ============================================================================ // SHARE CHANNELS (分享渠道) // ============================================================================ export const SHARE_CHANNELS = { WECHAT: 'wechat', LINK: 'link', QRCODE: 'qrcode', EMAIL: 'email', COPY: 'copy', }; // ============================================================================ // LOGIN METHODS (登录方式) // ============================================================================ export const LOGIN_METHODS = { WECHAT: 'wechat', EMAIL: 'email', PHONE: 'phone', USERNAME: 'username', }; // ============================================================================ // PAYMENT METHODS (支付方式) // ============================================================================ export const PAYMENT_METHODS = { WECHAT_PAY: 'wechat_pay', ALIPAY: 'alipay', CREDIT_CARD: 'credit_card', }; // ============================================================================ // Helper function to get all events // ============================================================================ export const getAllEvents = () => { return { ...ACQUISITION_EVENTS, ...ACTIVATION_EVENTS, ...RETENTION_EVENTS, ...REFERRAL_EVENTS, ...REVENUE_EVENTS, ...SPECIAL_EVENTS, }; }; // ============================================================================ // Helper function to validate event name // ============================================================================ export const isValidEvent = (eventName) => { const allEvents = getAllEvents(); return Object.values(allEvents).includes(eventName); };