Eventos automáticos — qué trae out of the box

Firebase Analytics registra automáticamente ciertos eventos sin que escribas código:

  • first_open — primera vez que se abre la app
  • app_update — cuando el usuario actualiza
  • session_start — inicio de sesión (app en foreground)
  • screen_view — cambio de pantalla (si usás Navigation Component)
  • app_exception — crashes (integración con Crashlytics)
  • in_app_purchase — compras dentro de la app

Eventos custom

Los eventos custom son la base del análisis de comportamiento. La clave es nombrarlos de forma consistente y significativa:

// Obtener la instancia de Analytics
val analytics = Firebase.analytics

// Logguear un evento simple
analytics.logEvent("boton_buscar_tapeado", null)

// Con parámetros — mucho más útil
analytics.logEvent("producto_visto") {
    param("producto_id", producto.id.toString())
    param("producto_nombre", producto.nombre)
    param("categoria", producto.categoria)
    param("precio", producto.precio)
}

analytics.logEvent("producto_agregado_carrito") {
    param("producto_id", producto.id.toString())
    param("cantidad", cantidad.toLong())
    param(FirebaseAnalytics.Param.VALUE, producto.precio)
    param(FirebaseAnalytics.Param.CURRENCY, "ARS")
}

// Evento de conversión — completar una compra
analytics.logEvent(FirebaseAnalytics.Event.PURCHASE) {
    param(FirebaseAnalytics.Param.TRANSACTION_ID, pedido.id)
    param(FirebaseAnalytics.Param.VALUE, pedido.total)
    param(FirebaseAnalytics.Param.CURRENCY, "ARS")
    param(FirebaseAnalytics.Param.ITEMS, pedido.items.map { item ->
        Bundle().apply {
            putString(FirebaseAnalytics.Param.ITEM_ID, item.id.toString())
            putString(FirebaseAnalytics.Param.ITEM_NAME, item.nombre)
            putDouble(FirebaseAnalytics.Param.PRICE, item.precio)
        }
    }.toTypedArray())
}

Usá los eventos predefinidos de Firebase cuando puedasFirebase tiene constantes predefinidas en FirebaseAnalytics.Event para ecommerce, onboarding, search y más. Usarlos permite que Google Analytics interprete el funnel automáticamente en los reportes de conversión.

Parámetros — límites a tener en cuenta

// Límites de Firebase Analytics:
// - Nombre del evento: 40 caracteres máximo, snake_case
// - Parámetros por evento: 25 máximo
// - Nombre del parámetro: 40 caracteres
// - Valor del parámetro string: 100 caracteres
// - Eventos custom reportables en la consola: 300 únicos por app

// Centralizar el tracking en una clase propia — evita magic strings
object Analytics {
    private val firebase = Firebase.analytics

    fun productViewed(producto: Producto) {
        firebase.logEvent("product_viewed") {
            param("id", producto.id.toString())
            param("name", producto.nombre.take(100))
            param("category", producto.categoria)
        }
    }

    fun checkoutStarted(itemCount: Int, total: Double) {
        firebase.logEvent("checkout_started") {
            param("item_count", itemCount.toLong())
            param("total", total)
        }
    }

    fun searchPerformed(query: String, resultCount: Int) {
        firebase.logEvent("search") {
            param(FirebaseAnalytics.Param.SEARCH_TERM, query.take(100))
            param("result_count", resultCount.toLong())
        }
    }
}

User properties

Las user properties son atributos del usuario que se asocian a todos sus eventos futuros. Permiten segmentar el análisis:

// Setear user properties cuando el usuario configura su cuenta
Firebase.analytics.setUserProperty("plan", "premium")
Firebase.analytics.setUserProperty("idioma_preferido", "es")
Firebase.analytics.setUserProperty("region", "AR")
Firebase.analytics.setUserProperty("notificaciones", "habilitadas")

// Límites: 25 user properties por app, nombres de 24 chars, valores de 36 chars

// No incluir PII (información de identificación personal)
// Mal: setUserProperty("email", usuario.email)
// Bien: setUserProperty("tipo_usuario", if (usuario.esAdmin) "admin" else "regular")

Screen tracking con Navigation Component

Navigation Component reporta screen views automáticamente si el fragmento tiene un label en el NavGraph. Para personalizar:

// Reportar screen views manualmente (si no usás Navigation Component)
Firebase.analytics.logEvent(FirebaseAnalytics.Event.SCREEN_VIEW) {
    param(FirebaseAnalytics.Param.SCREEN_NAME, "Detalle de Producto")
    param(FirebaseAnalytics.Param.SCREEN_CLASS, "DetalleFragment")
}

// Con Navigation Component — automático si el label está en el NavGraph:
// <fragment android:label="Detalle de Producto" ... />

// O configurar manualmente el NavController:
navController.addOnDestinationChangedListener { _, destination, _ ->
    Firebase.analytics.logEvent(FirebaseAnalytics.Event.SCREEN_VIEW) {
        param(FirebaseAnalytics.Param.SCREEN_NAME, destination.label.toString())
    }
}

DebugView — verificar eventos en tiempo real

# Habilitar modo debug en el dispositivo conectado:
adb shell setprop debug.firebase.analytics.app ar.pensa.miapp

# Los eventos aparecen en Firebase Console → Analytics → DebugView
# con ~1 segundo de delay en lugar de las 24 horas habituales

# Deshabilitar:
adb shell setprop debug.firebase.analytics.app .none.

Los eventos normales tienen 24-48h de delayEn producción, los eventos de Analytics se procesan con delay. DebugView es la única forma de verificar en tiempo real que los eventos se están enviando correctamente durante el desarrollo.

Exportación a BigQuery

Firebase Analytics exporta todos los eventos crudos a BigQuery, lo que permite análisis avanzados que la consola no ofrece:

# Habilitar en Firebase Console → Analytics → BigQuery linking

# Una vez habilitado, podés hacer queries como:
# ¿Cuántos usuarios completaron el checkout después de ver más de 3 productos?
SELECT
  COUNT(DISTINCT user_pseudo_id) AS usuarios
FROM
  `proyecto.analytics_XXXXXXXX.events_*`
WHERE
  event_name = 'purchase'
  AND user_pseudo_id IN (
    SELECT user_pseudo_id
    FROM `proyecto.analytics_XXXXXXXX.events_*`
    WHERE event_name = 'product_viewed'
    GROUP BY user_pseudo_id
    HAVING COUNT(*) >= 3
  )
  AND _TABLE_SUFFIX BETWEEN '20250101' AND '20251231'