# Solución de problemas

> Síntomas y códigos de error habituales al integrar TryYourSize, con su causa y su solución. Busca en esta página el código que ves.

Source: https://docs.tryyoursize.com/es/guides/troubleshooting/

Busca en esta página (o en todo el sitio con <kbd>/</kbd>) el síntoma o el código de error que ves. Cada entrada explica la causa y la solución. ¿Sigues sin resolverlo? Escribe a support@tryyoursize.com con el **ID de la petición** (cabecera `X-Request-ID`, o `requestId` / `request_id` en los errores de los SDK).

## El elemento no aparece

La guía de tallas, el botón o el elemento integrado nunca se muestran.

1. **El visitante está en el grupo de control A/B.** Con un experimento activo, un 10–50 % de los visitantes no ve nada, a propósito. Compruébalo con `await tys.experiment()` (`arm: "holdout"`), o detén el experimento en Studio → Resultados mientras pruebas.
2. **El contenedor aún no existe.** `mount("#size-guide")` lanza [`mount_not_found`](https://docs.tryyoursize.com/sdk/errors.md#mount_not_found) si el selector no encuentra nada. Monta el elemento cuando el contenedor ya esté en la página.
3. **El origen de la página no está registrado** para el modo de la clave. Añádelo en Studio → Ajustes → Tiendas → Sitios permitidos (`https://` y sin ruta; `http://localhost` funciona en modo de prueba sin registrarlo).
4. **Una Content Security Policy nos bloquea.** Permite `script-src https://js.tryyoursize.com` y `frame-src https://embed.tryyoursize.com`. La consola del navegador muestra la URL bloqueada.

## window_unreachable o un evento loaderror

Nuestra ventana no cargó o no conectó en 15 segundos. Las mismas causas que arriba (origen, CSP), o un filtro de red o bloqueador de anuncios que bloquea `tryyoursize.com`. Escucha `loaderror` y muestra tu propia tabla de tallas. Consulta [`window_unreachable`](https://docs.tryyoursize.com/sdk/errors.md#window_unreachable).

## secret_key_in_browser o secret_key_in_app

Una clave secreta (`sk_…`) o restringida (`rk_…`) llegó a un navegador o a una app. Usa allí la clave publicable y [rota la clave secreta](https://docs.tryyoursize.com/es/get-started/keys-and-modes.md) en Studio si el código llegó a publicarse.

## app_not_allowed en una app de iOS o Android

La app no está registrada para la clave. Añade `ios-app://<bundle id>` o `android-app://<package>` (en minúsculas) a los sitios permitidos del **modo de prueba**. `tys.appOrigin` muestra el valor exacto. El modo real para apps llegará pronto.

## La guía de tallas siempre dice «Guía de tallas»

Quien compra no tiene sesión de TryYourSize en tu web (`status: "signed_out"`). Es lo esperado hasta que inicie sesión una vez en nuestra ventana. Cada sitio (origen) tiene su propia conexión: una sesión en `staging.brand.com` no vale en `www.brand.com`.

## El estado siempre es unavailable

Hay sesión, pero todavía no hay talla para este producto:

- El producto **no tiene una prenda publicada** en TryYourSize (el modo real responde solo con versiones publicadas; el de prueba, con borradores). Publícala en Studio o con [`garments.publish()`](https://docs.tryyoursize.com/reference/node/garments-publish.md).
- El `product` que pasas no es el SKU o el ID sincronizado con TryYourSize. `tys.products.retrieve("<tu valor>")` en tu servidor te lo dice.
- Quien compra aún no se ha probado esta prenda. Ver una página nunca inicia una simulación; la inicia quien compra con «Verlo puesto». Cuando termina, recibes otro evento `recommendation`.
- El visitante está en el grupo de control: siempre recibe `unavailable`.

## La talla no usa mis etiquetas

Las tallas vuelven a través del **mapa de tallas** del producto (talla de Studio → tu etiqueta). Sin entrada, recibes la etiqueta de Studio. Asígnalas en Studio o con [`sizeMap.save()`](https://docs.tryyoursize.com/reference/node/products-size-map-save.md). `unmapped_shop_values` lista los valores de tus variantes sin talla de Studio.

## 401 unauthorized de la API

Falta la clave, está mal copiada o revocada, o se usó una clave publicable en el servidor. Las llamadas de servidor necesitan `Authorization: Bearer sk_…` (o `rk_…`). Consulta [`unauthorized`](https://docs.tryyoursize.com/api/errors.md#unauthorized).

## 403 forbidden de la API

A una clave restringida le falta el permiso (cada operación lista sus **Key scopes**), o una clave de prueba lee datos reales (o al revés). Consulta [`forbidden`](https://docs.tryyoursize.com/api/errors.md#forbidden).

## handle_expired, handle_invalid o handle_mode_mismatch

Los handles de recomendación duran una hora y pertenecen a un modo. Pide uno nuevo al navegador con `tys.recommendationHandle()`; usa una clave secreta de prueba con un handle de una clave publicable de prueba. Si quien compra desconectó tu tienda, recibes `handle_invalid`. Consulta [`handle_expired`](https://docs.tryyoursize.com/api/errors.md#handle_expired).

## 429 rate_limited

Demasiadas peticiones. Espera los segundos de `Retry-After` y reintenta con espera creciente; los SDK lo hacen por ti. Con una `Idempotency-Key`, reintentar un `POST` es seguro. Consulta [Límites de peticiones](https://docs.tryyoursize.com/guides/rate-limits.md).

## 409 idempotency_key_in_use o 422 idempotency_key_reused

`idempotency_key_in_use`: la primera petición con esa clave aún se está procesando; reintenta en breve. `idempotency_key_reused`: enviaste la misma clave con otro cuerpo. Usa una clave por petición distinta. Consulta [Idempotencia](https://docs.tryyoursize.com/guides/idempotency.md).

## La firma de un webhook no se verifica

Casi siempre, el cuerpo se analizó y se volvió a serializar antes de verificarlo. Verifica los bytes **sin procesar**: en Express usa `express.raw({ type: "application/json" })`; en Flask, `request.get_data()`. Comprueba que usas el secreto `whsec_…` del propio endpoint (los de prueba y los reales son distintos) y que el reloj del servidor es correcto (5 minutos de tolerancia). Consulta [Webhooks](https://docs.tryyoursize.com/es/guides/webhooks.md).

## Los pedidos no aparecen en Resultados

Resultados cuenta los pedidos enviados con [`POST /v1/orders`](https://docs.tryyoursize.com/es/guides/outcomes.md) en modo **real**. Para la comparación A/B, cada pedido necesita el grupo: envía `visitor_id` (de `tys.experiment()` en el navegador, guardado con el carrito) o `experiment_arm`. Un pedido sin ninguno se cuenta fuera del experimento.

## Quien compra eligió una talla, pero mi selector la cambió

Preselecciona solo hasta que quien compra elija: guarda una marca de «tocado» y no sobrescribas su elección cuando llegue otro evento `recommendation`. Consulta [Preseleccionar la talla recomendada](https://docs.tryyoursize.com/es/guides/recommendation-event.md).
