package com.tt.honeyDue.analytics /** * Common analytics interface for cross-platform event tracking. * Platform-specific implementations use PostHog SDKs. */ expect object PostHogAnalytics { fun initialize() fun identify(userId: String, properties: Map? = null) fun capture(event: String, properties: Map? = null) fun captureException(throwable: Throwable, properties: Map? = null) fun screen(screenName: String, properties: Map? = null) fun reset() fun flush() fun setupExceptionHandler() } /** * Analytics event names - use these constants for consistency across the app */ object AnalyticsEvents { // Authentication const val REGISTRATION_SCREEN_SHOWN = "registration_screen_shown" const val USER_REGISTERED = "user_registered" const val USER_SIGNED_IN = "user_signed_in" const val USER_SIGNED_IN_APPLE = "user_signed_in_apple" // Residence const val RESIDENCE_SCREEN_SHOWN = "residence_screen_shown" const val NEW_RESIDENCE_SCREEN_SHOWN = "new_residence_screen_shown" const val RESIDENCE_CREATED = "residence_created" const val RESIDENCE_JOINED = "residence_joined" const val RESIDENCE_LIMIT_REACHED = "residence_limit_reached" // Task const val TASK_SCREEN_SHOWN = "task_screen_shown" const val NEW_TASK_SCREEN_SHOWN = "new_task_screen_shown" const val TASK_CREATED = "task_created" // Onboarding — First Task screen funnel // Fired by both iOS and Android with identical event names so the // PostHog funnel is cross-platform. Properties documented next to each. // ONBOARDING_SUGGESTIONS_LOADED: {"count": Int, "profile_completeness": Double} // ONBOARDING_SUGGESTION_ACCEPTED: {"template_id": Int, "relevance_score": Double} // ONBOARDING_BROWSE_TEMPLATE_ACCEPTED: {"template_id": Int, "category": String?} // ONBOARDING_TASKS_CREATED: {"count": Int} // ONBOARDING_TASK_STEP_SKIPPED: {"reason": "network_error" | "user_skip"} const val ONBOARDING_SUGGESTIONS_LOADED = "onboarding_suggestions_loaded" const val ONBOARDING_SUGGESTION_ACCEPTED = "onboarding_suggestion_accepted" const val ONBOARDING_BROWSE_TEMPLATE_ACCEPTED = "onboarding_browse_template_accepted" const val ONBOARDING_TASKS_CREATED = "onboarding_tasks_created" const val ONBOARDING_TASK_STEP_SKIPPED = "onboarding_task_step_skipped" // Contractor const val CONTRACTOR_SCREEN_SHOWN = "contractor_screen_shown" const val NEW_CONTRACTOR_SCREEN_SHOWN = "new_contractor_screen_shown" const val CONTRACTOR_CREATED = "contractor_created" const val CONTRACTOR_PAYWALL_SHOWN = "contractor_paywall_shown" // Documents const val DOCUMENTS_SCREEN_SHOWN = "documents_screen_shown" const val NEW_DOCUMENT_SCREEN_SHOWN = "new_document_screen_shown" const val DOCUMENT_CREATED = "document_created" const val DOCUMENTS_PAYWALL_SHOWN = "documents_paywall_shown" // Sharing const val SHARE_RESIDENCE_SCREEN_SHOWN = "share_residence_screen_shown" const val RESIDENCE_SHARED = "residence_shared" const val SHARE_RESIDENCE_PAYWALL_SHOWN = "share_residence_paywall_shown" const val SHARE_CONTRACTOR_SCREEN_SHOWN = "share_contractor_screen_shown" const val CONTRACTOR_SHARED = "contractor_shared" const val SHARE_CONTRACTOR_PAYWALL_SHOWN = "share_contractor_paywall_shown" // Settings const val NOTIFICATION_SETTINGS_SCREEN_SHOWN = "notification_settings_screen_shown" const val SETTINGS_SCREEN_SHOWN = "settings_screen_shown" const val THEME_CHANGED = "theme_changed" // Subscription / Paywall // PAYWALL_COMPARE_CTA: fired when the user taps the "Upgrade to Pro" CTA // from the FeatureComparisonScreen (the full-screen Free vs. Pro // comparison table). Lets the funnel attribute conversions to the // comparison surface rather than the generic upgrade entry point. const val PAYWALL_COMPARE_CTA = "paywall_compare_cta" }