# SDK para Expo

URL: https://traqio.app/es/docs/sdks/expo
Last updated: 2026-10-26

Añade Traqio a una app de Expo: instala @traqio/expo, compila un cliente de desarrollo, inicializa al arrancar y configura SKAdNetwork y deep links.

El SDK de Traqio para Expo es `@traqio/expo`, un alias de `@traqio/react-native`: un único paquete que contiene un **módulo nativo de Expo** (Kotlin y Swift) y el motor JavaScript compartido. En Android lee el Install Referrer de Google Play (la prueba determinista de qué enlace generó la instalación) y en iOS registra la instalación en SKAdNetwork, define los valores de conversión según tu mapeo e informa del token de atribución de Apple Ads. No lee ni el IDFA ni el GAID salvo que lo actives.

## Requisitos

- Expo SDK 51 o posterior, React Native 0.74 o posterior.
- Una **development build** o EAS Build, no Expo Go, que no puede cargar un módulo nativo de terceros.
- iOS 15.1 o posterior (el deployment target del módulo). Android no necesita ningún permiso (salvo que actives el identificador publicitario).

## Configuración

### Instala el paquete

```bash
npx expo install @traqio/expo @react-native-async-storage/async-storage
```

`@react-native-async-storage/async-storage` es lo que permite al SDK recordar que la instalación ya se informó y conservar los eventos en cola entre reinicios. Sin él, el SDK muestra una advertencia al arrancar y vuelve a informar de la instalación en cada inicio.

### Compila un cliente de desarrollo

```bash
npx expo prebuild --clean
npx expo run:android   # or: npx expo run:ios — a development build, not Expo Go
```

El prebuild genera los proyectos `android/` e `ios/` con el módulo de Traqio enlazado. En EAS, un `eas build` normal hace lo mismo.

### Inicializa al arrancar

```tsx
// app/_layout.tsx — once, at module level, before the first screen renders
import { Traqio, getNativeBridge } from "@traqio/expo";
import Constants from "expo-constants";

Traqio.init({
  sdkKey: "YOUR_SDK_KEY",
  endpoint: "https://api.traqio.app",
  native: getNativeBridge(), // Install Referrer on Android, SKAdNetwork + Apple Ads on iOS
  appVersion: Constants.expoConfig?.version,
});
```

Llámalo una vez, a nivel de módulo, para que se ejecute antes de la primera pantalla; no dentro de un componente, donde un nuevo renderizado lo volvería a llamar (es idempotente, pero una llamada tardía pierde el enlace que abrió la app). `getNativeBridge()` devuelve `undefined` donde el módulo nativo no está (Expo Go, web, tests): el SDK sigue enviando eventos, pero no puede atribuir.

### Configura app.json

Dos ajustes nativos viven en `app.json`, y el prebuild los escribe en los proyectos nativos:

app.json:
```json
{
  "expo": {
    "plugins": [["@traqio/expo", { "domains": ["go.example.com"] }]],
    "ios": {
      "infoPlist": {
        "NSAdvertisingAttributionReportEndpoint": "https://api.traqio.app"
      }
    }
  }
}
```

