RevenueCat
Se o seu app usa RevenueCat, conecte o webhook dele e o Unolink recebe cada teste grátis, compra, renovação, cancelamento e reembolso direto do RevenueCat, inclusive renovações e reembolsos que acontecem quando o app nem está aberto. A receita no seu funil passa a ser líquida de reembolsos. Plano Pro ou superior.
1. Conectar
No Unolink, abra seu app → Configurações → RevenueCat → Conectar. Copie a URL do webhook e o valor do cabeçalho Authorization (exibido só uma vez).
2. Adicione o webhook no RevenueCat
No RevenueCat, abra seu projeto → Integrations → Webhooks → Add new configuration:
- Webhook URL e Authorization header value: cole os dois.
- Environment: both. Compras em sandbox contam como dispositivos de teste, então ficam fora dos seus números reais.
- App: este app. Events: todos.
Salve e depois clique em Send test event. O cartão do RevenueCat no Unolink mostra quando ele chegar.
3. Diga ao Unolink quem é o usuário
As compras são ligadas à instalação (e ao link de onde ela veio) pelo ID de usuário que seu app reporta: o próprio
app user ID do RevenueCat. Com o SDK 0.3.2 ou posterior, uma linha o mantém atualizado. Chame-a uma vez na abertura,
antes ou depois de configure:
Unolink.connectRevenueCat { Purchases.isConfigured ? Purchases.shared.appUserID : nil }
Unolink.connectRevenueCat { Purchases.sharedInstance.appUserID }
import Purchases from "react-native-purchases"
Unolink.connectRevenueCat(Purchases)
Unolink.connectRevenueCat(
() => Purchases.appUserID,
addListener: Purchases.addCustomerInfoUpdateListener,
removeListener: Purchases.removeCustomerInfoUpdateListener,
);
O Unolink lê o ID na abertura, sempre que o app volta ao primeiro plano e sempre que o ID muda, e só o envia quando ele
é novo. Ele não adiciona o RevenueCat ao seu app: é você quem entrega o RevenueCat a ele. No iOS e no Android, chame
também Unolink.revenueCatUserChanged() depois de Purchases.logIn e Purchases.logOut para enviar o novo ID na hora
(senão ele vai com o próximo evento). O React Native e o Flutter percebem a mudança sozinhos.
Sem connectRevenueCat (um SDK mais antigo, ou se você preferir fazer isso você mesmo), chame setUserId com o ID
do RevenueCat depois de Purchases.configure, depois de cada Purchases.logIn e Purchases.logOut, e em toda
abertura. Use um ou outro, não os dois:
Unolink.setUserId(Purchases.shared.appUserID)
Unolink.setUserId(Purchases.sharedInstance.appUserID)
Unolink.setUserId(await Purchases.getAppUserID())
Unolink.setUserId(await Purchases.appUserID);
Para um convidado, esse é o ID anônimo do RevenueCat, então uma compra feita antes do cadastro se junta à instalação
na hora. Depois do logIn, é o ID da conta. O Unolink guarda todo ID que uma instalação reportou, então a compra do
convidado continua ligada.
Se o seu app informar só o ID da conta, a compra de um convidado ainda se junta, mas só com o próximo evento do RevenueCat para esse cliente que listar os dois IDs (por exemplo, a primeira renovação). Até então, a pessoa aparece como ainda não paga. Reportar o próprio ID do RevenueCat evita essa espera.
Quando alguém toca em "continuar como convidado", chame também Unolink.signUpSkipped() (SDK 0.3.2 ou posterior,
React Native 0.3.1; SDKs mais antigos: track("sign_up_skipped")), para que a etapa Seguiu como convidado do funil
conte essa pessoa. Veja Convidados e contas.
O Unolink nunca armazena o ID em si, apenas um hash com chave, diferente para cada um dos seus apps. Uma compra que chega antes de o app informar seu usuário espera, e se junta à instalação assim que ele informar. Pagamentos que chegam dias ou semanas depois continuam contando, e o Relatório mostra quanto tempo as pessoas levam: veja Pagamentos e IDs de usuário, que também trata de privacidade e das regras da Apple.
O que chega
| RevenueCat | No Unolink |
|---|---|
INITIAL_PURCHASE (teste grátis) | Iniciou o teste grátis |
INITIAL_PURCHASE, NON_RENEWING_PURCHASE, conversão do teste grátis | Pagou, com receita |
RENEWAL | Renovou, com receita |
CANCELLATION (reembolso) | Reembolsado, receita subtraída |
CANCELLATION, EXPIRATION, BILLING_ISSUE | Cancelou a assinatura, Assinatura expirou, Problema de cobrança |
Depois que o RevenueCat é conectado, ele passa a ser a fonte da verdade para compras e testes grátis: se o seu app também chamar
Unolink.purchase() ou trialStarted(), essas chamadas são ignoradas, então nada é contado duas vezes. Renovações, cancelamentos
e o resto podem ser adicionados como etapas em qualquer funil (Funil → Editar).