Começar

Referência de eventos

Cada chamada que o SDK oferece, em cada plataforma, com o nome do evento que chega ao Unolink. Os funis são por app: crie quantos quiser em Funil → Novo funil e escolha qualquer um destes nomes como etapa, incluindo os seus. Cada etapa conta as instalações que enviaram o evento em qualquer momento, então apps cujas telas vêm em outra ordem também têm um funil que faz sentido. Ative Contar etapas só nesta ordem em um funil para contar uma etapa só quando ela acontece depois da anterior.

Eventos padrão

Nome do eventoAndroidiOSReact NativeFlutterEtapa do funil
onboarding_steponboardingStep(step, index, flow)onboardingStep(_:index:flow:)onboardingStep(step, { index, flow })onboardingStep(step, index:, flow:)Aba Onboarding, não é etapa
onboarding_skippedonboardingSkipped(step)onboardingSkipped(_:)onboardingSkipped(step)onboardingSkipped(step)Aba Onboarding, não é etapa
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:)Se você adicionar
sign_upsignUp(method)signUp(method:)signUp(method)signUp(method:)Cadastro
sign_insignIn(method)signIn(method:)signIn(method)signIn(method:)Entrou
sign_up_skippedsignUpSkipped()signUpSkipped()signUpSkipped()signUpSkipped()Seguiu como convidado
trial_startedtrialStarted(productId)trialStarted(productId:)trialStarted(productId)trialStarted(productId:)Teste grátis
purchasepurchase(amount, currency, productId)purchase(amount:currency:productId:)purchase(amount, currency, productId)purchase(amount, currency, productId:)Pagou
purchase_cancelledpurchaseCancelled(productId)purchaseCancelled(productId:)purchaseCancelled(productId)purchaseCancelled(productId:)Se você adicionar
purchase_failedpurchaseFailed(productId, reason)purchaseFailed(productId:reason:)purchaseFailed(productId, reason)purchaseFailed(productId:reason:)Se você adicionar
os seustrack(name, properties)track(_:properties:)track(name, properties)track(name, properties)Se você adicionar

Todo argumento, exceto o valor e a moeda de uma compra, é opcional, e toda chamada também aceita propriedades extras.

  • placement diz qual paywall: onboarding, launch, feature_gate, settings ou um nome seu. Ele é enviado como a propriedade placement. Funil → dividir por Paywall mostra o funil de cada posicionamento.
  • method diz como a conta foi criada: email, apple, google. Enviado como method.
  • productId é o ID do produto na sua loja. Enviado como product_id.
  • purchase leva o preço como decimal (Android BigDecimal, iOS Decimal, React Native e Flutter uma string como "49.99") e um código de moeda de três letras. Os preços nunca são arredondados.

Quando enviar cada um

EventoEnvie
onboarding_stepQuando cada tela de onboarding aparece, não quando o botão dela é tocado. Veja Telas de onboarding.
onboarding_skippedQuando alguém toca em Pular, com a tela em que tocou.
onboarding_completedQuando a última pergunta ou tela de onboarding termina, antes de qualquer paywall ou cadastro que venha depois.
paywall_viewedToda vez que um paywall aparece, com o posicionamento dele. Não para assinantes: se o seu app não mostra paywall para eles, não envie nada.
paywall_skippedQuando alguém fecha um paywall sem comprar: pelo botão de fechar, deslizando para baixo ou com o gesto de voltar. Não enquanto uma compra ainda espera aprovação (Ask to Buy, a verificação 3-D Secure de um banco).
sign_upLogo após uma conta nova ser criada. Não quando alguém entra em uma conta que já tinha.
sign_inQuando alguém entra em uma conta que já tinha: um usuário que volta (uma reinstalação, um celular novo, depois de sair). Jornadas marca essas pessoas como recorrente e permite filtrar por isso. SDK 0.3.0 ou posterior.
sign_up_skippedQuando alguém escolhe continuar sem conta em uma tela de cadastro (modo convidado). Jornadas marca essas pessoas como convidado, e um funil com etapa de cadastro as mostra seguindo outro caminho, não como abandono.
trial_started, purchaseQuando a loja confirma. Pule os dois se o RevenueCat estiver conectado.
purchase_cancelledQuando alguém fecha a tela de compra da loja sem pagar.
purchase_failedQuando o pagamento falha. reason é uma descrição curta sua.

