Referencia de eventos

Cada llamada que ofrece el SDK, en cada plataforma, con el nombre del evento que llega a Unolink. Los embudos son por app: crea tantos como quieras en Embudo → Nuevo embudo y elige cualquiera de estos nombres como pasos, incluidos los tuyos. Cada paso cuenta las instalaciones que enviaron el evento en cualquier momento, así que las apps cuyas pantallas llegan en otro orden también tienen un embudo con sentido. Activa Contar pasos solo en este orden en un embudo para contar un paso solo cuando ocurre después del anterior.

Eventos estándar

Nombre del eventoAndroidiOSReact NativeFlutterPaso del embudo
onboarding_steponboardingStep(step, index, flow)onboardingStep(_:index:flow:)onboardingStep(step, { index, flow })onboardingStep(step, index:, flow:)Pestaña Onboarding, no es un paso
onboarding_skippedonboardingSkipped(step)onboardingSkipped(_:)onboardingSkipped(step)onboardingSkipped(step)Pestaña Onboarding, no es un paso
onboarding_completedonboardingCompleted()onboardingCompleted()onboardingCompleted()onboardingCompleted()Onboarding
paywall_viewedpaywallViewed(placement)paywallViewed(placement:)paywallViewed(placement)paywallViewed(placement:)Paywall
paywall_skippedpaywallSkipped(placement)paywallSkipped(placement:)paywallSkipped(placement)paywallSkipped(placement:)Si lo añades
sign_upsignUp(method)signUp(method:)signUp(method)signUp(method:)Registro
sign_insignIn(method)signIn(method:)signIn(method)signIn(method:)Inició sesión
sign_up_skippedsignUpSkipped()signUpSkipped()signUpSkipped()signUpSkipped()Siguió como invitado
trial_startedtrialStarted(productId)trialStarted(productId:)trialStarted(productId)trialStarted(productId:)Prueba
purchasepurchase(amount, currency, productId)purchase(amount:currency:productId:)purchase(amount, currency, productId)purchase(amount, currency, productId:)Pagó
purchase_cancelledpurchaseCancelled(productId)purchaseCancelled(productId:)purchaseCancelled(productId)purchaseCancelled(productId:)Si lo añades
purchase_failedpurchaseFailed(productId, reason)purchaseFailed(productId:reason:)purchaseFailed(productId, reason)purchaseFailed(productId:reason:)Si lo añades
los tuyostrack(name, properties)track(_:properties:)track(name, properties)track(name, properties)Si lo añades

Todos los argumentos son opcionales, salvo el importe y la moneda de una compra, y todas las llamadas aceptan además propiedades extra.

  • placement indica qué paywall: onboarding, launch, feature_gate, settings o un nombre tuyo. Se envía como la propiedad placement. Embudo → Dividir por Paywall muestra el embudo propio de cada ubicación.
  • method indica cómo se creó la cuenta: email, apple, google. Se envía como method.
  • productId es el ID de producto de tu tienda. Se envía como product_id.
  • purchase lleva el precio como decimal (Android BigDecimal, iOS Decimal, React Native y Flutter una cadena como "49.99") y un código de moneda de tres letras. Los precios nunca se redondean.

Cuándo enviar cada uno

EventoEnvíalo
onboarding_stepCuando aparece cada pantalla de onboarding, no cuando se toca su botón. Consulta Pantallas de onboarding.
onboarding_skippedCuando alguien toca Saltar, con la pantalla en la que lo tocó.
onboarding_completedCuando termina la última pregunta o pantalla de onboarding, antes de cualquier paywall o registro que le siga.
paywall_viewedCada vez que aparece un paywall, con su ubicación. No para suscriptores: si tu app no les muestra ningún paywall, no envíes nada.
paywall_skippedCuando alguien cierra un paywall sin comprar: su botón de cerrar, deslizar hacia abajo o el gesto de volver. No mientras una compra sigue esperando aprobación (Ask to Buy, la verificación 3-D Secure de un banco).
sign_upJusto después de crear una cuenta nueva. No cuando alguien inicia sesión en una cuenta que ya tenía.
sign_inCuando alguien inicia sesión en una cuenta que ya tenía: un usuario que vuelve (una reinstalación, un teléfono nuevo, después de cerrar sesión). Recorridos lo etiqueta como recurrente y permite filtrar por ello. SDK 0.3.0 o posterior.
sign_up_skippedCuando alguien elige seguir sin cuenta en una pantalla de registro (modo invitado). Recorridos lo etiqueta como invitado, y un embudo con un paso de registro lo muestra como alguien que tomó otro camino, no como un abandono.
trial_started, purchaseCuando la tienda lo confirma. Omite ambos si RevenueCat está conectado.
purchase_cancelledCuando alguien cierra la hoja de compra de la tienda sin pagar.
purchase_failedCuando el pago falla. reason es una descripción breve tuya.

