---
name: shopify-resumen-clientes-b2b
description: "Solo lectura: lista tus empresas clientes B2B con sus ubicaciones, catálogos y condiciones de pago. Úsala para revisar tu cartera mayorista; requiere Shopify Plus con B2B activado."
---

## Propósito
Consulta todas las cuentas de empresas B2B junto con sus ubicaciones, listas de precios y condiciones de pago. Da una vista consolidada de la cartera de cuentas mayoristas para los equipos de operaciones y ventas. Solo lectura: no ejecuta mutaciones. Requiere Shopify B2B (disponible en Shopify Plus).

## Requisitos
- Sesión autenticada de Shopify CLI: `shopify store auth --store <tu-tienda>.myshopify.com --scopes read_customers`
- Las consultas se ejecutan con `shopify store execute`.
- Permisos de la API: `read_customers`
- La tienda debe estar en Shopify Plus con B2B activado

## Parámetros

| Parámetro | Tipo | Obligatorio | Predeterminado | Descripción |
|-----------|------|-------------|----------------|-------------|
| store | texto | sí | — | Dominio de la tienda (p. ej., tu-tienda.myshopify.com) |
| format | texto | no | human | Formato de salida: `human` o `json` |

## Seguridad

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

## Pasos

1. **OPERACIÓN:** `companies` — consulta
   **Entradas:** `first: 250`; selecciona `name`, `locations`, `contacts`, `createdAt` y el cursor de paginación
   **Resultado esperado:** Todas las cuentas de empresas B2B; pagina hasta que `hasNextPage: false`

2. **OPERACIÓN:** `companyLocations` — consulta
   **Entradas:** `first: 250` por empresa; selecciona `name`, `buyerExperienceConfiguration { paymentTermsTemplate, checkoutToDraft }`, `catalogsCount`
   **Resultado esperado:** Ubicaciones de cada empresa con su configuración de pago y de catálogos

## Operaciones GraphQL

```graphql
# companies:query — validada con api_version 2025-01
query B2BCompanies($after: String) {
  companies(first: 250, after: $after) {
    edges {
      node {
        id
        name
        note
        createdAt
        updatedAt
        locationsCount {
          count
        }
        contactsCount {
          count
        }
        orders(first: 1, sortKey: CREATED_AT, reverse: true) {
          edges {
            node {
              createdAt
              totalPriceSet {
                shopMoney {
                  amount
                  currencyCode
                }
              }
            }
          }
        }
      }
    }
    pageInfo {
      hasNextPage
      endCursor
    }
  }
}
```

```graphql
# companyLocations:query — validada con api_version 2025-01
query CompanyLocationsDetail($companyId: ID!) {
  company(id: $companyId) {
    id
    name
    locations(first: 50) {
      edges {
        node {
          id
          name
          shippingAddress {
            countryCode
            city
          }
          buyerExperienceConfiguration {
            paymentTermsTemplate {
              name
              dueInDays
            }
            checkoutToDraft
          }
          catalogsCount {
            count
          }
        }
      }
    }
  }
}
```

## Seguimiento de la sesión

**Claude DEBE mostrar la siguiente salida en cada etapa. Es obligatorio.**

**Al iniciar**, muestra:
```
╔══════════════════════════════════════════════╗
║  SKILL: Resumen de clientes B2B              ║
║  Tienda: <dominio de la tienda>              ║
║  Inicio: <YYYY-MM-DD HH:MM UTC>              ║
╚══════════════════════════════════════════════╝
```

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

**Al terminar**, muestra:

Para `format: human` (predeterminado):
```
══════════════════════════════════════════════
RESUMEN DE EMPRESAS B2B
  Total de empresas:       <n>
  Total de ubicaciones:    <n>
  Con pago a plazo:        <n>
  Con catálogos:           <n>

  Empresa: <nombre>
    Ubicaciones: <n>  |  Último pedido: <fecha>
    Condiciones de pago: Neto 30
  Archivo: b2b_companies_<fecha>.csv
══════════════════════════════════════════════
```

Para `format: json`, muestra:
```json
{
  "skill": "shopify-resumen-clientes-b2b",
  "store": "<dominio>",
  "total_companies": 0,
  "total_locations": 0,
  "companies": [],
  "output_file": "b2b_companies_<fecha>.csv"
}
```

## Formato de salida
Archivo CSV `b2b_companies_<YYYY-MM-DD>.csv` con las columnas:
`company_id`, `company_name`, `locations_count`, `contacts_count`, `last_order_date`, `last_order_value`, `currency`, `payment_terms`, `has_catalog`

## 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 |
| La lista de empresas está vacía | B2B no está configurado o no hay cuentas | Termina con 0 empresas e indica que B2B requiere Shopify Plus |
| La consulta `companies` no está disponible | La tienda no está en Shopify Plus | Devuelve un error claro: B2B requiere Shopify Plus |

## Buenas prácticas
- Córrela cada mes como chequeo de salud de tus cuentas mayoristas: las empresas sin pedidos en 90 días o más pueden necesitar que las contactes.
- `checkoutToDraft: true` significa que los pedidos del comprador deben aprobarse antes del pago; sirve para saber qué cuentas requieren revisión manual de pedidos.
- En empresas con varias ubicaciones pero un solo catálogo, revisa que el catálogo esté bien asignado a cada ubicación.
- Esta skill requiere Shopify B2B (una función de Shopify Plus): en tiendas que no son Plus devolverá un resultado vacío o un error.
