---
name: shopify-donde-esta-mi-pedido
description: "Identifica los pedidos con más riesgo de generar consultas de «¿dónde está mi pedido?»: despachados con seguimiento sin movimiento y sin despachar fuera del plazo. Úsala cada mañana para escribirles a esos clientes antes de que te escriban a ti."
---

## Propósito
Genera un reporte masivo de los pedidos con más probabilidad de generar consultas de soporte del tipo «¿Dónde está mi pedido?» (WISMO, por sus siglas en inglés): pedidos despachados cuyo seguimiento no se ha actualizado en N días y pedidos sin despachar que superan un plazo configurable. Según estudios del sector, este tipo de consulta representa cerca del 18 % de todas las solicitudes de soporte, así que identificarlas de forma proactiva es una inversión directa en capacidad operativa. Solo lectura. Reemplaza la revisión manual pedido por pedido en el admin o las búsquedas en tu herramienta de soporte. El CSV resultante te sirve para contactar a los clientes antes de que ellos te contacten a ti.

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

## Parámetros

| Parámetro | Tipo | Obligatorio | Predeterminado | Descripción |
|-----------|------|-------------|----------------|-------------|
| store | string | sí | — | Dominio de la tienda (p. ej., mitienda.myshopify.com) |
| format | string | no | human | Formato de salida: `human` o `json` |
| dry_run | bool | no | false | Muestra las operaciones sin ejecutar mutaciones |
| unfulfilled_sla_days | integer | no | 3 | Marca los pedidos sin despachar con más de esta cantidad de días |
| stale_tracking_days | integer | no | 5 | Marca los pedidos despachados cuyo último despacho se creó hace más de esta cantidad de días (indicador de seguimiento sin movimiento) |
| limit | integer | no | 250 | Máximo de pedidos por página |

## Pasos

1. **OPERACIÓN:** `orders` — consulta (sin despachar y en riesgo)
   **Entradas:** `first: <limit>`, `query: "fulfillment_status:unfulfilled created_at:<='<NOW minus unfulfilled_sla_days>'"`, ordenados por `CREATED_AT` ascendente
   **Resultado esperado:** Pedidos sin despachar fuera del plazo con `name`, `createdAt`, `customer`, `displayFulfillmentStatus`; se etiquetan como `UNFULFILLED_OVERDUE`

2. **OPERACIÓN:** `orders` — consulta (despachados, pero posiblemente sin movimiento)
   **Entradas:** `first: <limit>`, `query: "fulfillment_status:shipped updated_at:<='<NOW minus stale_tracking_days>'"`, ordenados por `UPDATED_AT` ascendente
   **Resultado esperado:** Pedidos despachados que no se han actualizado recientemente con `name`, `createdAt`, `fulfillments.createdAt`, `fulfillments.trackingInfo`; se etiquetan como `SHIPPED_STALE_TRACKING`

## Operaciones GraphQL

```graphql
# orders:query — validada con api_version 2025-01
query WismoOrders($first: Int!, $after: String, $query: String) {
  orders(first: $first, after: $after, query: $query, sortKey: CREATED_AT) {
    edges {
      node {
        id
        name
        createdAt
        updatedAt
        displayFulfillmentStatus
        displayFinancialStatus
        customer {
          id
          firstName
          lastName
          defaultEmailAddress {
            emailAddress
          }
        }
        shippingAddress {
          city
          province
          country
        }
        fulfillments {
          createdAt
          status
          trackingInfo {
            number
            url
            company
          }
        }
        totalPriceSet {
          shopMoney { amount currencyCode }
        }
      }
    }
    pageInfo {
      hasNextPage
      endCursor
    }
  }
}
```

## Seguimiento de la sesión

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

**Al iniciar**, muestra:
```
╔══════════════════════════════════════════════╗
║  SKILL: shopify-donde-esta-mi-pedido         ║
║  Tienda: <dominio de la tienda>              ║
║  Inicio: <AAAA-MM-DD HH:MM UTC>              ║
╚══════════════════════════════════════════════╝
```