Telas de onboarding

A aba Onboarding mostra em qual tela as pessoas saem e quanto tempo cada uma leva. Envie uma chamada por tela quando ela aparece, uma ao tocar em Pular, e onboardingCompleted no 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 é um ID fixo por tela: goal, notifications, plan. As mesmas regras dos nomes de eventos. Dê às ramificações IDs próprios. Um pager ou um onboarding de tela única envia um por página.
  • Só as telas do próprio onboarding. O paywall e a tela de cadastro não são telas de onboarding, mesmo quando são etapas do mesmo fluxo: elas enviam paywallViewed / paywallSkipped e signUp. Um paywall fechado sem comprar é paywallSkipped, nunca onboardingSkipped.
  • onboardingCompleted vem logo após a última tela de onboarding, antes do paywall ou do cadastro que vem depois, mesmo quando a conta é criada no fim do fluxo. Quem vê o paywall já terminou o onboarding.
  • index (opcional) é a posição da tela, de 0 a 999. Com ele, a aba pode mostrar a tela mais avançada alcançada, além da última vista.
  • flow (opcional) dá nome ao onboarding, quando você tem mais de um: uma variante de teste A/B, uma nova versão, um novo onboarding para quem volta. Cada fluxo tem a própria lista.
  • Estas são as únicas propriedades que esses eventos aceitam. Qualquer outra faz o evento ser rejeitado.
  • Nunca coloque dados de usuários em step ou flow. Eles são nomes de telas, mostrados no painel.
  • Eles são grátis. Um onboarding custa um evento, o onboardingCompleted dele, não importa quantas telas tenha. Cada instalação pode enviar até 100 deles, para até 40 telas diferentes.
  • Voltar de tela, fechar o app à força e abrir de novo não exigem nada especial. O Unolink calcula o status de cada instalação: concluiu, pulou em uma tela, saiu na última tela (nada novo por 24 horas) ou em andamento. Um app que envia só onboardingCompleted ainda mostra quantas pessoas concluíram; as telas são necessárias para ver onde as pessoas saem. Instalações que não enviaram nenhum evento de onboarding aparecem como não rastreadas, nunca como abandono.

Essas chamadas precisam do SDK 0.2.0 ou posterior. Em versões mais antigas, track("onboarding_step", { step: "goal" }) envia o mesmo evento.

Como os eventos são contados

  • Os funis contam pessoas, não eventos. Cada etapa conta as instalações que enviaram o evento pelo menos uma vez, então um paywall visto cinco vezes, ou um onboardingCompleted enviado de novo depois de voltar, conta uma vez por pessoa.
  • Qualquer ordem, por padrão. Uma etapa conta sempre que aconteceu. Ative Contar etapas só nesta ordem em um funil quando a ordem importa; aí uma etapa só conta se acontecer junto com a anterior ou depois dela.
  • Todo evento continua contando no seu plano. As repetições são registradas (Jornadas mostra cada uma) e cada uma conta na cota mensal, exceto os eventos grátis abaixo.
  • Os horários são os do celular, a menos que tenham mais de 7 dias ou estejam mais de uma hora no futuro; nesse caso, vale o horário em que o evento chegou.

Convidados e contas

Informe o próprio app user ID do RevenueCat toda vez que ele mudar: para um convidado, o ID anônimo do RevenueCat, e depois o ID da conta que a pessoa cria ou na qual entra. connectRevenueCat (SDK 0.3.2 ou posterior) faz isso por você; senão, chame setUserId com ele. Todo ID que uma instalação reportou conta, então uma compra feita como convidado, as renovações dela e as compras que o RevenueCat depois move para outra conta ficam todas com a instalação que comprou.

O que aconteceuEnvie
Criou uma conta nova (e-mail, Apple, Google, também depois de ser convidado)signUp(method)
Entrou em uma conta que já tinhasignIn(method)
Escolheu continuar sem contasignUpSkipped() (SDK 0.3.2+, React Native 0.3.1+; SDKs mais antigos: track("sign_up_skipped"))
Um convidado que se cadastra depois, pelas configuraçõessignUp(method): conta para a etapa de cadastro do funil sempre que acontecer
Entrou com uma senha redefinidasignIn(method): a conta já existia
Tentou se cadastrar com um e-mail já registrado e depois entrousignIn(method)
SaiusetUserId(null)

