---
name: shopify-oportunidades-venta-cruzada
description: "Solo lectura: identifica los productos que casi siempre se compran solos y propone con qué combinarlos según categoría y precio. Úsala cuando quieras subir el ticket promedio encontrando ventas cruzadas que hoy no estás aprovechando."
---

## Propósito
Encuentra los productos que casi siempre se compran solos (pedidos de un solo artículo) e identifica posibles compañeros de venta cruzada según la afinidad de categoría, la complementariedad de precio y la coincidencia de clientes. Mientras `shopify-comprados-juntos` encuentra los patrones que ya existen, esta skill encuentra los patrones QUE FALTAN: productos que DEBERÍAN venderse en conjunto y no se están vendiendo así. Solo lectura: no hace cambios.

## Requisitos
- Sesión autenticada de Shopify CLI: `shopify store auth --store <tu-tienda>.myshopify.com --scopes read_orders,read_products`. Las consultas se ejecutan con `shopify store execute`.
- Permisos (scopes) de API: `read_orders`, `read_products`

## Parámetros

| Parámetro | Tipo | Obligatorio | Predeterminado | Descripción |
|-----------|------|-------------|----------------|-------------|
| store | string | sí | — | Dominio de la tienda |
| days_back | integer | no | 180 | Ventana de pedidos a revisar (en días) |
| solo_threshold | float | no | 70 | % de pedidos en los que el producto se compra solo para marcarlo como «solitario» |
| min_orders | integer | no | 10 | Pedidos mínimos para que un producto entre en el análisis |
| format | string | no | human | Formato de salida: `human` o `json` |

## Seguridad

> ℹ️ Skill de solo lectura: no ejecuta cambios. Puedes correrla en cualquier momento sin riesgo.

## Pasos

1. **OPERACIÓN:** `orders` — query
   **Entradas:** `query: "created_at:>='<NOW - days_back days>'"`, `first: 250`, selecciona `lineItems { product { id, title, productType, vendor }, quantity, originalTotalSet }`, cursor de paginación
   **Resultado esperado:** Todos los pedidos con los datos de sus productos

2. Para cada producto, calcula:
   - Total de pedidos que contienen el producto
   - Pedidos en solitario (el producto es el único artículo) frente a pedidos con varios artículos
   - Tasa en solitario = pedidos en solitario / total de pedidos × 100
   - Valor promedio del pedido cuando va solo frente a cuando va con otros artículos

3. Marca los productos con tasa en solitario ≥ solo_threshold como «candidatos a venta cruzada»

4. **OPERACIÓN:** `products` — query (enriquecimiento)
   **Entradas:** IDs de los productos solitarios y de sus posibles compañeros
   **Resultado esperado:** Tipo de producto, proveedor, precio y colecciones para cruzar afinidades

5. Para cada producto solitario, sugiere compañeros de venta cruzada:
   - Mismo proveedor, distinto tipo de producto (complementario)
   - Mismo tipo de producto, distinto rango de precio (bueno-mejor-excelente)
   - Productos que el mismo grupo de clientes compra en pedidos separados
   - Complementariedad de precio: el precio del compañero debería estar entre el 20 % y el 50 % del precio del producto principal (rango de compra por impulso)

## Operaciones GraphQL

```graphql
# orders:query — validado con api_version 2025-01
query OrdersForCrossSell($query: String!, $after: String) {
  orders(first: 250, after: $after, query: $query) {
    edges {
      node {
        id
        customer { id }
        lineItems(first: 50) {
          edges {
            node {
              product { id title productType vendor }
              quantity
              originalTotalSet { shopMoney { amount currencyCode } }
            }
          }
        }
      }
    }
    pageInfo { hasNextPage endCursor }
  }
}
```

```graphql
# products:query — validado con api_version 2025-01
query ProductEnrichment($ids: [ID!]!) {
  nodes(ids: $ids) {
    ... on Product {
      id
      title
      productType
      vendor
      priceRangeV2 {
        minVariantPrice { amount currencyCode }
      }
      totalInventory
      status
    }
  }
}
```

## Seguimiento de la sesión

**Claude DEBE mostrar lo siguiente en cada etapa. Es obligatorio.**

**Al iniciar**, muestra:
```
╔══════════════════════════════════════════════╗
║  SKILL: Oportunidades de venta cruzada       ║
║  Tienda: <dominio de la tienda>              ║
║  Inicio: <AAAA-MM-DD HH:MM UTC>              ║
╚══════════════════════════════════════════════╝
```

**Después de cada paso**, muestra:
```
[N/TOTAL] <QUERY|MUTATION>  <NombreDeOperación>
          → Parámetros: <resumen breve de las entradas clave>
          → Resultado: <conteo o resultado>
```

**Al terminar**, muestra:

Para `format: human` (predeterminado):
```
══════════════════════════════════════════════
REPORTE DE OPORTUNIDADES DE VENTA CRUZADA  (<days_back> días)
  Productos analizados:                   <n>
  Productos con alta tasa en solitario:   <n>
  ─────────────────────────────
  MEJORES OPORTUNIDADES DE VENTA CRUZADA:

  "<producto A>"  (tasa en solitario: <pct>%, <n> pedidos)
    → Compañero sugerido: "<producto B>" (mismo proveedor, tipo complementario)
    → Encaje de precio: <principal> + <compañero> = <combinado>
    → Aumento posible del ticket promedio: +<monto> por pedido

  Oportunidad de ingresos: <total> (si el <pct>% de los pedidos en solitario agrega el compañero)

  Archivo: cross_sell_opportunities_<fecha>.csv
══════════════════════════════════════════════
```

Los montos se expresan en la moneda de la tienda.

## Formato de salida
Archivo CSV `cross_sell_opportunities_<AAAA-MM-DD>.csv` con las columnas:
`product_id`, `product_title`, `total_orders`, `solo_orders`, `solo_rate`, `suggested_partner_id`, `suggested_partner_title`, `affinity_type`, `potential_aov_lift`

## Manejo de errores
| Error | Causa | Solución |
|-------|-------|----------|
| `THROTTLED` | Se superó el límite de solicitudes de la API | Espera 2 segundos y reintenta hasta 3 veces |
| Todos los pedidos tienen varios artículos | La tienda ya tiene una venta cruzada alta de forma natural | Repórtalo como saludable: no hace falta actuar |
| Catálogo pequeño | Muy pocos productos para armar pares útiles | Sugiere ampliar el catálogo |

## Buenas prácticas
- Los productos con tasa en solitario del 80 % o más y alto volumen de pedidos son las mayores oportunidades para subir el ticket promedio (AOV).
- Lleva los pares sugeridos a bloques de «Los clientes también compraron» o a recomendaciones en el carrito lateral.
- Cruza los resultados con `shopify-comprados-juntos` para ver qué SÍ está funcionando y qué falta.
- Úsala con `shopify-comparar-codigos-descuento` para probar una promoción de «compra X y lleva Y con 15 % de descuento».