Pantallas de onboarding

La pestaña Onboarding muestra en qué pantalla se va la gente y cuánto tarda cada una. Envía una llamada por pantalla cuando aparece, una al tocar Saltar y onboardingCompleted al final:

// iOS (SwiftUI)
GoalScreen().onAppear { Unolink.onboardingStep("goal", index: 0) }
Button("Skip") { Unolink.onboardingSkipped("goal") }
// Android (Compose)
LaunchedEffect(Unit) { Unolink.onboardingStep("goal", index = 0) }
// React Native
useOnboardingStep("goal", { index: 0 })   // or Unolink.onboardingStep("goal", { index: 0 }) in a useEffect
// Flutter, in initState
Unolink.onboardingStep('goal', index: 0);
  • step es un ID fijo por pantalla: goal, notifications, plan. Mismas reglas que los nombres de eventos. Da a cada rama su propio ID. Un paginador o un onboarding de una sola pantalla envía uno por página.
  • Solo las pantallas propias del onboarding. El paywall y la pantalla de registro no son pantallas de onboarding, aunque sean pasos del mismo flujo: envían paywallViewed / paywallSkipped y signUp. Un paywall cerrado sin comprar es paywallSkipped, nunca onboardingSkipped.
  • onboardingCompleted va justo después de la última pantalla de onboarding, antes del paywall o el registro que le sigue, aunque la cuenta se cree al final del flujo. Quien ve el paywall ya terminó el onboarding.
  • index (opcional) es la posición de la pantalla, de 0 a 999. Con él, la pestaña puede mostrar la pantalla más lejana alcanzada además de la última vista.
  • flow (opcional) da nombre al onboarding cuando tienes más de uno: una variante A/B, una versión nueva, un re-onboarding. Cada flujo tiene su propia lista.
  • Estas son las únicas propiedades que aceptan estos eventos. Cualquier otra hace que el evento se rechace.
  • Nunca pongas datos de usuario en step ni en flow. Son nombres de pantallas que se muestran en el panel.
  • Son gratis. Un onboarding cuesta un evento, su onboardingCompleted, tenga las pantallas que tenga. Cada instalación puede enviar hasta 100, para hasta 40 pantallas distintas.
  • Volver atrás, cerrar la app a la fuerza y reabrirla no requieren nada especial. Unolink calcula el estado de cada instalación: completado, saltado en una pantalla, se fue en su última pantalla (nada nuevo durante 24 horas) o sigue en ello. Una app que solo envía onboardingCompleted sigue mostrando cuántos lo completaron; hacen falta las pantallas para ver dónde se va la gente. Las instalaciones que no enviaron ningún evento de onboarding se muestran como no medidas, nunca como abandono.

Estas llamadas necesitan el SDK 0.2.0 o posterior. En versiones anteriores, track("onboarding_step", { step: "goal" }) envía el mismo evento.

Cómo se cuentan los eventos

  • Los embudos cuentan personas, no eventos. Cada paso cuenta las instalaciones que enviaron el evento al menos una vez, así que un paywall visto cinco veces, o onboardingCompleted enviado de nuevo después de volver atrás, cuenta una vez por persona.
  • En cualquier orden, por defecto. Un paso cuenta siempre que haya ocurrido. Activa Contar pasos solo en este orden en un embudo cuando el orden importa; entonces un paso solo cuenta en el momento del anterior o después.
  • Todos los eventos siguen contando para tu plan. Las repeticiones se registran (Recorridos muestra cada una) y cada una cuenta para el límite mensual, salvo los gratuitos de abajo.
  • Las horas son las del teléfono, salvo que tengan más de 7 días de antigüedad o estén más de una hora en el futuro; entonces se usa la hora en que llegó.

Invitados y cuentas

Informa del propio ID de usuario de app de RevenueCat cada vez que cambie: para un invitado, el ID anónimo de RevenueCat, y luego el ID de la cuenta que crea o en la que inicia sesión. connectRevenueCat (SDK 0.3.2 o posterior) lo hace por ti; si no, llama a setUserId con él. Cuenta cada ID que haya informado una instalación, así que una compra hecha como invitado, sus renovaciones y las compras que RevenueCat mueva después a otra cuenta se quedan todas con la instalación que compró.

Qué pasóEnvía
Creó una cuenta nueva (email, Apple, Google, también después de ser invitado)signUp(method)
Inició sesión en una cuenta que ya teníasignIn(method)
Eligió seguir sin cuentasignUpSkipped() (SDK 0.3.2+, React Native 0.3.1+; SDK anteriores: track("sign_up_skipped"))
Un invitado que se registra más tarde, desde los ajustessignUp(method): cuenta para el paso de registro del embudo cuando sea que ocurra
Inició sesión con una contraseña restablecidasignIn(method): la cuenta ya existía
Intentó registrarse con un email ya registrado y luego inició sesiónsignIn(method)
Cerró sesiónsetUserId(null)

