# Integración con RevenueCat

URL: https://traqio.app/es/docs/integrations/revenuecat
Last updated: 2026-10-14

Envía el webhook de RevenueCat a Traqio: compras, renovaciones y reembolsos llegan a la instalación que los generó, para el ROAS sin publicar una nueva versión.

**RevenueCat** gestiona las suscripciones y compras in-app y reporta cada transacción con un webhook. Enviado a Traqio, ese webhook lleva ingresos verificados — primeras compras, renovaciones, reembolsos — a la instalación que los generó, de servidor a servidor: las renovaciones meses después siguen contando para la campaña que trajo al usuario, sin publicar una nueva versión de la app.

## Configuración

### Define el mismo id de usuario en ambos SDK

```ts
await Purchases.logIn(user.id);   // RevenueCat — becomes app_user_id
Traqio.setUserId(user.id);         // Traqio — the SAME value
```

Traqio encuentra la instalación de una compra por `(app, app_user_id)`. Un id distinto en cada lado significa ingresos registrados pero nunca atribuidos. Consulta [Identidad](https://traqio.app/es/docs/concepts/identity#user-id).

### Copia la URL del webhook y la cabecera

En la consola: tu producto → Integraciones → Ingresos → RevenueCat. Copia la **URL del webhook** (`https://api.traqio.app/webhooks/revenuecat`) y el valor de la **Cabecera Authorization** (`Bearer …`) que muestra **Generar un secreto**. Se muestra **una sola vez**: Traqio solo guarda una huella, así que un secreto perdido se reemplaza (genera uno nuevo y revoca el anterior), nunca se vuelve a mostrar. Cada producto tiene su propio secreto.

### Añade el webhook en RevenueCat

Panel de RevenueCat → tu proyecto → Integrations → Webhooks → Add. Pega la URL y la cabecera, elige la app, y envía sandbox, producción o ambos.

> **La cabecera es un secreto — y no es tu clave SDK** Autentica las llamadas de RevenueCat; mantenla fuera de tu app y de tu repositorio. Si pones la clave SDK en su lugar, se rechaza con 401 invalid webhook secret.

### Envía un webhook de prueba

El **Send test webhook** de RevenueCat llega como una entrega `TEST`: registrada, nunca contada. Después, una compra en sandbox desde una build de depuración aparece como *Sandbox — conexión verificada*, con el precio que Traqio interpretó. Las compras de producción son las que se cuentan.

## Qué hace cada evento de RevenueCat

| Tipo de RevenueCat | En Traqio |
| --- | --- |
| INITIAL_PURCHASE, RENEWAL, NON_RENEWING_PURCHASE, UNCANCELLATION | una compra — ingresos, reenviada a Meta y TikTok |
| CANCELLATION con un precio negativo | un reembolso — ingresos negativos, nunca reenviado, nunca facturado |
| CANCELLATION sin precio o con precio cero | solo se registra: una baja no mueve dinero |
| REFUND_REVERSED | ingresos positivos: el reembolso se deshizo |
| EXPIRATION | solo se registra |
| TEST y cualquier otro | solo se registra |

- Las compras en **sandbox** se listan en la consola y nunca se cuentan ni se reenvían — reenviarlas enseñaría a las redes a pujar por compras que nunca ocurrieron.
- **Los importes son brutos**: lo que pagó el comprador, en la moneda de la compra, antes de la comisión de la tienda y de impuestos. Los porcentajes de comisión e impuestos de RevenueCat se guardan pero no se aplican.
- La **información de prueba gratuita** (tipo de periodo, conversión de la prueba) se conserva, así que se puede responder a «de prueba a pago».

## Con compras también medidas en la app

Las compras se indexan por el id de transacción **de la tienda**. Si tu app también mide la compra con su `transactionId`, ambas llegan a la misma clave y cuentan una vez — con el importe verificado de RevenueCat. Consulta [Contar una compra una sola vez](https://traqio.app/es/docs/concepts/events-and-revenue#transaction-id).

## Preguntas frecuentes

**¿La cabecera Authorization de RevenueCat es mi clave SDK?**
No. La clave SDK es pública — va dentro de tu app. La cabecera del webhook lleva un secreto distinto que autentica las llamadas de servidor a servidor de RevenueCat y nunca debe estar en la app. Pegar la clave SDK hace que todas las entregas fallen con 401 invalid webhook secret.

**¿Y si una compra llega antes de que Traqio haya visto la instalación?**
Los ingresos se registran igualmente, pero sin atribuir: aparecen como no asociados en el informe de ingresos. Se asocian cuando el id de usuario que Traqio tiene para la instalación es el mismo que el app_user_id de RevenueCat — por eso el id de usuario debe definirse en ambos lados.

**¿Se restan los reembolsos de RevenueCat?**
Sí. Una CANCELLATION de RevenueCat con un precio negativo es un reembolso: Traqio lo registra como ingresos negativos, así que todos los totales lo descuentan. Nunca se factura como conversión ni se reenvía a Meta o TikTok. Una cancelación sin precio negativo es una baja normal de la suscripción y no mueve dinero.
