# Pedidos y devoluciones (outcomes)

> Envía pedidos y devoluciones para que TryYourSize informe de las devoluciones por talla en cada grupo de la prueba A/B. Sin datos de clientes.

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

Los pedidos y devoluciones alimentan el informe de devoluciones por talla de **Studio → Resultados** (Results) y el [grupo de control A/B](https://docs.tryyoursize.com/es/guides/ab-holdout.md). Envíalos desde tu servidor, sube un CSV o deja que la app de Shopify los lea.

> **Note: Sin datos de clientes**
>
> No hay ningún campo para el ID, el nombre, el email, el teléfono ni la dirección del cliente, y los campos desconocidos se rechazan (`400`), así que un `email` enviado por error se rechaza en lugar de guardarse. Nunca se aceptan notas de devolución en texto libre.

## Pedidos: `POST /v1/orders`

Clave secreta, o una clave restringida con `orders:write`. Idempotente según tu ID de pedido: si vuelves a enviar el mismo `id`, el pedido se actualiza (`200`); un pedido nuevo devuelve `201`.

**Node.js**

```ts
await tys.orders.create({
  id: "1001",
  ordered_at: "2026-10-25T10:12:00Z",
  currency: "EUR",
  visitor_id: cart.tysVisitorId,               // de tys.experiment(), para el grupo de la prueba A/B
  lines: [
    {
      id: "1001-1",
      product: "STRAIGHT-JEANS",               // el ID que pasas al SDK
      size: "32",                               // talla comprada, con tus etiquetas
      quantity: 1,
      unit_price_minor: 8900,                   // opcional, para la estimación de ahorro
      tys_shown: true,
      recommended_size: "32",                   // del evento recommendation o de _tys_size
      attribution: "sdk",
    },
  ],
});
```

**Python**

```python
tys.orders.create(
    id="1001",
    ordered_at="2026-10-25T10:12:00Z",
    currency="EUR",
    visitor_id=cart["tys_visitor_id"],
    lines=[{
        "id": "1001-1",
        "product": "STRAIGHT-JEANS",
        "size": "32",
        "quantity": 1,
        "tys_shown": True,
        "recommended_size": "32",
        "attribution": "sdk",
    }],
)
```

| Campo de la línea | |
|---|---|
| `id`, `product`, `size`, `quantity` | Obligatorios. `size` es la talla comprada, con tus etiquetas. |
| `variant`, `unit_price_minor` | Opcionales. Precio en unidades menores (`5995` = 59,95). |
| `tys_shown` | Se mostró un elemento de TryYourSize en esta compra. |
| `recommended_size` | La talla que recomendó TryYourSize (el evento `recommendation` o `size` del SDK, la API de servidor o la propiedad de línea de carrito `_tys_size`). Nosotros calculamos si quien compra la siguió ("Medium" = "M"). |
| `attribution` | De dónde procede `recommended_size`: `cart_attribute`, `sdk` o `api`. |

A nivel de pedido: `id`, `ordered_at`, `lines` (obligatorios), `currency`, y `visitor_id` o `experiment_arm` para el grupo de la prueba A/B. El `tryon_id` de las [recomendaciones desde el servidor](https://docs.tryyoursize.com/es/guides/server-side-recommendations.md) identifica la prueba virtual que originó una talla; guárdalo junto a la línea del pedido para tus propios registros.

## Devoluciones: `POST /v1/returns`

Clave secreta, o una clave restringida con `returns:write` (por ejemplo, para una plataforma de devoluciones). Idempotente según (línea, ID de devolución). El pedido debe haberse enviado antes (si no, `404`).

```json
{
  "id": "RMA-5521",
  "order_id": "1001",
  "line_id": "1001-1",
  "quantity": 1,
  "reason": "size_too_small",
  "exchange_size": "33",
  "returned_at": "2026-11-02T09:00:00Z"
}
```

### Taxonomía de motivos de devolución

| Código | Relacionado con la talla |
|---|---|
| `size_too_small` | sí |
| `size_too_large` | sí |
| `fit_other` (una zona, el largo, "no me cabe") | sí |
| `style` | no |
| `quality` | no |
| `damaged_or_wrong` | no |
| `changed_mind` | no |
| `other` | no |
| vacío: `unspecified` | no |

Los motivos de devolución de Shopify (`SIZE_TOO_SMALL`, `UNWANTED`, `DEFECTIVE`…) y los términos habituales de las plataformas de devoluciones se asignan automáticamente. `exchange: true` (o un `exchange_size`) marca un cambio en lugar de un reembolso.

## Importar CSV

¿Sin integración por API? Sube archivos CSV en **Studio → Resultados → Importar** (Results → Import).

- **Pedidos**, una fila por línea: `order_id, ordered_at, line_id, product, size, quantity` (opcionales: `currency, unit_price, variant, recommended_size, tys_shown, experiment_arm, visitor_id`).
- **Devoluciones**: `order_id, line_id, return_id, quantity, returned_at` (opcionales: `reason, exchange, exchange_size`).
- Hasta 10 MB o 50.000 filas. Las filas con errores se omiten y se listan por número de fila.
- **Un archivo con una columna de datos personales** (`email`, `name`, `phone`, `address`, `customer…`, `ip`, `birth`…) **se rechaza por completo.**

## Shopify

Con la [app de Shopify](https://docs.tryyoursize.com/es/quickstarts/shopify.md), concede los permisos opcionales `read_orders` y `read_returns` y TryYourSize leerá los pedidos, reembolsos y devoluciones a medida que se produzcan, y podrá importar los últimos 1–60 días (**Studio → Resultados → Importar desde Shopify**). Solo se leen los campos que necesita el informe: las líneas del pedido, las propiedades de línea `_tys_size` y `_tys_vid`, y los reembolsos y devoluciones con sus motivos. Nunca los campos de cliente, dirección, email o notas. Los pedidos de prueba, y los pedidos de una tienda que aún no está en modo real, se registran en modo de prueba.

## Resumen de la atribución

| Origen | Campo |
|---|---|
| Evento `recommendation` / `size` del SDK, o recomendación desde el servidor | `recommended_size` con `attribution: "sdk"` o `"api"` |
| Propiedad de línea de carrito de Shopify `_tys_size` | `recommended_size` con `attribution: "cart_attribute"` (automático) |
| Grupo de la prueba A/B | `visitor_id` (de `tys.experiment()`, o `_tys_vid` en Shopify); si no, `experiment_arm` |