Novo ou recorrente com Apple ou Google? O resultado do login geralmente diz. Firebase: additionalUserInfo.isNewUser. Supabase: um usuário cujo created_at está a poucos segundos de last_sign_in_at acabou de ser criado.

Eventos automáticos

O próprio SDK envia estes. Eles são grátis: nunca contam no seu plano.

EventoQuando
first_openUma vez por instalação, na primeira abertura. Esta é a instalação.
session_startNa abertura, ou quando o app volta depois de 30 minutos ou mais em segundo plano.
app_backgroundQuando o app vai para segundo plano.

Eventos personalizados

track(name, properties) envia qualquer outra coisa, e eventos personalizados também podem ser etapas do funil.

  • Nomes: começam com uma letra, seguida de letras, dígitos, _ e ., com no máximo 64 caracteres. level_up ou export.pdf. Um nome inválido é descartado e registrado no log.
  • Propriedades: no máximo 20 por evento. Os valores são strings (até 200 caracteres), números ou booleanos, 4 KB no total.
  • Nunca coloque nomes, e-mails, números de telefone ou outros dados pessoais nas propriedades.

Estado do usuário e do app

Estas chamadas não enviam nenhum evento próprio.

AndroidiOSReact NativeFlutterO que faz
setUserId(id)setUserId(_:)setUserId(id)setUserId(id)O ID de usuário do seu app; com RevenueCat, o próprio app user ID do RevenueCat. Guardado só como um hash unidirecional por app. Chame de novo sempre que ele mudar (convidado → conta): todo ID conta. Passe null (nil) ao sair. No máximo 256 caracteres.
connectRevenueCat { }connectRevenueCat { }connectRevenueCat(Purchases)connectRevenueCat(…)Mantém o ID de usuário igual ao app user ID do RevenueCat, convidados incluídos (SDK 0.3.2+). Veja RevenueCat. Use este ou setUserId, não os dois.
revenueCatUserChanged()revenueCatUserChanged()Envia na hora o novo ID do RevenueCat: chame depois de logIn e logOut (SDK 0.3.2+). O React Native e o Flutter percebem sozinhos.
setDeferredDeepLinkListener { }onDeferredDeepLink(_:)addDeferredDeepLinkListener(fn)setDeferredDeepLinkListener(fn)Chamado uma vez por instalação que veio de um link do Unolink. Na prática, só no Android.
getPendingDeferredDeepLink(), consumeDeferredDeepLink()getPendingDeferredDeepLink(), consumeDeferredDeepLink()getPendingDeferredDeepLink(), consumeDeferredDeepLink()O link a abrir quando o onboarding ou o login terminar, e depois marcar como aberto. Ele espera até ser consumido, mesmo que o app seja fechado nesse meio-tempo, por até 30 dias (SDK 0.3.3+; React Native 0.3.1+ o guardava por uma abertura).
isConfigured()Se configure já rodou com uma chave (React Native 0.3.1+).
getInstallId()installIdgetInstallId()getInstallId()O ID aleatório desta instalação.
flush()flush()flush()flush()Envia agora os eventos na fila.
setEnabled(bool)setEnabled(_:)setEnabled(bool)setEnabled(bool)Desativa o rastreamento (os eventos na fila são apagados) ou ativa de novo.

RevenueCat

Quando o RevenueCat está conectado, ele é a fonte da verdade para o dinheiro. Ele reporta testes grátis, compras, renovações, cancelamentos, reembolsos, expirações e problemas de cobrança, mesmo quando o app não está aberto. As chamadas do app a purchase e trialStarted são ignoradas, para que nada conte duas vezes. Seu app só precisa de connectRevenueCat (ou de setUserId com o ID do RevenueCat).

Cota do plano

O SDK faz parte dos planos Pro e Studio. Todo evento que o seu app envia conta na cota mensal de eventos: 1 milhão no Pro, 5 milhões no Studio. Isso inclui os eventos padrão acima e os seus eventos personalizados. Os eventos automáticos (first_open, session_start, app_background) e as telas de onboarding (onboarding_step, onboarding_skipped) são grátis, assim como as compras, renovações e reembolsos que chegam do RevenueCat. Passar da cota não bloqueia nada; acima do dobro da cota, os eventos personalizados são recusados até o mês seguinte, enquanto os eventos padrão, de onboarding e automáticos são sempre mantidos.