{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-guides/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["sub-heading"]},"type":"markdown"},"seo":{"title":"Analytics","description":"Transform your commerce with PXP's unified platform—seamless payments, real-time insights, and global growth in one powerful integration.","lang":"en-UK","siteUrl":"https://developer.pxp.io","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"analytics","__idx":0},"children":["Analytics"]},{"$$mdtype":"Tag","name":"SubHeading","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Get actionable, trackable data instantly to drive better decisions and performance."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"overview","__idx":1},"children":["Overview"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Analytics events are structured data objects that get automatically triggered when significant actions or states occur within components. These allow you to monitor every aspect of the payment journey."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Analytics events allow you to:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Gain transparency with native transaction tracking in PXP reports."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Optimise conversion rates and reduce drop-offs, thanks to actionable insights."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Feed real-time data into your analytics and CRM systems."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"consume-an-event","__idx":2},"children":["Consume an event"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Analytics events should be consumed in the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PxpSdkConfig"]}," during SDK initialisation. For example:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","header":{"controls":{"copy":{}}},"source":"val sdkConfig = PxpSdkConfig(\n    environment = Environment.TEST,\n    session = SessionConfig(\n        sessionId = \"your_session_id\",\n        sessionData = \"your_session_data\"\n    ),\n    merchantShopperId = \"123\",\n    ownerId = \"UnityGroup\",\n    ownerType = \"MerchantGroup\",\n    transactionData = TransactionData(\n        currency = CurrencyType.USD,\n        amount = payAmount,\n        entryType = EntryType.Ecom,\n        intent = IntentType.Authorisation,\n        merchantTransactionId = \"9af8af33-59d5-432d-bd35-96124930ec9f\",\n        merchantTransactionDate = { Instant.now().toString() }\n    ),\n    analyticsEvent = { analyticsEvent ->\n        when (analyticsEvent) {\n            is ComponentLifecycleAnalyticsEvent -> {\n                // Track component lifecycle (mount/unmount)\n                Log.d(\"Analytics\", \"Component ${analyticsEvent.eventType}: ${analyticsEvent.componentId}\")\n                analytics.track(analyticsEvent.eventName, analyticsEvent.toMap())\n            }\n            is ErrorTracker.ComponentErrorEvent -> {\n                // Log component errors for debugging\n                Log.e(\"Analytics\", \"Component error: ${analyticsEvent.message}\")\n                crashlytics.recordException(Exception(analyticsEvent.message))\n            }\n            is ErrorTracker.ComponentValidationEvent -> {\n                // Track validation events\n                analytics.track(\"component_validation\", mapOf(\n                    \"component_id\" to analyticsEvent.componentId,\n                    \"is_valid\" to analyticsEvent.isValid,\n                    \"validation_message\" to analyticsEvent.validationMessage\n                ))\n            }\n            else -> {\n                // Handle other analytics events\n                Log.d(\"Analytics\", \"Event: ${analyticsEvent.eventName}\")\n                analytics.track(analyticsEvent.eventName, analyticsEvent.toMap())\n            }\n        }\n    }\n)\n\nval pxpCheckout = PxpCheckout.builder()\n    .withConfig(sdkConfig)\n    .withContext(this)\n    .withDebugMode(true)\n    .build()\n","lang":"kotlin"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"available-analytics-events","__idx":3},"children":["Available analytics events"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Android SDK provides several types of analytics events:"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"component-lifecycle-events","__idx":4},"children":["Component lifecycle events"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Track when components are mounted and unmounted in your application:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","header":{"controls":{"copy":{}}},"source":"class ComponentLifecycleAnalyticsEvent(\n    val eventType: LifecycleEventType, // MOUNT or UNMOUNT\n    val componentId: String,\n    sessionId: String,\n    val componentType: String? = null\n) : BaseAnalyticsEvent(\"ComponentLifecycleEvent\", sessionId)\n","lang":"kotlin"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"component-error-events","__idx":5},"children":["Component error events"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Track errors that occur within components:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","header":{"controls":{"copy":{}}},"source":"class ComponentErrorEvent(\n    val code: String,\n    val message: String,\n    val componentId: String,\n    sessionId: String\n) : BaseAnalyticsEvent(\"ComponentErrorEvent\", sessionId)\n","lang":"kotlin"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"component-validation-events","__idx":6},"children":["Component validation events"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Track validation results for components:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","header":{"controls":{"copy":{}}},"source":"class ComponentValidationEvent(\n    val componentId: String,\n    val isValid: Boolean,\n    val validationMessage: String?,\n    sessionId: String\n) : BaseAnalyticsEvent(\"ComponentValidationEvent\", sessionId)\n","lang":"kotlin"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"comprehensive-analytics-implementation","__idx":7},"children":["Comprehensive analytics implementation"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Here's a comprehensive example showing how to handle the available analytics events:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","header":{"controls":{"copy":{}}},"source":"class AnalyticsManager {\n    \n    fun setupAnalyticsEventHandler(): (BaseAnalyticsEvent) -> Unit {\n        return { analyticsEvent ->\n            // Log all events for debugging (remove in production)\n            Log.d(\"Analytics\", \"Event: ${analyticsEvent.eventName} at ${analyticsEvent.timestamp}\")\n            \n            when (analyticsEvent) {\n                // Component lifecycle events\n                is ComponentLifecycleAnalyticsEvent -> {\n                    when (analyticsEvent.eventType) {\n                        LifecycleEventType.MOUNT -> {\n                            trackComponentMount(analyticsEvent)\n                        }\n                        LifecycleEventType.UNMOUNT -> {\n                            trackComponentUnmount(analyticsEvent)\n                        }\n                    }\n                }\n                \n                // Error tracking\n                is ErrorTracker.ComponentErrorEvent -> {\n                    trackComponentError(analyticsEvent)\n                    \n                    // Send to crash reporting\n                    crashlytics.recordException(Exception(analyticsEvent.message))\n                }\n                \n                // Validation tracking\n                is ErrorTracker.ComponentValidationEvent -> {\n                    trackValidationEvent(analyticsEvent)\n                }\n                \n                else -> {\n                    // Send all events to your analytics service\n                    sendToAnalyticsService(analyticsEvent)\n                }\n            }\n        }\n    }\n    \n    // Helper functions for tracking specific events\n    private fun trackComponentMount(event: ComponentLifecycleAnalyticsEvent) {\n        analytics.track(\"component_mounted\", mapOf(\n            \"component_id\" to event.componentId,\n            \"component_type\" to event.componentType,\n            \"session_id\" to event.sessionId,\n            \"timestamp\" to event.timestamp\n        ))\n    }\n    \n    private fun trackComponentUnmount(event: ComponentLifecycleAnalyticsEvent) {\n        analytics.track(\"component_unmounted\", mapOf(\n            \"component_id\" to event.componentId,\n            \"component_type\" to event.componentType,\n            \"session_id\" to event.sessionId,\n            \"timestamp\" to event.timestamp\n        ))\n    }\n    \n    private fun trackComponentError(event: ErrorTracker.ComponentErrorEvent) {\n        analytics.track(\"component_error\", mapOf(\n            \"component_id\" to event.componentId,\n            \"error_code\" to event.code,\n            \"error_message\" to event.message,\n            \"session_id\" to event.sessionId\n        ))\n    }\n    \n    private fun trackValidationEvent(event: ErrorTracker.ComponentValidationEvent) {\n        analytics.track(\"component_validation\", mapOf(\n            \"component_id\" to event.componentId,\n            \"is_valid\" to event.isValid,\n            \"validation_message\" to event.validationMessage,\n            \"session_id\" to event.sessionId\n        ))\n    }\n    \n    private fun sendToAnalyticsService(event: BaseAnalyticsEvent) {\n        // Send to your analytics service (Firebase, Mixpanel, etc.)\n        firebaseAnalytics.logEvent(event.eventName, Bundle().apply {\n            event.toMap().forEach { (key, value) ->\n                when (value) {\n                    is String -> putString(key, value)\n                    is Int -> putInt(key, value)\n                    is Long -> putLong(key, value)\n                    is Boolean -> putBoolean(key, value)\n                    is Double -> putDouble(key, value)\n                    else -> putString(key, value.toString())\n                }\n            }\n        })\n    }\n}\n","lang":"kotlin"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"integration-with-analytics-platforms","__idx":8},"children":["Integration with analytics platforms"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"firebase-analytics","__idx":9},"children":["Firebase Analytics"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","header":{"controls":{"copy":{}}},"source":"private fun logToFirebase(event: BaseAnalyticsEvent) {\n    val bundle = Bundle().apply {\n        event.toMap().forEach { (key, value) ->\n            when (value) {\n                is String -> putString(key, value)\n                is Int -> putInt(key, value)\n                is Long -> putLong(key, value)\n                is Boolean -> putBoolean(key, value)\n                is Double -> putDouble(key, value)\n                else -> putString(key, value.toString())\n            }\n        }\n    }\n    \n    firebaseAnalytics.logEvent(event.eventName, bundle)\n}\n","lang":"kotlin"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"custom-analytics-service","__idx":10},"children":["Custom analytics service"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","header":{"controls":{"copy":{}}},"source":"private fun logToCustomService(event: BaseAnalyticsEvent) {\n    val payload = JSONObject().apply {\n        put(\"event_name\", event.eventName)\n        put(\"session_id\", event.sessionId)\n        put(\"timestamp\", event.timestamp.time)\n        \n        event.toMap().forEach { (key, value) ->\n            put(key, value)\n        }\n    }\n    \n    // Send to your custom analytics endpoint\n    analyticsApiClient.logEvent(payload)\n}\n","lang":"kotlin"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"best-practices","__idx":11},"children":["Best practices"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"event-handling","__idx":12},"children":["Event handling"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Filter events:"]}," Only track events relevant to your business needs."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Error handling:"]}," Always wrap analytics calls in try-catch blocks."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Performance:"]}," Avoid blocking the main thread with analytics calls."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Privacy:"]}," Ensure compliance with data protection regulations."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"implementation-tips","__idx":13},"children":["Implementation tips"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","header":{"controls":{"copy":{}}},"source":"// Good: Non-blocking analytics\nanalyticsEvent = { event ->\n    GlobalScope.launch(Dispatchers.IO) {\n        try {\n            handleAnalyticsEvent(event)\n        } catch (e: Exception) {\n            Log.e(\"Analytics\", \"Failed to track event\", e)\n        }\n    }\n}\n\n// Good: Selective event tracking\nanalyticsEvent = { event ->\n    when (event) {\n        is ComponentLifecycleAnalyticsEvent -> {\n            // Only track lifecycle for specific components\n            if (event.componentType in criticalComponents) {\n                trackEvent(event)\n            }\n        }\n        is ErrorTracker.ComponentErrorEvent -> {\n            // Always track errors\n            trackEvent(event)\n        }\n        // Ignore other events\n    }\n}\n","lang":"kotlin"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"privacy-considerations","__idx":14},"children":["Privacy considerations"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Always obtain user consent before collecting analytics data."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Anonymise sensitive information in event payloads."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Provide opt-out mechanisms for analytics tracking."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Comply with GDPR, CCPA, and other relevant regulations."]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","header":{"controls":{"copy":{}}},"source":"// Example: Privacy-aware analytics\nanalyticsEvent = { event ->\n    if (userHasConsentedToAnalytics()) {\n        val sanitizedEvent = sanitizeEventData(event)\n        trackEvent(sanitizedEvent)\n    }\n}\n\nprivate fun sanitizeEventData(event: BaseAnalyticsEvent): BaseAnalyticsEvent {\n    // Remove or hash sensitive data\n    val sanitizedMap = event.toMap().filterKeys { key ->\n        key !in sensitiveDataKeys\n    }\n    \n    return event // Return sanitised version\n}\n","lang":"kotlin"},"children":[]}]},"headings":[{"value":"Analytics","id":"analytics","depth":1},{"value":"Overview","id":"overview","depth":2},{"value":"Consume an event","id":"consume-an-event","depth":2},{"value":"Available analytics events","id":"available-analytics-events","depth":2},{"value":"Component lifecycle events","id":"component-lifecycle-events","depth":3},{"value":"Component error events","id":"component-error-events","depth":3},{"value":"Component validation events","id":"component-validation-events","depth":3},{"value":"Comprehensive analytics implementation","id":"comprehensive-analytics-implementation","depth":2},{"value":"Integration with analytics platforms","id":"integration-with-analytics-platforms","depth":2},{"value":"Firebase Analytics","id":"firebase-analytics","depth":3},{"value":"Custom analytics service","id":"custom-analytics-service","depth":3},{"value":"Best practices","id":"best-practices","depth":2},{"value":"Event handling","id":"event-handling","depth":3},{"value":"Implementation tips","id":"implementation-tips","depth":3},{"value":"Privacy considerations","id":"privacy-considerations","depth":3}],"frontmatter":{"seo":{"title":"Analytics"}},"lastModified":"2026-04-08T14:46:04.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/guides/checkout/components/android/card/analytics","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}