---
name: shopify-consentimiento-marketing
description: "Solo lectura: revisa el estado del consentimiento de marketing por correo y SMS de toda tu base de clientes, para cumplimiento legal y segmentación. Úsala antes de una campaña o de una revisión de privacidad para saber a cuántos clientes puedes escribirles."
---

## Propósito
Revisa todos los registros de clientes y reporta cómo se reparte el estado del consentimiento de marketing por correo y por SMS (suscrito, desuscrito, pendiente, nunca se le preguntó). Sirve para auditorías de cumplimiento, revisiones de GDPR/CAN-SPAM y para entender a qué audiencia de marketing puedes llegar. Solo lectura: no hace cambios.

## 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 (scopes) de API: `read_customers`

## Parámetros

| Parámetro | Tipo | Obligatorio | Predeterminado | Descripción |
|-----------|------|-------------|----------------|-------------|
| store | string | sí | — | Dominio de la tienda (p. ej., mitienda.myshopify.com) |
| channel | string | no | both | Canal de consentimiento a revisar: `email`, `sms` o `both` |
| 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:** `customers` — query
   **Entradas:** `first: 250`, selecciona `emailMarketingConsent { marketingState, consentUpdatedAt }`, `smsMarketingConsent { marketingState, consentUpdatedAt }`, cursor de paginación
   **Resultado esperado:** Todos los clientes con sus estados de consentimiento; pagina hasta `hasNextPage: false`

2. Cuenta los clientes por estado de consentimiento en cada canal

3. Calcula: audiencia alcanzable (suscritos), en riesgo (pendientes), inalcanzable (desuscritos o a quienes nunca se les preguntó)

## Operaciones GraphQL

```graphql
# customers:query — validado con api_version 2025-01
query MarketingConsentAudit($after: String) {
  customers(first: 250, after: $after) {
    edges {
      node {
        id
        displayName
        defaultEmailAddress {
          emailAddress
        }
        emailMarketingConsent {
          marketingState
          consentUpdatedAt
          marketingOptInLevel
        }
        smsMarketingConsent {
          marketingState
          consentUpdatedAt
        }
      }
    }
    pageInfo {
      hasNextPage
      endCursor
    }
  }
}
```

## Seguimiento de la sesión

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

**Al iniciar**, muestra:
```
╔══════════════════════════════════════════════╗
║  SKILL: Consentimiento de marketing          ║
║  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 CONSENTIMIENTO DE MARKETING
  Total de clientes: <n>

  Marketing por correo:
    Suscritos:          <n>  (<pct>%)  ← alcanzables
    Desuscritos:        <n>  (<pct>%)
    Pendientes:         <n>  (<pct>%)
    Sin preguntar:      <n>  (<pct>%)

  Marketing por SMS:
    Suscritos:          <n>  (<pct>%)
    Desuscritos:        <n>  (<pct>%)
    Sin preguntar:      <n>  (<pct>%)
  Archivo: consent_audit_<fecha>.csv
══════════════════════════════════════════════
```

Para `format: json`, muestra:
```json
{
  "skill": "shopify-consentimiento-marketing",
  "store": "<dominio>",
  "total_customers": 0,
  "email": { "subscribed": 0, "unsubscribed": 0, "pending": 0, "not_asked": 0 },
  "sms": { "subscribed": 0, "unsubscribed": 0, "not_asked": 0 },
  "output_file": "consent_audit_<fecha>.csv"
}
```

## Formato de salida
Archivo CSV `consent_audit_<AAAA-MM-DD>.csv` con las columnas:
`customer_id`, `email`, `email_marketing_state`, `email_consent_updated_at`, `sms_marketing_state`, `sms_consent_updated_at`

## 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 |
| No hay clientes | Tienda vacía | Termina con 0 resultados |

## Buenas prácticas
- «Suscritos» es tu audiencia de marketing alcanzable: una tasa de suscripción baja puede indicar que la casilla para aceptar marketing en el checkout no es lo bastante visible.
- «Pendiente» significa que el cliente dio su correo pero no ha confirmado el consentimiento; es común en flujos de doble confirmación (double opt-in).
- Córrela antes de campañas grandes para tener un conteo exacto de la audiencia alcanzable; tu plataforma de envío de correos (ESP) mostrará otra cifra si tiene desuscripciones adicionales que no se sincronizaron de vuelta con Shopify.
- Nota sobre cumplimiento de GDPR: los clientes de la Unión Europea con `marketingOptInLevel: SINGLE_OPT_IN` pueden requerir una campaña para pedir de nuevo su consentimiento, según la base legal que uses para el tratamiento de sus datos.