¿Nuevo o recurrente con Apple o Google? El resultado del inicio de sesión suele decirlo. Firebase: additionalUserInfo.isNewUser. Supabase: un usuario cuyo created_at está a pocos segundos de last_sign_in_at se acaba de crear.

Eventos automáticos

El SDK los envía solo. Son gratis: nunca cuentan para tu plan.

EventoCuándo
first_openUna vez por instalación, en el primer arranque. Esta es la instalación.
session_startAl arrancar, o cuando la app vuelve tras 30 minutos o más en segundo plano.
app_backgroundCuando la app pasa a segundo plano.

Eventos personalizados

track(name, properties) envía cualquier otra cosa, y los eventos personalizados también pueden ser pasos del embudo.

  • Nombres: empiezan por una letra, seguida de letras, dígitos, _ y ., como máximo 64 caracteres. level_up o export.pdf. Un nombre no válido se descarta y se registra en el log.
  • Propiedades: como máximo 20 por evento. Los valores son cadenas (hasta 200 caracteres), números o booleanos, 4 KB en total.
  • Nunca pongas nombres, emails, números de teléfono ni otros datos personales en las propiedades.

Estado del usuario y de la app

Estas no envían ningún evento propio.

AndroidiOSReact NativeFlutterQué hace
setUserId(id)setUserId(_:)setUserId(id)setUserId(id)El ID de usuario de tu app; con RevenueCat, el propio ID de usuario de app de RevenueCat. Solo se guarda como hash unidireccional por app. Vuelve a llamarlo cada vez que cambie (invitado → cuenta): cuenta cada ID. Pasa null (nil) al cerrar sesión. Como máximo 256 caracteres.
connectRevenueCat { }connectRevenueCat { }connectRevenueCat(Purchases)connectRevenueCat(…)Mantiene el ID de usuario igual al ID de usuario de app de RevenueCat, invitados incluidos (SDK 0.3.2+). Consulta RevenueCat. Usa esto o setUserId, no los dos.
revenueCatUserChanged()revenueCatUserChanged()Envía de inmediato el nuevo ID de RevenueCat: llámalo después de logIn y logOut (SDK 0.3.2+). React Native y Flutter lo detectan por sí solos.
setDeferredDeepLinkListener { }onDeferredDeepLink(_:)addDeferredDeepLinkListener(fn)setDeferredDeepLinkListener(fn)Se llama una vez por instalación que vino de un enlace de Unolink. En la práctica, solo en Android.
getPendingDeferredDeepLink(), consumeDeferredDeepLink()getPendingDeferredDeepLink(), consumeDeferredDeepLink()getPendingDeferredDeepLink(), consumeDeferredDeepLink()El enlace que hay que abrir cuando terminan el onboarding o el inicio de sesión, y luego marcar como abierto. Espera hasta que se consume, aunque la app se cierre entretanto, hasta 30 días (SDK 0.3.3+; React Native 0.3.1+ lo conservaba durante un arranque).
isConfigured()Si configure se ha ejecutado con una clave (React Native 0.3.1+).
getInstallId()installIdgetInstallId()getInstallId()El ID aleatorio de esta instalación.
flush()flush()flush()flush()Envía ya los eventos en cola.
setEnabled(bool)setEnabled(_:)setEnabled(bool)setEnabled(bool)Desactiva la medición (los eventos en cola se eliminan) o la vuelve a activar.

RevenueCat

Cuando RevenueCat está conectado, es la fuente de verdad para el dinero. Informa de pruebas, compras, renovaciones, cancelaciones, reembolsos, vencimientos y problemas de cobro, incluso cuando la app no está abierta. Las llamadas de la app a purchase y trialStarted se ignoran, así que nada cuenta dos veces. Tu app solo necesita connectRevenueCat (o setUserId con el ID de RevenueCat).

Cuota del plan

El SDK forma parte de los planes Pro y Studio. Cada evento que envía tu app cuenta para el límite mensual de eventos: 1 millón en Pro, 5 millones en Studio. Eso incluye los eventos estándar de arriba y los personalizados. Los eventos automáticos (first_open, session_start, app_background) y las pantallas de onboarding (onboarding_step, onboarding_skipped) son gratis, igual que las compras, renovaciones y reembolsos que llegan desde RevenueCat. Pasarse del límite no bloquea nada; por encima del doble del límite, los eventos personalizados se rechazan hasta el mes siguiente, mientras que los eventos estándar, de onboarding y automáticos siempre se conservan.