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 evento | Android | iOS | React Native | Flutter | Paso del embudo |
|---|---|---|---|---|---|
onboarding_step | onboardingStep(step, index, flow) | onboardingStep(_:index:flow:) | onboardingStep(step, { index, flow }) | onboardingStep(step, index:, flow:) | Pestaña Onboarding, no es un paso |
onboarding_skipped | onboardingSkipped(step) | onboardingSkipped(_:) | onboardingSkipped(step) | onboardingSkipped(step) | Pestaña Onboarding, no es un paso |
onboarding_completed | onboardingCompleted() | onboardingCompleted() | onboardingCompleted() | onboardingCompleted() | Onboarding |
paywall_viewed | paywallViewed(placement) | paywallViewed(placement:) | paywallViewed(placement) | paywallViewed(placement:) | Paywall |
paywall_skipped | paywallSkipped(placement) | paywallSkipped(placement:) | paywallSkipped(placement) | paywallSkipped(placement:) | Si lo añades |
sign_up | signUp(method) | signUp(method:) | signUp(method) | signUp(method:) | Registro |
sign_in | signIn(method) | signIn(method:) | signIn(method) | signIn(method:) | Inició sesión |
sign_up_skipped | signUpSkipped() | signUpSkipped() | signUpSkipped() | signUpSkipped() | Siguió como invitado |
trial_started | trialStarted(productId) | trialStarted(productId:) | trialStarted(productId) | trialStarted(productId:) | Prueba |
purchase | purchase(amount, currency, productId) | purchase(amount:currency:productId:) | purchase(amount, currency, productId) | purchase(amount, currency, productId:) | Pagó |
purchase_cancelled | purchaseCancelled(productId) | purchaseCancelled(productId:) | purchaseCancelled(productId) | purchaseCancelled(productId:) | Si lo añades |
purchase_failed | purchaseFailed(productId, reason) | purchaseFailed(productId:reason:) | purchaseFailed(productId, reason) | purchaseFailed(productId:reason:) | Si lo añades |
| los tuyos | track(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.
placementindica qué paywall:onboarding,launch,feature_gate,settingso un nombre tuyo. Se envía como la propiedadplacement. Embudo → Dividir por Paywall muestra el embudo propio de cada ubicación.methodindica cómo se creó la cuenta:email,apple,google. Se envía comomethod.productIdes el ID de producto de tu tienda. Se envía comoproduct_id.purchaselleva el precio como decimal (AndroidBigDecimal, iOSDecimal, 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
| Evento | Envíalo |
|---|---|
onboarding_step | Cuando aparece cada pantalla de onboarding, no cuando se toca su botón. Consulta Pantallas de onboarding. |
onboarding_skipped | Cuando alguien toca Saltar, con la pantalla en la que lo tocó. |
onboarding_completed | Cuando termina la última pregunta o pantalla de onboarding, antes de cualquier paywall o registro que le siga. |
paywall_viewed | Cada 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_skipped | Cuando 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_up | Justo después de crear una cuenta nueva. No cuando alguien inicia sesión en una cuenta que ya tenía. |
sign_in | Cuando 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_skipped | Cuando 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, purchase | Cuando la tienda lo confirma. Omite ambos si RevenueCat está conectado. |
purchase_cancelled | Cuando alguien cierra la hoja de compra de la tienda sin pagar. |
purchase_failed | Cuando 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);
stepes 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/paywallSkippedysignUp. Un paywall cerrado sin comprar espaywallSkipped, nuncaonboardingSkipped. onboardingCompletedva 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
stepni enflow. 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
onboardingCompletedsigue 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
onboardingCompletedenviado 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ía | signIn(method) |
| Eligió seguir sin cuenta | signUpSkipped() (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 ajustes | signUp(method): cuenta para el paso de registro del embudo cuando sea que ocurra |
| Inició sesión con una contraseña restablecida | signIn(method): la cuenta ya existía |
| Intentó registrarse con un email ya registrado y luego inició sesión | signIn(method) |
| Cerró sesión | setUserId(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.
| Evento | Cuándo |
|---|---|
first_open | Una vez por instalación, en el primer arranque. Esta es la instalación. |
session_start | Al arrancar, o cuando la app vuelve tras 30 minutos o más en segundo plano. |
app_background | Cuando 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_upoexport.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.
| Android | iOS | React Native | Flutter | Qué 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() | installId | getInstallId() | 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.