**Después de cada paso**, muestra:
```
[N/TOTAL] <CONSULTA|MUTACIÓN>  <OperationName>
          → Parámetros: <resumen breve de las entradas clave>
          → Resultado: <cantidad o desenlace>
```

**Al terminar**, muestra:

Para `format: human` (predeterminado):
```
══════════════════════════════════════════════
RESUMEN DEL RESULTADO
  Pedidos sin despachar fuera de plazo:     <n>
  Pedidos despachados sin movimiento:       <n>
  Total de pedidos en riesgo:               <n>
  Errores:                                  0
  Archivo:                                  wismo-report-<AAAA-MM-DD>.csv
══════════════════════════════════════════════
```

Para `format: json`, muestra:
```json
{
  "skill": "shopify-donde-esta-mi-pedido",
  "store": "<dominio>",
  "started_at": "<ISO8601>",
  "completed_at": "<ISO8601>",
  "dry_run": false,
  "steps": [
    { "step": 1, "operation": "WismoOrders", "type": "query", "params_summary": "fulfillment_status:unfulfilled, sla_days: <n>, limit: <n>", "result_summary": "<n> pedidos", "skipped": false },
    { "step": 2, "operation": "WismoOrders", "type": "query", "params_summary": "fulfillment_status:shipped, stale_days: <n>, limit: <n>", "result_summary": "<n> pedidos", "skipped": false }
  ],
  "outcome": {
    "unfulfilled_overdue_count": 0,
    "shipped_stale_count": 0,
    "total_at_risk": 0,
    "errors": 0,
    "output_file": "wismo-report-<AAAA-MM-DD>.csv"
  }
}
```

## Formato de salida
Archivo CSV `wismo-report-<AAAA-MM-DD>.csv` con las columnas: `risk_type`, `order_name`, `customer_email`, `order_date`, `days_waiting`, `fulfillment_status`, `tracking_number`, `tracking_company`, `shipping_city`, `shipping_country`.

El CSV tiene dos secciones (separadas por el valor de la columna `risk_type`): `UNFULFILLED_OVERDUE` y `SHIPPED_STALE_TRACKING`. En formato human, además se muestra una tabla resumen antes de la ruta del CSV.

## Manejo de errores
| Error | Causa | Solución |
|-------|-------|----------|
| No llegan pedidos | Todos los pedidos están dentro del plazo o se actualizaron hace poco | Buena noticia: no hay riesgo de consultas de «¿dónde está mi pedido?» |
| Resultado muy grande | Mucho volumen de pedidos o plazo muy amplio | Acota el rango de fechas o baja `unfulfilled_sla_days` |
| `customer` es null | Pedido hecho como invitado | El número de pedido y el seguimiento se incluyen igual; la columna de correo queda vacía |
| Límite de solicitudes (429) | Muchas páginas de pedidos | Baja `limit` a 100 |

## Buenas prácticas
1. Ejecuta este reporte a diario en tu revisión operativa de la mañana, junto con `shopify-resumen-despachos`: juntos cubren la cola de operaciones y el riesgo de cara al cliente.
2. Ordena el CSV por `days_waiting` de mayor a menor para contactar primero a los pedidos más atrasados.
3. Para los pedidos `UNFULFILLED_OVERDUE`, pásalos a la skill `shopify-resumen-despachos` para entender por qué no se han despachado y usa `shopify-retener-pedidos` si hace falta.
4. Para los pedidos `SHIPPED_STALE_TRACKING`, revisa si el enlace de seguimiento de la transportadora muestra movimiento: si de verdad está detenido, escribirle al cliente de forma proactiva reduce bastante el volumen de consultas.
5. Usa `format: json` para enviar el resultado a una alerta de Slack o a una automatización de tu CRM que cree tareas de seguimiento para tu equipo de soporte.
