Introdução
O Nemu React Native SDK (@usenemu-account/react-native-sdk) permite integrar o sistema de atribuição e Smart Links da Nemu diretamente no seu aplicativo React Native.
Com o SDK você pode:
- Capturar a origem da instalação — saber de qual campanha, fonte ou mídia o usuário veio (UTMs)
- Processar deep links diretos — quando o usuário clica em um Smart Link e o app já está instalado
- Processar deep links diferidos — quando o usuário clica em um Smart Link, instala o app pela loja e abre pela primeira vez
- Identificar usuários — associar um ID do seu sistema ao dispositivo para cruzar dados de atribuição
- Consultar histórico de sessões — recuperar os UTMs da última interação do usuário
Pré-requisitos
| Requisito | Versão mínima |
|---|---|
| React Native | >= 0.70.0 |
| React | >= 17.0.0 |
| Node.js | >= 16 LTS |
| npm ou Yarn | Versão compatível com Node 16+ |
| iOS | Suporte a CocoaPods |
| Android | API 21+ (Android 5.0) |
Pacote privado: o @usenemu-account/react-native-sdk é um pacote npm de acesso restrito. Para instalá-lo, você precisa de um token npm fornecido pela equipe de suporte da Nemu. Consulte a seção de instalação abaixo.
Instalação
1. Configuração do token npm
O pacote@usenemu-account/react-native-sdk é privado e está publicado no registro npm com acesso restrito. Antes de instalar, você precisa configurar a autenticação.
Obtenha seu token
Entre em contato com a equipe de suporte da Nemu para receber seu token de acesso npm:- E-mail: suporte@nemu.com.br
- Site: nemu.com.br
Configure o arquivo .npmrc
Na raiz do seu projeto (mesmo diretório do package.json), crie ou edite o arquivo .npmrc:
SEU_TOKEN_NPM_AQUI pelo token recebido do suporte.
Segurança: adicione o.npmrcao seu.gitignorepara não versionar o token no repositório:Para ambientes de CI/CD, configure o token como variável de ambiente:
2. Instalação do pacote
Com o token configurado, instale o SDK:3. Dependências obrigatórias (peer dependencies)
O SDK requer as seguintes bibliotecas como peer dependencies. Instale-as caso ainda não estejam no seu projeto:| Dependência | Versão mínima | Finalidade |
|---|---|---|
@react-native-async-storage/async-storage | >= 1.17.0 | Armazenamento local de dados de sessão e atribuição |
react-native-keychain | >= 8.0.0 | Armazenamento seguro do identificador do dispositivo |
react-native-device-info | >= 10.0.0 | Recupera informações do dispositivo |
Configuração nativa
iOS
1. Instale os Pods
Após instalar as dependências JavaScript, execute o CocoaPods:2. Configure Universal Links (obrigatório para deep links diretos)
Para que o iOS encaminhe os Smart Links diretamente para o app (sem abrir o navegador), você precisa configurar Associated Domains. No Xcode:- Abra o projeto
.xcworkspace - Selecione o target do app
- Vá em Signing & Capabilities
- Clique em + Capability e adicione Associated Domains
- Adicione o domínio no formato:
O domínio exato será fornecido pela equipe da Nemu junto com as credenciais.
3. Configure o URI Scheme (obrigatório)
No arquivoInfo.plist, adicione o URI scheme do seu app:
seuapp pelo scheme definido no painel da Nemu para o seu Smart Link.
Android
1. Configure Deep Links no AndroidManifest.xml
Para que os Smart Links abram o app diretamente, adicione intent filters na suaActivity principal.
No arquivo android/app/src/main/AndroidManifest.xml, dentro da tag <activity> principal:
App Links (Universal Links do Android):
seu-dominio.nemu.com.br e seuapp pelos valores correspondentes ao seu projeto.
2. Permissão de Internet (geralmente já presente)
Verifique se oAndroidManifest.xml possui a permissão de internet:
Na maioria dos projetos React Native essa permissão já está incluída por padrão.
Inicialização
A inicialização do SDK deve ser feita uma única vez, no componente raiz do app (geralmenteApp.tsx), dentro de um useEffect.
Parâmetros de configuração
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
apiKey | string | Sim | Chave de API obtida no painel da Nemu |
uriScheme | string | Sim | URI scheme do app (ex: "seuapp"). Deve corresponder ao valor configurado no Smart Link |
trackingId | string | Sim | ID de rastreamento associado ao app no painel da Nemu |
isDebugMode | boolean | Não | Ativa logs detalhados no console. Padrão: false |
baseUrl | string | Não | Sobrescreve a URL base da API |
Exemplo completo de inicialização
Uso com variáveis de ambiente
Para não expor credenciais diretamente no código, utilize o pacotereact-native-config ou similar:
.env correspondente:
Identificação de usuários
Após o login do usuário no seu app, associe o ID dele ao dispositivo. Isso permite que a Nemu cruze dados de atribuição com o seu sistema de usuários.Registrar usuário
Limpar usuário no logout
Nota: clearUserId() remove apenas a associação local. O histórico de atribuição no backend é preservado.
Deep Links
O SDK processa dois tipos de deep links automaticamente:Deep links diretos
Ocorrem quando o app já está instalado e o usuário clica em um Smart Link. O sistema operacional abre o app diretamente (via Universal Link / App Link ou URI scheme). O fluxo é transparente:- O usuário clica no Smart Link
- O app abre com a URL
- O SDK processa a URL e registra a sessão
- Os listeners registrados via
onDeepLinksão notificados com os dados
Deep links diferidos (Deferred Deep Links)
Ocorrem quando o app não está instalado. O usuário clica no Smart Link, é redirecionado para a loja, instala o app e abre pela primeira vez. O SDK detecta automaticamente esse cenário na primeira abertura e entrega os dados de atribuição e deep link viaonDeepLink com isDeferred: true.
Listener reativo (onDeepLink)
Registre um callback para receber os dados do deep link assim que estiverem disponíveis:Replay automático: se um deep link já foi processado antes do listener ser registrado, o callback é disparado imediatamente com os dados mais recentes. Isso evita que o app perca o deep link inicial.
Consulta imperativa (getDeepLinkData)
Se preferir consultar os dados de forma imperativa em vez de usar o listener:Estrutura do DeepLinkData
Atribuição
Histórico da última sessão (last touch)
Consulte os UTMs da interação mais recente do usuário. Responde à pergunta: “quais foram os UTMs da última visita?”Inserção manual de histórico de UTM (setSessionHistory)
Use setSessionHistory quando você precisa registrar UTMs manualmente em fluxos personalizados (por exemplo, campanha definida pelo backend, onboarding interno ou regra de negócio que não depende de deep link).
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
utm_source | string | Sim | Origem da campanha |
utm_medium | string | null | Não | Mídia/canal |
utm_campaign | string | null | Não | Nome da campanha |
utm_content | string | null | Não | Conteúdo da peça |
utm_term | string | null | Não | Termo adicional |
utm_sourceé obrigatório; chamadas inválidas são ignoradas com segurança- O método reutiliza o fluxo interno de sessão/histórico do SDK (
trackEvent) - Existe desduplicação para evitar criação excessiva de históricos em chamadas repetidas
- A execução é assíncrona e resiliente (falhas internas não devem quebrar o app)
Quando usar: se a origem já veio por Smart Link/deep link com UTMs válidos, prefira o fluxo automático. Use setSessionHistory para complementar cenários não cobertos pelo link.
Exemplo: anexando UTMs a uma compra
Integração com WebView
Quando o app embute conteúdo web via WebView e a página precisa consumir os dados de atribuição (por exemplo, os UTMs retornados porgetLastSessionHistory), o SDK roda apenas no lado nativo (React Native). Para que a página web tenha acesso a esses dados, você precisa criar uma ponte bidirecional entre o React Native e a WebView.
Estratégia recomendada
A abordagem mais confiável combina dois mecanismos:- Pré-injeção: os dados são disponibilizados como variável global na WebView antes do carregamento do conteúdo
- Bridge sob demanda: a página web pode solicitar uma versão atualizada do histórico a qualquer momento
Por que não usar query params na URL? É a abordagem mais simples, mas tem limite de tamanho, expõe os dados na URL e não permite atualizar valores sem recarregar a página. Use apenas quando os dados são pequenos e estáticos.
Implementação no React Native
Consumo no lado web
Dentro da página carregada na WebView, os dados ficam disponíveis logo no carregamento e podem ser atualizados sob demanda:Considerações importantes
- Aguarde o
initdo SDK antes de montar a WebView. ChamargetLastSessionHistory()antes deNemuTracking.init()faz a Promise ser rejeitada. - Sanitização do JSON: ao injetar dados na WebView, sempre use
JSON.stringify. Nunca interpole strings diretamente para evitar XSS caso algum campo venha de fonte externa. injectedJavaScriptBeforeContentLoaded: requerreact-native-webview>= 11. Em versões anteriores, useinjectedJavaScript(executa após o DOM carregar — pode haver race condition com scripts da página).- Detecção do ambiente: se a mesma página web também roda fora da WebView (no navegador), trate
window.ReactNativeWebViewcomo opcional para evitar erros:
Uso avançado
Modo debug
Ative o modo debug para ver logs detalhados de todas as operações do SDK no console:[NemuSDK] e incluem informações sobre:
- Processamento de deep links
- Fluxo de inicialização
- Erros e falhas de rede
Importante: desative o modo debug em produção. Os logs podem conter informações sensíveis.
Sobrescrita da URL base
Em ambiente de desenvolvimento ou staging, você pode apontar o SDK para uma API diferente:AbaseUrlsó é utilizada quandoisDebugModeétrue. Em modo de produção, o SDK sempre usa a URL padrão.
Solução de problemas
Erro de autenticação npm ao instalar
Erro:- Verifique se o arquivo
.npmrcexiste na raiz do projeto - Confirme que o token está correto e não expirou
- Entre em contato com o suporte da Nemu para validar ou renovar o token
Erro “NemuTracking.init() must be called before using any other method”
Causa: um método do SDK foi chamado antes da inicialização. Solução: certifique-se de queNemuTracking.init() é chamado no useEffect do componente raiz antes de qualquer outro método do SDK.
Pod install falha no iOS
Erro:- Verifique se
react-native-keychainestá instalado como dependência JavaScript - Execute:
Deep links não funcionam no iOS
Verificações:- O Associated Domain está configurado corretamente no Xcode? (formato:
applinks:seu-dominio) - O arquivo
apple-app-site-associationestá publicado e acessível no domínio? (configurado pela equipe da Nemu) - O URI scheme está declarado no
Info.plist?
Deep links não funcionam no Android
Verificações:- Os intent filters estão corretos no
AndroidManifest.xml? - O domínio está com verificação automática ativa (
android:autoVerify="true")? - O arquivo
assetlinks.jsonestá publicado no domínio? (configurado pela equipe da Nemu)
Nenhum dado de atribuição retornado
Verificações:- O
apiKeye otrackingIdestão corretos? - O Smart Link está configurado e ativo no painel da Nemu?
- Teste com
isDebugMode: truee verifique os logs[NemuSDK]no console