- `NSAdvertisingAttributionReportEndpoint` indica a iOS que envíe a Traqio una copia de los postbacks de SKAdNetwork de tu app. El valor es solo el origen: iOS añade su propia ruta.
- El plugin `@traqio/expo` hace que los enlaces de tu dominio de marca abran la app: añade `applinks:go.example.com` a `ios.associatedDomains` y un intent filter `autoVerify` para `https://go.example.com/c/` a `android.intentFilters`. Sustituye `go.example.com` por tu propio dominio de seguimiento; pon varios si tienes varios. Con EAS Build, Associated Domains se activa después en tu App ID automáticamente; el resto, incluidas las huellas de Android, está en [Universal links en 2 minutos](https://traqio.app/es/docs/concepts/deep-linking#two-minutes).

### Registra eventos y define el id de usuario

```ts
// after sign-in — the SAME id you give RevenueCat (Purchases.logIn)
Traqio.setUserId(user.id);
```

```ts
Traqio.track("signup");

Traqio.track("purchase", {
  value: 9.99,
  currency: "EUR",
  transactionId: purchase.transactionId, // the store's id: StoreKit transactionId, Play orderId
});
```

Usa los nombres de eventos que Traqio asigna a los eventos estándar de Meta y TikTok; consulta [Nombres de eventos](https://traqio.app/es/docs/concepts/events-and-revenue#names). Pasa el `transactionId` de la tienda en cada compra: con él, una compra que informan tanto tu app como RevenueCat se cuenta una sola vez.

## Deep links con Expo Router

Un único callback recibe tanto el enlace que abrió la app ya instalada como el enlace que llevó a una instalación nueva. El SDK conecta el `Linking` de React Native: no hay nada más que reenviar.

```tsx
import { router } from "expo-router";

// Direct opens AND the deferred link of a fresh install, one callback.
Traqio.onDeepLink(({ deepLink }) => {
  if (deepLink) router.push(deepLink); // "/product/42"
});
```

Un enlace que se resuelve antes de que se monte la pantalla que contiene este callback se conserva y se entrega al suscribirse, así que un arranque en frío no lo pierde.

## Notas por plataforma

### Android

- El módulo declara una entrada `<queries>` para Play Store. Sin ella, Android 11+ oculta Google Play a las apps que no instaló, y el referrer aparece como ausente en las development builds.
- Cuando Google Play no está disponible momentáneamente en el primer arranque, el SDK no informa de la instalación como orgánica: reintenta en los siguientes arranques (hasta tres) antes de informarla sin referrer.

### iOS

- El SDK nunca muestra el aviso de App Tracking Transparency y no lo necesita: SKAdNetwork y el token de Apple Ads funcionan sin él.
- Los valores de conversión siguen el mapeo que publicas en la consola; publícalo antes de tu primera campaña en iOS. Consulta [Atribución en iOS](https://traqio.app/es/docs/concepts/ios-attribution).

## Identificador publicitario (opcional)

Desactivado por defecto: el SDK no envía ni IDFA ni GAID. Activa `collectAdvertisingId` solo si compras en redes que atribuyen por el identificador publicitario — Unity Ads y AppLovin vinculan su clic con tu instalación gracias a él. Se envía con la instalación y nunca se usa como su identidad.

```ts
Traqio.init({
  sdkKey: "YOUR_SDK_KEY",
  endpoint: "https://api.traqio.app",
  native: getNativeBridge(),
  collectAdvertisingId: true, // off by default
});
```

- iOS: el SDK nunca muestra el aviso de App Tracking Transparency — pídelo tú antes de `init` y enlaza AdSupport. El IDFA solo se lee si el usuario ya permitió el seguimiento.
- Android: añade `com.google.android.gms:play-services-ads-identifier` y el permiso`com.google.android.gms.permission.AD_ID` a tu app; el SDK no declara ninguno de los dos.
- Declara el identificador publicitario en los detalles de privacidad de la App Store y en el formulario de Seguridad de los datos de Google Play.

## Configuración y API

Todas las opciones de `init` y todos los métodos (`setConsent`, `forgetMe`, `trackAdRevenue`, `getInstallReferrer`) se documentan una sola vez, en la [referencia de la API de JavaScript](https://traqio.app/es/docs/sdks/javascript#reference). Las opciones que con más probabilidad definirás:

| Opción | Valor por defecto | Qué hace |
| --- | --- | --- |
| userId | — | Tu id de usuario: el mismo valor que el app_user_id de RevenueCat. |
| consent | no se envía | La respuesta del usuario a tu solicitud de consentimiento, si se conoce al arrancar. |
| skan | true | Gestiona los valores de conversión de SKAdNetwork a partir de los ingresos registrados (iOS). |
| appleAds | true | Informa del token de atribución de Apple Ads (iOS 14.3+). |
| deepLinking | true | Resuelve los deep links directos y diferidos. |
| testAds | false | Unidades de anuncios de prueba de AdMob: las impresiones se registran, nunca se cuentan como ingresos. |
| collectAdvertisingId | false | Envía el IDFA / GAID con la instalación — ver Identificador publicitario. |

## Preguntas frecuentes

**¿El SDK de Traqio funciona en Expo Go?**
No. El SDK incluye un módulo nativo (lee el Install Referrer de Google Play en Android y gestiona SKAdNetwork en iOS), y Expo Go solo contiene los módulos nativos que distribuye Expo. Usa una development build (npx expo run:android / run:ios) o EAS Build. En Expo Go la parte JavaScript sigue enviando eventos, pero sin el módulo nativo no hay atribución.

**¿Qué diferencia hay entre @traqio/expo y @traqio/react-native?**
Ninguna en su comportamiento: @traqio/expo es un alias que reexporta @traqio/react-native, fijado a una versión exacta, para que el SDK pueda encontrarse con el nombre de Expo. Instala uno de los dos, nunca ambos: dos copias ejecutarían dos colas de eventos y contarían cada instalación dos veces.

**¿Necesito un config plugin?**
No para el SDK: el autolinking de Expo enlaza el módulo nativo durante el prebuild. Para los deep links, @traqio/expo incluye un config plugin opcional — ["@traqio/expo", { "domains": ["go.example.com"] }] en app.json añade la entrada de Associated Domains en iOS y el intent filter de App Links en Android para tu dominio de marca, sin duplicar lo que ya declaras. El endpoint de SKAdNetwork sigue en ios.infoPlist.
