> ## Documentation Index
> Fetch the complete documentation index at: https://docs.scanova.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Resolución de problemas

> Resuelve los problemas habituales del seguimiento de conversiones: eventos que no llegan, errores CORS, 403 de dominio, atribución perdida y duplicados.

## Problemas del SDK del navegador

### No aparece ninguna petición de red a `/ct`

Comprueba esto en orden:

1. **El fragmento está en el sitio equivocado**: tiene que ir en `<head>`, no en `<body>` ni después de `</html>`
2. **Falta el `site_id`**: comprueba que `scanova('init', 'YOUR_SITE_ID', ...)` lleva un ID de sitio real y no un marcador de posición
3. **La Content Security Policy (CSP) bloquea el script**: añade `https://cdn.scanova.io` (script source) y `https://t.scanova.io` (connect source) a tus cabeceras de CSP
4. **Una extensión del navegador bloquea la petición**: pruébalo en una ventana de incógnito con todas las extensiones desactivadas
5. **`autoPageview: false` y ninguna llamada manual**: activa `autoPageview` o añade `scanova('track', 'pageview')`
6. **El SDK está cargado dos veces**: tener a la vez la instalación directa en HTML y la de GTM en la misma página da problemas. Quita una de las dos.

### `403 Domain not allowed`

El origen de tu petición no está en la lista **Allowed Domains** del sitio de seguimiento.

1. Ve a **Análisis → Seguimiento de conversiones**
2. Haz clic en tu sitio de seguimiento → **Edit**
3. Añade exactamente el nombre de host que ves en la barra de direcciones del navegador (por ejemplo `yoursite.com` o `www.yoursite.com`)
4. Guarda

<Note>
  `www.yoursite.com` y `yoursite.com` se tratan como dominios distintos. Añade los dos si usas ambos.
</Note>

<Warning>
  La lista de dominios permitidos se comprueba contra el `Origin` de la petición (y, en su defecto, contra `Referer`). Por eso, reproducir un evento del navegador con `curl` o desde el servidor devuelve `403 Domain not allowed for this site` aunque el dominio esté permitido: no se envía ninguna de las dos cabeceras. Añade `-H "Origin: https://yoursite.com"` cuando reproduzcas un evento del navegador a mano.
</Warning>

### `400`: petición incorrecta

El `site_id` no es válido, está vacío o el sitio se ha desactivado en el panel. Comprueba que:

* Usas el `site_id` correcto de este sitio de seguimiento
* El sitio está activo (aparece como habilitado en el panel)

### Los eventos salen en las DevTools pero no en el panel

* Espera hasta 60 segundos: hay un pequeño retardo de procesamiento
* Asegúrate de estar mirando el sitio de seguimiento correcto en el panel
* Comprueba que el `site_id` del contenido de la petición coincide con el sitio que estás viendo

### Se disparan dos eventos por carga de página

Tienes a la vez `autoPageview: true` en las opciones de init y una llamada manual a `scanova('track', 'page_view', ...)` en algún punto de tu código. Eso genera dos eventos distintos. Quita uno: consulta [Eventos registrados automáticamente](/es/conversion-tracking/browser/auto-tracking#page-view).

### Una visita concreta no genera ningún evento

Si una visita no produce ninguna petición a `/ct`, lo más probable es que la persona llegara sin escanear un código QR: no hay parámetro `?scnv=` en la URL. El SDK comprueba que existe un `scan_session_id` antes de enviar cualquier evento y, si no lo hay, no envía nada.

El seguimiento de conversiones de Scanova solo mide el tráfico que viene de un escaneo. Las visitas directas u orgánicas no generan eventos: es intencionado.

Para probar la atribución, abre tu página con un parámetro `?scnv=` y simula así un escaneo:

```
https://yoursite.com/?scnv=00000000-0000-0000-0000-000000000001
```

***

## Problemas de los eventos de servidor

### `401`: falta la clave de API

La petición no incluye la cabecera `X-API-Key`. Consulta [Autenticación](/es/conversion-tracking/api/authentication).

### `403`: clave no válida o sitio equivocado

O la clave no es válida o está revocada, o el `site_id` de tu petición no corresponde al sitio que generó la clave. Comprueba que:

* Vuelves a copiar la clave desde el panel (las claves se muestran una vez; si la has perdido, genera otra)
* El `site_id` de tu petición es el mismo ID de sitio que aparece en la lista de sitios de seguimiento de conversiones
* La clave no se ha revocado

### `422`: error de validación

La respuesta indica exactamente qué campo ha fallado. Causas habituales:

| Causa                                 | Solución                                        |
| ------------------------------------- | ----------------------------------------------- |
| `scan_session_id` no es un UUID       | Debe ser una cadena UUID válida                 |
| Falta `event_name`                    | Es obligatorio en los eventos de servidor       |
| `properties` supera los 10 KB         | Reduce el tamaño del contenido                  |
| Correo en texto plano en `properties` | Aplícale un hash: `user_identifiers.email_hash` |

### Los eventos llegan pero no se atribuyen a ningún código QR

El `scan_session_id` que enviaste no se ha podido enlazar con ningún escaneo en la base de datos de Scanova. Esto ocurre cuando:

* El `scan_session_id` era inventado o no válido
* La persona no llegó a escanear ningún código QR: entró directamente
* La sesión de escaneo ha caducado

Comprueba que lees el `scan_session_id` del navegador (en `localStorage._scnv`, una clave de almacenamiento interna del SDK) y que lo pasas correctamente a tu servidor. Consulta [Enviar eventos de servidor](/es/conversion-tracking/server/send-events#passing-scan_session_id-from-browser-to-server) for examples.

***

## Problemas de atribución

### Los eventos muestran `null` en `qr_code_id`

Es un **registro huérfano**: el evento llegó antes de que los datos de la sesión de escaneo se propagaran del todo en la base de datos de Scanova. Estos registros se eliminan automáticamente a las 24 horas si los datos de sesión no llegan nunca, o se completan en cuanto llegan.

Si ves muchos registros huérfanos, comprueba que:

* El `scan_session_id` de tus eventos corresponde a una sesión de escaneo real (y no a un UUID de prueba)
* Tus códigos QR están bien enlazados con el sitio de seguimiento en el panel

### Las conversiones aparecen en el código QR equivocado

Tu `scan_session_id` no se está leyendo bien: puede que estés recuperando un valor obsoleto o incorrecto de `localStorage`. Comprueba que tu frontend lee `localStorage.getItem('_scnv')` (la clave de almacenamiento interna del SDK) y extrae `.sid` del valor JSON. Consulta [Enviar eventos de servidor](/es/conversion-tracking/server/send-events#passing-scan_session_id-from-browser-to-server) for the full pattern.

***

## Problemas de rendimiento

### `429`: límite de frecuencia superado

Estás alcanzando el límite de frecuencia:

* Eventos del navegador: 100 peticiones por minuto y dirección IP
* Eventos de servidor: 1000 peticiones por minuto y clave de API

En los eventos de servidor, cambia al endpoint de lotes (`POST /server-events/batch`) para enviar hasta 100 eventos por petición y reducir tu ritmo de peticiones hasta cien veces.

En los eventos del navegador, ver un `429` en uso normal es raro. Si aparece durante pruebas de carga, espacia tus peticiones.
