> ## Knowledge Base Index
> Fetch the complete knowledge base index at: https://help.pandectes.io/sitemap.xml
> Use this file to discover available pages before exploring further.
> Pure-Markdown content can be obtained by appending a '.md' suffix to the content URLs listed in the sitemap (without the trailing slash).

# Cómo verificar que Pandectes funciona con la Customer Privacy API de Shopify

### Descripción general

Pandectes GDPR Compliance está integrado con la Customer Privacy API de Shopify. Cuando un visitante elige **Accept**, **Reject** o una selección personalizada en la ventana de preferencias, el banner comunica esa elección a Shopify a través de la API oficial. Shopify la aplica entonces a las superficies que controla: web pixels, eventos de cliente, audiencias y checkout.

Este artículo muestra cómo confirmar que la señal llega a tu propia tienda. También enumera comprobaciones que parecen fallos pero no lo son.

Para saber cómo se comporta la integración, consulta [Cómo funciona la app con la Customer Privacy API de Shopify](/es/article/como-funciona-la-app-con-la-customer-privacy-api-de-shopify-eg3kac/). La referencia de Shopify es la [Customer Privacy API](https://shopify.dev/docs/api/customer-privacy).

|| Esta guía está escrita para una tienda Shopify normal (tema de Online Store). En una tienda headless o personalizada se aplican las mismas comprobaciones, con algunos límites prácticos. Lee Tiendas headless y personalizadas antes de empezar.

### Cómo funciona

El trabajo de la app en esta integración es pasar la decisión del visitante a Shopify, de forma correcta e inmediata. Todo lo que ocurre después corresponde a Shopify: cargar o retener web pixels en la tienda y en el checkout, controlar canales de venta como Google & YouTube o Meta, y aplicar el consentimiento a los eventos de cliente, las audiencias y el checkout.

Son sistemas propiedad de Shopify que leen el consentimiento de la propia API de Shopify. Una vez que las comprobaciones siguientes muestren que la señal llega, la app ha hecho lo que debe hacer.

`setTrackingConsent()` es la forma documentada de que una app comunique a Shopify lo que ha decidido un visitante. Pandectes la llama. Esa llamada es la interfaz entre la app y Shopify.

### Puntos clave

* Usa `currentVisitorConsent()` para verificar la decisión sin procesar del visitante (`''`, `'yes'` o `'no'`).
* Los métodos `Allowed()` mezclan los ajustes del comerciante, la ubicación y el consentimiento. Un `true` o `false` por sí solo no demuestra que el visitante haya decidido algo.
* `shouldShowBanner()` es una comprobación de región. Puede seguir siendo `true` tras Accept.
* No leas las cookies de Shopify, `dataLayer` ni las solicitudes de red para juzgar esta integración.
* La primera comprobación no instala nada. El fragmento del tema y el píxel de prueba son temporales. Elimínalos cuando termines.

| ¿Tienes prisa? Haz solo la Comprobación rápida en la consola. Si los valores pasan de vacíos a `'yes'` cuando haces clic en Accept, la integración está escribiendo el consentimiento en Shopify.

### Antes de empezar

Tres cosas, o los resultados serán engañosos:

1. **Usa un perfil de navegador limpio.** Abre una ventana nueva de incógnito o privada, o borra las cookies y el almacenamiento local de tu dominio. Si ya diste el consentimiento, el banner no volverá a preguntar y solo verás el estado «después».
2. **Haz la prueba como visitante de una región donde se exige consentimiento** (por ejemplo, la UE/EEE/Reino Unido, si así está configurado tu banner). En las regiones donde Shopify no está configurado para exigir consentimiento, todo se permite de forma predeterminada y la prueba no demuestra nada.
3. **Asegúrate de que el app embed de Pandectes esté activado** en tu tema. La integración de Shopify Customer Privacy está siempre activa y no tiene ningún ajuste para activarla.

Abre la **consola de desarrollador** del navegador:

* **Chrome / Edge:** pulsa `F12` y abre la pestaña **Console**
* **Firefox:** pulsa `F12` y abre la pestaña **Console**
* **Safari:** activa el menú *Develop* en Settings → Advanced y luego pulsa `Option + Command + C`

||| La primera comprobación no instala nada. Los dos fragmentos siguientes son herramientas de diagnóstico temporales. Elimínalos en cuanto termine la verificación. Están pensados para ejecutarse unos minutos en tu pantalla, no para quedarse en una tienda en vivo.

### Qué envía Pandectes a Shopify

La API de Shopify usa cuatro finalidades. Pandectes asigna sus categorías de cookies a ellas:

| Categoría de Pandectes | Finalidad de Shopify |
| --- | --- |
| Functionality / Preferences | `preferences` |
| Performance / Analytics | `analytics` |
| Targeting / Marketing | `marketing` |
| Sale of data opt-out (Do not sell my data) | `sale_of_data` |

Las cookies estrictamente necesarias no tienen equivalente. Siempre están permitidas y no forman parte de esta escritura de consentimiento.

### Opción 1: Comprobación rápida en la consola

No necesitas instalar nada. Basta con un comando, ejecutado tres veces.

**Paso 1.** Abre tu tienda en una ventana nueva de incógnito. Aparece el banner. No hagas clic en nada.

**Paso 2.** Abre la consola, pega esto y pulsa Enter:

```javascript
window.Shopify.customerPrivacy.currentVisitorConsent();
```

Deberías obtener cuatro cadenas vacías. Es la forma que tiene Shopify de decir que el visitante todavía no ha decidido:

```javascript
{marketing: '', analytics: '', preferences: '', sale_of_data: ''}
```

**Paso 3.** Haz clic en **Accept all** en el banner y ejecuta de nuevo el mismo comando:

```javascript
{marketing: 'yes', analytics: 'yes', preferences: 'yes', sale_of_data: ''}
```

**Paso 4.** Recarga la página y ejecútalo por última vez. Los valores deben seguir ahí.

Vacío antes de la decisión, relleno justo después y todavía relleno en la siguiente carga de página. Esa es la verificación. Si en su lugar haces clic en **Reject all**, obtienes `'no'` en lugar de `'yes'`. Es igualmente correcto: al visitante se le preguntó y dijo que no.

Solo `preferences`, `analytics` y `marketing` necesitan cambiar. `sale_of_data` puede quedarse vacío. Es normal. Consulta la nota en Qué no debes usar para verificar.

|| Si el comando devuelve un error que dice que `customerPrivacy` no está definido, la API aún no ha terminado de cargarse. Espera un momento e inténtalo de nuevo, o ejecuta esto una vez antes:

```javascript
window.Shopify.loadFeatures([{name: 'consent-tracking-api', version: '0.1'}], () => {});
```

#### Por qué currentVisitorConsent y no marketingAllowed

Es habitual que los comerciantes comprueben solo esto:

```javascript
window.Shopify.customerPrivacy.preferencesProcessingAllowed();  // true / false
```

Ese método es útil, pero solo puede responder `true` o `false`. La documentación de Shopify explica que estos métodos combinan los ajustes del comerciante, la ubicación del usuario y el consentimiento del usuario.

Así que `false` puede significar que el visitante lo rechazó, o que el visitante está en una región donde se exige consentimiento y todavía no ha respondido. `true` puede significar que el visitante aceptó, o que esa región no exige consentimiento. El valor booleano por sí solo no puede decirte si el visitante ha decidido algo.

`currentVisitorConsent()` devuelve las preferencias seleccionadas por el usuario y no mezcla la ubicación ni la configuración del comerciante:

```javascript
window.Shopify.customerPrivacy.currentVisitorConsent();
// → {marketing: 'yes', analytics: 'no', preferences: 'yes', sale_of_data: ''}
```

| Valor | Significado |
| --- | --- |
| `''` (cadena vacía) | El visitante todavía no ha concedido ni denegado el consentimiento |
| `'yes'` | El visitante concedió el consentimiento de forma activa |
| `'no'` | El visitante denegó el consentimiento de forma activa |

Vacío antes de que el visitante decida, relleno después. Esa transición es la prueba de que Pandectes escribió la decisión en Shopify.

### Opción 2: Prueba en pantalla desde el tema

Este fragmento automatiza la Comprobación rápida en la consola. Imprime el estado del consentimiento en la consola cuando se carga la página y otra vez cuando el visitante decide. Solo lee y registra. No cambia nada.

#### Dónde pegar el fragmento del tema

1. Shopify admin → **Online Store → Themes**
2. En tu tema en vivo haz clic en **… → Edit code** *(más seguro: **Duplicate** el tema primero y haz la prueba en la copia)*
3. Abre `layout/theme.liquid`
4. Pega el fragmento **justo antes de la etiqueta de cierre `</body>`**
5. **Save**

```html
{% comment %} PANDECTES CONSENT CHECK: temporary, remove after testing {% endcomment %}
<script>
(function () {
  var pandectesTag = '[Pandectes theme check]';

  function pandectesSnapshot(label) {
    var cp = window.Shopify && window.Shopify.customerPrivacy;
    if (!cp) {
      console.warn(pandectesTag, label, 'API not available');
      return;
    }

    var consent = cp.currentVisitorConsent();

    console.log('%c' + pandectesTag + ' ' + label, 'font-weight:bold;color:#0a7');
    console.table({
      'currentVisitorConsent().preferences' : consent.preferences,
      'currentVisitorConsent().analytics'   : consent.analytics,
      'currentVisitorConsent().marketing'   : consent.marketing,
      'currentVisitorConsent().sale_of_data': consent.sale_of_data,
      'preferencesProcessingAllowed()'      : cp.preferencesProcessingAllowed(),
      'analyticsProcessingAllowed()'        : cp.analyticsProcessingAllowed(),
      'marketingAllowed()'                  : cp.marketingAllowed(),
      'saleOfDataAllowed()'                 : cp.saleOfDataAllowed()
    });
  }

  document.addEventListener('visitorConsentCollected', function (event) {
    console.log(pandectesTag, 'visitorConsentCollected →', event.detail);
    pandectesSnapshot('AFTER the visitor decided');
  });

  (function pandectesWaitForShopify(tries) {
    tries = tries || 0;
    if (window.Shopify && window.Shopify.loadFeatures) {
      window.Shopify.loadFeatures(
        [{ name: 'consent-tracking-api', version: '0.1' }],
        function (error) {
          if (error) {
            console.error(pandectesTag, 'could not load the Customer Privacy API', error);
            return;
          }
          pandectesSnapshot('ON PAGE LOAD');
        }
      );
      return;
    }
    if (tries > 100) {
      console.error(pandectesTag, 'window.Shopify.loadFeatures never became available');
      return;
    }
    setTimeout(function () { pandectesWaitForShopify(tries + 1); }, 100);
  })();
})();
</script>
```

#### Cómo ejecutar la prueba del tema

Abre tu tienda en una **ventana nueva de incógnito**, abre la **consola** y sigue estos tres pasos.

**Paso 1: antes de tocar el banner**

El banner está en pantalla. No has hecho clic en nada. Busca la tabla `ON PAGE LOAD`.

| Qué deberías ver | Significado |
| --- | --- |
| `currentVisitorConsent().preferences` → `""` *(vacío)* | Todavía no hay decisión |
| `currentVisitorConsent().analytics` → `""` *(vacío)* | Todavía no hay decisión |
| `currentVisitorConsent().marketing` → `""` *(vacío)* | Todavía no hay decisión |
| `preferencesProcessingAllowed()` → `false` | No se permite nada que no sea esencial |
| `analyticsProcessingAllowed()` → `false` | No se permite nada que no sea esencial |
| `marketingAllowed()` → `false` | No se permite nada que no sea esencial |

Lo importante son las cadenas vacías. Shopify está diciendo que este visitante todavía no ha decidido.

**Paso 2: haz clic en un botón del banner**

Haz clic en **Accept all**. Deben aparecer de inmediato dos cosas en la consola:

1. Una línea `visitorConsentCollected → {marketingAllowed: true, saleOfDataAllowed: …, analyticsAllowed: true, preferencesAllowed: true}`
2. Una segunda tabla, `AFTER the visitor decided`:

| Qué deberías ver | Significado |
| --- | --- |
| `currentVisitorConsent().preferences` → `"yes"` | Consentimiento concedido de forma activa |
| `currentVisitorConsent().analytics` → `"yes"` | Consentimiento concedido de forma activa |
| `currentVisitorConsent().marketing` → `"yes"` | Consentimiento concedido de forma activa |
| `preferencesProcessingAllowed()` → `true` | El tratamiento ahora está permitido |
| `analyticsProcessingAllowed()` → `true` | El tratamiento ahora está permitido |
| `marketingAllowed()` → `true` | El tratamiento ahora está permitido |

Si en su lugar haces clic en **Reject all**, los valores pasan a `"no"` y los métodos `Allowed()` siguen en `false`. `"no"` no es lo mismo que `""`: al visitante se le preguntó y dijo que no.

**Paso 3: recarga la página**

Recarga y mira la nueva tabla `ON PAGE LOAD`. Los valores del Paso 2 deben seguir ahí. Eso demuestra que Shopify almacenó la decisión y la devuelve en las páginas posteriores.

Si los Pasos 1, 2 y 3 se comportan como se ha indicado, la integración está escribiendo el consentimiento en Shopify.

||| Ahora elimina el fragmento de `layout/theme.liquid` y guarda. No lo dejes en un tema en vivo. Es una herramienta de pruebas, no forma parte de tu tienda.

### Opción 3: Prueba del píxel de Shopify

El fragmento del tema demuestra que Shopify registró la decisión. Este segundo fragmento demuestra que la decisión llega a los web pixels de Shopify (Google & YouTube, Meta, Klaviyo y cualquier píxel personalizado).

Los píxeles se ejecutan dentro de un sandbox, separado de tu tema. Shopify les entrega directamente el estado del consentimiento. El fragmento crea un pequeño píxel de prueba que informa de lo que recibió.

#### Dónde pegar el fragmento del píxel

1. Shopify admin → **Settings → Customer events**
2. Haz clic en **Add custom pixel** y ponle el nombre `Pandectes consent check`
3. En **Customer privacy**, establece **Permission** en **Not required**, para que este píxel de prueba siempre se ejecute y pueda informar también del estado «antes»
4. Pega el código, haz clic en **Save** y luego en **Connect**

```javascript
// Pandectes consent check. TEMPORARY test pixel. Disconnect and delete when finished.
const pandectesTag = '[Pandectes pixel check]';

function pandectesLog(label, cp) {
  console.log(pandectesTag + ' ' + label, {
    preferencesProcessingAllowed: cp.preferencesProcessingAllowed,
    analyticsProcessingAllowed:   cp.analyticsProcessingAllowed,
    marketingAllowed:             cp.marketingAllowed,
    saleOfDataAllowed:            cp.saleOfDataAllowed
  });
}

let pandectesConsentState = init.customerPrivacy;
pandectesLog('state when the pixel started', pandectesConsentState);

api.customerPrivacy.subscribe('visitorConsentCollected', (event) => {
  pandectesConsentState = event.customerPrivacy;
  pandectesLog('state after the visitor decided', pandectesConsentState);
});

analytics.subscribe('page_viewed', (event) => {
  pandectesLog('state at page_viewed', pandectesConsentState);
});
```

|| ¿Por qué los nombres de variable tan largos? El sandbox de píxeles ya define globales como `status` y `name`, por lo que un simple `let status = …` se notifica como una redefinición. Todos los nombres de ambos fragmentos llevan el prefijo `pandectes`. Mantenlos tal como están.

#### Qué deberías ver en la prueba del píxel

De nuevo en una ventana nueva de incógnito con la consola abierta:

| Momento | Registro esperado |
| --- | --- |
| Se carga la página, el banner es visible, no se ha hecho clic en nada | `state when the pixel started` → `preferencesProcessingAllowed`, `analyticsProcessingAllowed` y `marketingAllowed` todos en `false` |
| Haces clic en **Accept all** | `state after the visitor decided` → los mismos tres ahora están en `true` |
| Recargas la página | `state when the pixel started` → los tres siguen en `true` |

`saleOfDataAllowed` no forma parte de esta comprobación. Fuera de las regiones con exclusión de venta de datos, puede ser `true` desde el principio. Es lo esperado.

|| Estas líneas proceden del sandbox de píxeles de Shopify, por lo que en Chrome aparecen con un origen `web-pixels…sandbox` a su lado. Si no las ves, asegúrate de que el filtro de la consola no esté configurado en «selected context only» y de que no haya texto escrito en el cuadro de filtro.

Si esos tres valores pasan de `false` a `true` cuando haces clic en Accept, Shopify está entregando el estado del consentimiento a los píxeles.

||| Desconecta y elimina este píxel de prueba en cuanto termines. Está configurado para ejecutarse sin consentimiento, por lo que no debe quedarse en una tienda en vivo.

### Una vez que la señal llega, el resto es cosa de Shopify

Los web pixels de Shopify se ejecutan dentro de iframes aislados de origen cruzado que controla Shopify. Ninguna app de consentimiento puede iniciarlos, detenerlos ni cambiar lo que envían. La señal de consentimiento es la palanca que existe.

La verificación se divide en dos:

1. **¿Llega la señal?** Eso es lo que responden las comprobaciones anteriores. Esa es la parte de la que es responsable Pandectes.
2. **¿Actúa Shopify según la señal?** Esa es una cuestión de Shopify, que se responde en los ajustes de Shopify y, si hace falta, con el soporte de Shopify.

Si `currentVisitorConsent()` pasa de vacío a `'yes'` o `'no'` cuando el visitante hace clic, la app ha cumplido su función. Si después de eso un píxel o un canal sigue comportándose de una forma que no esperabas, mira en el lado de Shopify:

| Quién | Qué hace |
| --- | --- |
| **Pandectes** | Muestra el banner, recoge la decisión y la escribe en Shopify mediante `setTrackingConsent()` |
| **Shopify** | Decide qué web pixels se cargan en la tienda y en el checkout, controla los canales de venta y aplica el consentimiento a los eventos de cliente, las audiencias y el checkout |

* **Settings → Customer events:** cada píxel tiene su propio ajuste **Customer privacy → Permission**. Un píxel configurado como *Not required* se ejecutará independientemente del consentimiento, porque eso es lo que la tienda le indicó a Shopify.
* **La configuración propia de cada canal de venta.** El canal Google & YouTube, por ejemplo, construye su propia señal de consentimiento de Google a partir de la API de Shopify. Esa traducción es código de Shopify.
* **El soporte de Shopify**, para cualquier cosa que quede una vez que la API contiene el valor correcto.

Piénsalo como un interruptor de luz: Pandectes es el interruptor, Shopify es el cableado y las lámparas. Una vez que has verificado que el interruptor cambia de posición, una lámpara que sigue encendida es una cuestión de cableado.

### Tiendas headless y personalizadas

La misma API, los mismos métodos y el mismo significado de `''`, `'yes'` y `'no'` se aplican en una tienda headless. La Comprobación rápida en la consola funciona sin cambios. Lo que cambia es cómo ejecutas los dos fragmentos, además de un ajuste adicional.

#### No tienes theme.liquid

Las páginas de tu tienda son código propio, así que no hay dónde pegar el fragmento del tema tal como está. Hay dos opciones:

**Opción A: pégalo en la consola del navegador (no hay nada que desplegar).**
Copia todo lo que hay entre `<script>` y `</script>` en el fragmento del tema, abre tu tienda en una ventana de incógnito limpia con el banner visible, pégalo en la consola y pulsa Enter. Obtienes la tabla `ON PAGE LOAD` de inmediato, y la tabla `AFTER the visitor decided` cuando haces clic en el banner.

|| El código de la consola se borra al recargar la página. Para el paso de recarga, recarga primero y luego pega el fragmento de nuevo para leer los valores almacenados.

**Opción B: ponlo en tu propio layout raíz.**
Añade el mismo bloque `<script>` a lo que se renderice en todas las páginas: el layout raíz en Hydrogen o Next.js, `index.html` en una app Vite/React, etc. Elimínalo cuando termines las pruebas.

#### El fragmento 2 se ejecuta en el checkout, no en tu tienda

Los web pixels de Shopify no se ejecutan en las páginas que alojas tú mismo. Se ejecutan en las superficies que posee Shopify: el **checkout** y la **página de estado del pedido / de agradecimiento**. Para ver la salida del fragmento del píxel, añade un producto al carrito y continúa al checkout con la consola abierta. La decisión de consentimiento tomada en tu tienda ya debería estar establecida cuando se inicie el píxel.

#### Un ajuste adicional: tus dos dominios

En una tienda headless, Shopify necesita los dominios de la tienda y del checkout antes de poder registrar el consentimiento. La documentación de Shopify exige estos valores para tiendas personalizadas:

* `headlessStorefront`
* `storefrontRootDomain`
* `checkoutRootDomain`
* `storefrontAccessToken`

Pandectes los envía con cada escritura de consentimiento, desde la configuración de tu app. Si faltan o son incorrectos en el admin de Pandectes, la escritura en Shopify no puede tener éxito y `currentVisitorConsent()` seguirá devolviendo cadenas vacías. Si falla tu prueba en headless, comprueba esto primero.

Los dominios también tienen que formar una pareja coincidente: el dominio de la tienda y el del checkout deben pertenecer a la misma tienda, de modo que la decisión tomada en la tienda sea la que vea el checkout.

### Qué no debes usar para verificar

Estas comprobaciones miden otra cosa o no forman parte de la API documentada.

#### No esperes que shouldShowBanner pase a false tras el consentimiento

Muchos comerciantes esperan que `shouldShowBanner()` sea `true` antes del consentimiento y `false` después, e informan de un error cuando sigue siendo `true`.

No es un método de consentimiento. Shopify lo documenta como un indicador de si el cliente actual está en una región configurada para mostrar un banner de cookies. Un visitante alemán sigue estando en Alemania tras Accept, así que la respuesta sigue siendo `true`. Que `shouldShowBanner()` siga siendo `true` tras el consentimiento es lo esperado.

Lo mismo se aplica a `saleOfDataRegion()`, que indica si el cliente actual está en una región configurada para la exclusión de venta de datos. También es una comprobación de región.

#### No confíes en getTrackingConsent, getRegulation ni isRegulationEnforced

Estos no aparecen en la documentación de la Customer Privacy API de Shopify. Son valores internos que Shopify puede cambiar o eliminar. En particular, que `getTrackingConsent()` devuelva `"yes"` antes del consentimiento no es prueba de que se haya concedido nada.

#### No uses userCanBeTracked ni userDataCanBeSold

Existen, pero Shopify los incluye en la documentación heredada y dice que no se empiecen nuevas integraciones con ellos. Usa en su lugar `currentVisitorConsent()` y los cuatro métodos `Allowed()`.

#### No busques una cookie _tracking_consent en document.cookie

La documentación de Shopify dice que no se lean ni se modifiquen directamente las cookies de Shopify. Shopify no promete que su cookie de consentimiento sea legible desde JavaScript, que tenga un nombre concreto ni que exista en una versión determinada. No encontrarla no demuestra nada.

#### No juzgues la app según si un píxel o una solicitud de red sigue disparándose

Que una solicitud salga del navegador es un resultado de Shopify. Si la señal de consentimiento es correcta y un píxel de Shopify sigue disparándose, a Shopify se le comunicó lo correcto y decidió ejecutar el píxel, normalmente porque el **Permission** de ese píxel es *Not required* en **Settings → Customer events**, o porque el canal de venta está configurado para ejecutarse sin consentimiento. Corrígelo ahí.

#### No compares entradas de window.dataLayer

`dataLayer` es Google Consent Mode, un sistema distinto de la Customer Privacy API de Shopify. Pandectes escribe en ambos, y el canal Google & YouTube de Shopify también escribe sus propias entradas. Es normal que haya varias entradas `consent` y no verifican la API de Shopify.

#### No esperes una llamada a setTrackingConsent en cada carga de página

Pandectes solo escribe en Shopify cuando cambia el estado. Si Shopify ya contiene la misma decisión, la app no la vuelve a enviar. En una recarga tras el consentimiento, deberías ver los valores almacenados pero ninguna escritura nueva.

#### No te preocupes porque sale_of_data siga vacío

`sale_of_data` es relevante donde se aplica una exclusión de venta de datos (principalmente ciertos estados de EE. UU.). Si el visitante no está en una región así, o *Do not sell my data* no está activado en Pandectes, este campo se omite de lo que envía Pandectes. Un `sale_of_data` vacío para un visitante de la UE es lo esperado.

### Referencia rápida: los métodos documentados

| Método | Devuelve | Qué te indica |
| --- | --- | --- |
| `currentVisitorConsent()` | `{preferences, analytics, marketing, sale_of_data}` cada uno `'yes'` / `'no'` / `''` | La decisión propia del visitante. Usa este. |
| `preferencesProcessingAllowed()` | `true` / `false` | Si se permite el tratamiento de preferencias (región + ajustes + consentimiento combinados) |
| `analyticsProcessingAllowed()` | `true` / `false` | Si se permite el tratamiento analítico (región + ajustes + consentimiento combinados) |
| `marketingAllowed()` | `true` / `false` | Si se permite el marketing (región + ajustes + consentimiento combinados) |
| `saleOfDataAllowed()` | `true` / `false` | Si se permite compartir datos con terceros |
| `shouldShowBanner()` | `true` / `false` | Solo región: si se debe mostrar un banner en esta región |
| `saleOfDataRegion()` | `true` / `false` | Solo región: si aquí se aplica una exclusión de venta de datos |
| `getRegion()` | p. ej. `"DEHH"` | La ubicación del visitante, en formato ISO 3166-2 |
| Evento `visitorConsentCollected` | `{marketingAllowed, saleOfDataAllowed, analyticsAllowed, preferencesAllowed}` | Se dispara cada vez que cambia el consentimiento |

### Si la prueba realmente falla

Primero decide qué mitad ha fallado.

**Si la señal es correcta**, es decir, `currentVisitorConsent()` pasa de vacío a `'yes'` o `'no'` cuando haces clic, entonces la app está escribiendo el consentimiento. Todo lo demás corresponde a Shopify. Comprueba el **Permission** de cada píxel en **Settings → Customer events**, luego la configuración de los canales de venta y después el soporte de Shopify.

**Si falta la señal**, es decir, `currentVisitorConsent()` sigue devolviendo cadenas vacías después de que hayas hecho clic en un botón del banner, comprueba en este orden:

1. El app embed de Pandectes está activado en el tema que estás probando (Online Store → Themes → Customize → App embeds).
2. Estás probando el tema en vivo, no una vista previa de otro.
3. No hay otra app de consentimiento instalada. Dos apps de consentimiento que escriben en la misma API entrarán en conflicto. Solo puede haber una activa.
4. No estás en una sesión de vista previa del admin, que puede comportarse de forma distinta a una visita real.
5. Solo tiendas headless: el dominio de la tienda, el dominio del checkout y el storefront access token están rellenados correctamente en el admin de Pandectes.

¿Sigue fallando? Contacta con **support@pandectes.io** e incluye:

* el dominio de tu tienda (y, en headless, tus dominios de tienda y de checkout)
* el país del visitante desde el que hiciste la prueba
* la salida de la consola de la Comprobación rápida o del fragmento del tema, en los tres momentos (antes de hacer clic / después de hacer clic / después de recargar)

### Limpieza al terminar

No te saltes este paso. La Comprobación rápida en la consola no instala nada. Ambos fragmentos son temporales.

1. **Fragmento del tema:** abre `layout/theme.liquid`, elimina el bloque que empieza por `{% comment %} PANDECTES CONSENT CHECK` y haz clic en **Save**. Si hiciste la prueba en un tema duplicado, puedes eliminar esa copia del tema.
2. **Fragmento del píxel:** ve a **Settings → Customer events**, abre `Pandectes consent check`, haz clic en **Disconnect** y luego en **Delete**.
3. **Tiendas headless:** si añadiste el script a tu propio layout, elimínalo y vuelve a desplegar. Si usaste la consola del navegador, basta con cerrar la pestaña.

Por qué es importante:

* El fragmento del tema imprime detalles del consentimiento en la consola de cada visitante, en cada página, hasta que lo elimines.
* El píxel de prueba está configurado con **Permission: Not required**, por lo que se ejecuta antes del consentimiento por diseño. Eso es correcto para una prueba breve e incorrecto para una tienda en vivo.
* Ambos añaden trabajo a cada carga de página sin ningún beneficio una vez terminada la verificación.

Eliminarlos no cambia la integración. La app sigue comunicando el consentimiento a Shopify como antes.

### Resumen

Verifica esta integración con `currentVisitorConsent()`. Cadenas vacías antes de una elección, `'yes'` o `'no'` inmediatamente después y los mismos valores tras recargar significan que Pandectes escribió la decisión en Shopify. La carga de píxeles, los canales de venta y el comportamiento del checkout a partir de ese punto son responsabilidad de Shopify. Elimina los fragmentos temporales del tema o del píxel cuando termines.