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. La referencia de Shopify es la Customer Privacy API.
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. Untrueofalsepor sí solo no demuestra que el visitante haya decidido algo. shouldShowBanner()es una comprobación de región. Puede seguir siendotruetras Accept.- No leas las cookies de Shopify,
dataLayerni 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.
'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:
- 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».
- 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.
- 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
F12y abre la pestaña Console - Firefox: pulsa
F12y abre la pestaña Console - Safari: activa el menú Develop en Settings → Advanced y luego pulsa
Option + Command + C
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 |
|
Performance / Analytics |
|
Targeting / Marketing |
|
Sale of data opt-out (Do not sell my 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:
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:
{marketing: '', analytics: '', preferences: '', sale_of_data: ''}
Paso 3. Haz clic en Accept all en el banner y ejecuta de nuevo el mismo comando:
{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.
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:window.Shopify.loadFeatures([{name: 'consent-tracking-api', version: '0.1'}], () => {});
Por qué currentVisitorConsent y no marketingAllowed
Es habitual que los comerciantes comprueben solo esto:
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:
window.Shopify.customerPrivacy.currentVisitorConsent();
// → {marketing: 'yes', analytics: 'no', preferences: 'yes', sale_of_data: ''}
Valor | Significado |
|---|---|
| El visitante todavía no ha concedido ni denegado el consentimiento |
| El visitante concedió el consentimiento de forma activa |
| 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
- Shopify admin → Online Store → Themes
- En tu tema en vivo haz clic en … → Edit code (más seguro: Duplicate el tema primero y haz la prueba en la copia)
- Abre
layout/theme.liquid - Pega el fragmento justo antes de la etiqueta de cierre
</body> - Save
{% 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 |
|---|---|
| Todavía no hay decisión |
| Todavía no hay decisión |
| Todavía no hay decisión |
| No se permite nada que no sea esencial |
| No se permite nada que no sea esencial |
| 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:
- Una línea
visitorConsentCollected → {marketingAllowed: true, saleOfDataAllowed: …, analyticsAllowed: true, preferencesAllowed: true} - Una segunda tabla,
AFTER the visitor decided:
Qué deberías ver | Significado |
|---|---|
| Consentimiento concedido de forma activa |
| Consentimiento concedido de forma activa |
| Consentimiento concedido de forma activa |
| El tratamiento ahora está permitido |
| El tratamiento ahora está permitido |
| 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.
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
- Shopify admin → Settings → Customer events
- Haz clic en Add custom pixel y ponle el nombre
Pandectes consent check - 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»
- Pega el código, haz clic en Save y luego en Connect
// 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);
});
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 |
|
Haces clic en Accept all |
|
Recargas la página |
|
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.
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.
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:
- ¿Llega la señal? Eso es lo que responden las comprobaciones anteriores. Esa es la parte de la que es responsable Pandectes.
- ¿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 |
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.
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:
headlessStorefrontstorefrontRootDomaincheckoutRootDomainstorefrontAccessToken
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 |
|---|---|---|
|
| La decisión propia del visitante. Usa este. |
|
| Si se permite el tratamiento de preferencias (región + ajustes + consentimiento combinados) |
|
| Si se permite el tratamiento analítico (región + ajustes + consentimiento combinados) |
|
| Si se permite el marketing (región + ajustes + consentimiento combinados) |
|
| Si se permite compartir datos con terceros |
|
| Solo región: si se debe mostrar un banner en esta región |
|
| Solo región: si aquí se aplica una exclusión de venta de datos |
| p. ej. | La ubicación del visitante, en formato ISO 3166-2 |
Evento |
| 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:
- El app embed de Pandectes está activado en el tema que estás probando (Online Store → Themes → Customize → App embeds).
- Estás probando el tema en vivo, no una vista previa de otro.
- 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.
- No estás en una sesión de vista previa del admin, que puede comportarse de forma distinta a una visita real.
- 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 [email protected] 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.
- Fragmento del tema: abre
layout/theme.liquid, elimina el bloque que empieza por{% comment %} PANDECTES CONSENT CHECKy haz clic en Save. Si hiciste la prueba en un tema duplicado, puedes eliminar esa copia del tema. - Fragmento del píxel: ve a Settings → Customer events, abre
Pandectes consent check, haz clic en Disconnect y luego en Delete. - 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.
Actualizado el: 19/10/2026
¡Gracias!
