Saltar al contenido

GuíasShopify8 min de lectura

Arreglar el evento purchase de GA4 en Shopify (paso a paso)

Cómo se dispara hoy purchase en Shopify, por qué Additional Scripts ya no funciona y los límites de enviar un purchase de GA4 desde un píxel personalizado.

Publicado
Revisado
Reparar el evento de compra y verificar el pedido completado.

Daniil MaximkinIngeniero de producto y soluciones

Respuesta corta

Shopify publica checkout_completed mediante Customer Events, aislado de tu tema. Empiezo por la app Google & YouTube, la opción compatible para medir compras en GA4: Google no admite etiquetas de Google dentro de píxeles personalizados de Shopify. Usa una sola ruta de compra, comprueba transaction_id, value, currency e items y concilia con los pedidos de Shopify.

— Daniil

Conclusiones clave

  • Shopify dispara el purchase a través de Customer Events (web pixels) en un sandbox: el código en Additional Scripts o checkout.liquid ya no puede enviarlo a GA4.
  • El 28 de agosto de 2025 fue la fecha de retirada para Plus; las tiendas no Plus debían actualizar sus páginas Thank you y Order status antes del 26 de agosto de 2026. Additional Scripts pasó a ser de solo lectura el 28 de agosto de 2025.
  • Google no admite etiquetas de Google dentro de píxeles personalizados de Shopify. Revisa la app Google & YouTube antes de mantener una implementación personalizada experimental.
  • La deduplicación depende de un transaction_id consistente y, sobre todo, de disparar el purchase desde exactamente una ruta: nunca el canal nativo de GA4 y un píxel personalizado a la vez.
  • Verifica dentro de los límites del sandbox: DebugView y Realtime para el evento en vivo y conciliación de pedidos para comprobar la cobertura después de que se hayan procesado los informes.
En esta guía

Si tu tienda de Shopify enviaba antes compras a GA4 y ahora no envía nada, o las envía dos veces, comprueba dónde se recoge el evento purchase. Esta guía explica la ruta actual de Shopify, las ubicaciones de scripts retiradas y los límites de un píxel personalizado.

¿Cómo dispara Shopify el evento purchase hoy?

Shopify trasladó el checkout a un modelo extensible, y el tracking se trasladó con él. En lugar de inyectar scripts en las páginas de checkout, registras un píxel que se suscribe a los eventos que emite Shopify: page views, product views, add-to-cart y, para el pedido completado, checkout_completed.

El hecho arquitectónico importante es el sandbox. Los píxeles personalizados no se ejecutan en la página de tu storefront. Se ejecutan en un contexto aparte y restringido, con su propio window, aislado de los scripts de tu tema. Es algo deliberado: impide que los píxeles de terceros lean todo lo que hay en la página. Pero tiene dos consecuencias que hacen tropezar a casi todas las configuraciones rotas que veo:

  • Un contenedor de GTM o un fragmento de gtag cargado por tu tema no puede ver los eventos de checkout, porque el píxel y el tema viven en contextos distintos.
  • Todo lo que quieras enviar desde el checkout —tu etiqueta de GA4 incluida— debe cargarse dentro del propio píxel, o reenviarse desde Shopify a un servidor.

Una vez que interiorizas eso, los síntomas antiguos cobran sentido: el motivo por el que el GTM de tu tema dejó de capturar compras no es un error, es el sandbox haciendo su trabajo.

¿Qué ha pasado con Additional Scripts y checkout.liquid?

Dos métodos más antiguos siguen apareciendo en guías y en tiendas heredadas, y ambos son callejones sin salida.

  • Personalizaciones de checkout.liquid. Así inyectaban las tiendas Plus el tracking en el checkout. Esa ruta se ha retirado en favor de checkout extensibility.
  • Additional Scripts en las páginas Thank you y Order status era una ubicación heredada para el tracking. El 28 de agosto de 2025 fue la fecha de retirada para Plus. En las tiendas no Plus, Shopify convirtió Additional Scripts en un campo de solo lectura en esa fecha y exigió actualizar las páginas antes del 26 de agosto de 2026. Los script tags de Order status tuvieron las mismas fechas de retirada según el plan. Comprueba la versión de las páginas y los datos de pedidos en lugar de aplicar una sola fecha a todas las tiendas.

La conclusión práctica: si una tienda todavía tiene su etiqueta de purchase en Additional Scripts, comprueba si realmente se ejecuta y si otra integración envía el evento. Si ya no funciona, migra el evento ausente a un píxel compatible y verifícalo con un pedido de prueba y la conciliación de pedidos.

Los límites de una implementación con píxel personalizado

Google no admite etiquetas de Google dentro de píxeles personalizados de Shopify y recomienda la app Google & YouTube. Una etiqueta en el sandbox puede enviar datos mientras otras funciones fallan. Reviso la app compatible antes de elegir una implementación personalizada.

Lo siguiente es un ejemplo hipotético de píxel personalizado, no una configuración compatible con Google ni una implementación probada en producción. Muestra el mapeo de eventos para un checkout actualizado con descuentos por línea. Los descuentos a nivel de pedido y los precios con impuestos incluidos requieren comprobaciones aparte contra el pedido; este ejemplo no demuestra esos ajustes. El sandbox carga gtag por sí mismo en lugar de usar la etiqueta del tema.

// Shopify admin → Settings → Customer events → Add custom pixel
// This code runs in Shopify's pixel sandbox: it has its own window,
// isolated from your theme. A GTM/gtag snippet on the theme is NOT
// reachable here, so load gtag inside the pixel and fire from here.

const MEASUREMENT_ID = 'G-XXXXXXXXXX';

// 1) Load gtag.js into the sandbox and configure GA4
const s = document.createElement('script');
s.src = 'https://www.googletagmanager.com/gtag/js?id=' + MEASUREMENT_ID;
s.async = true;
document.head.appendChild(s);

window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
gtag('js', new Date());
gtag('config', MEASUREMENT_ID, { send_page_view: false });

// 2) Fire the purchase exactly once, when the checkout completes
analytics.subscribe('checkout_completed', (event) => {
  const checkout = event.data.checkout;
  if (!checkout.order?.id || !checkout.currencyCode || !checkout.lineItems?.length) return;

  const items = (checkout.lineItems || []).map((line) => ({
    item_id: line.variant && (line.variant.sku || line.variant.id),
    item_name: line.title,
    item_variant: line.variant && line.variant.title,
    price: line.finalLinePrice.amount / line.quantity,
    quantity: line.quantity,
  }));

  gtag('event', 'purchase', {
    transaction_id: checkout.order.id,
    value: items.reduce((sum, item) => sum + item.price * item.quantity, 0),
    currency: checkout.currencyCode,
    tax: checkout.totalTax && checkout.totalTax.amount,
    shipping:
      checkout.shippingLine &&
      checkout.shippingLine.price &&
      checkout.shippingLine.price.amount,
    items: items,
  });
});

Si en cambio lo canalizas a través de Google Tag Manager, el mismo bloque analytics.subscribe empuja un objeto equivalente a un dataLayer que lee un contenedor cargado dentro del píxel. La regla no cambia: la etiqueta de destino tiene que vivir en el sandbox junto con la suscripción, no en el tema. Para la mecánica de ese objeto, consulta la nota sobre el dataLayer.

¿Qué requiere el array items de GA4?

Google indica que items y transaction_id son parámetros obligatorios de purchase. Que llegue un evento sin ellos no demuestra que la implementación de ecommerce cumpla el esquema documentado.

Según la referencia de ecommerce de Google, cada artículo necesita al menos uno de item_id o item_name; enviar ambos facilita la revisión. price, quantity y item_variant hacen utilizables los informes de artículos. Algunas reglas que ahorran tiempo de depuración:

  • value es la suma de price × quantity de los artículos, sin impuestos ni envío. Usa precios unitarios con descuento y envía los impuestos y el envío en sus parámetros separados. Concilia la misma definición de valor con Shopify.
  • currency es obligatoria y debe ser un código ISO de tres letras. En tiendas multidivisa, envía la divisa en la que transaccionó realmente el cliente y asegúrate de que value esté en esa misma divisa.
  • item_id debe ser estable. Usa el SKU o el ID de variante de forma consistente, porque es la clave que GA4 usa para unir ítems entre eventos.

¿Cómo deduplica GA4 las compras de Shopify?

GA4 deduplica compras con el mismo transaction_id en flujos web. Google describe este comportamiento para transacciones del mismo usuario; no es una garantía entre distintos contextos de usuario ni en flujos de apps. Importan dos reglas:

  1. Dispara el purchase desde exactamente una ruta. El canal nativo de GA4 de Shopify y un píxel personalizado pueden enviar el mismo pedido con distintos contextos de usuario. Un ID de transacción coincidente no demuestra por sí solo que la deduplicación funcione. Elige una ruta y verifica el evento recibido.
  2. Nunca envíes un transaction_id vacío. GA4 deduplica juntos todos los purchase con un ID de transacción vacío, así que un valor en blanco no solo no ayuda: colapsa activamente pedidos reales en uno solo. Envía siempre el ID de pedido real.

Si ya has visto que GA4 está por encima de Shopify, la deduplicación es lo primero que debes mirar. El artículo complementario sobre por qué los ingresos de GA4 no coinciden con Shopify explica cómo detectar esos duplicados en la conciliación.

Protocolo de verificación

Verificar dentro del sandbox es distinto de verificar una página normal, y el primer instinto habitual —abrir GTM Preview o Tag Assistant— aquí no funciona en gran medida. Esta es la secuencia en la que confío.

  1. DebugView, con un pedido real. Pon un dispositivo de prueba en modo debug y completa un checkout real. Observa cómo llega el purchase a DebugView e inspecciona sus parámetros: ¿está transaction_id presente y no vacío?, ¿es correcto value?, ¿es correcta currency?, ¿contiene items los productos?
  2. Realtime como comprobación rápida. El purchase debería aparecer en el informe Realtime en unos instantes. Realtime confirma que el evento está llegando incluso cuando la conexión con DebugView es complicada.
  3. Acepta los límites de las herramientas. Tag Assistant y GTM Preview no pueden engancharse al sandbox del píxel como lo hacen a una página. No ver el evento ahí es lo esperado; no es prueba de que el píxel haya fallado. Juzga el éxito por DebugView y Realtime.
  4. Todas las rutas de pago, no una. Prueba la tarjeta estándar, Shop Pay, los pagos express o con cartera y las ofertas adicionales poscompra. Shopify emite checkout_completed una sola vez: normalmente en Thank you, pero en la primera página de oferta adicional en los flujos poscompra. Si esa página no se carga, no se emite el evento.
  5. Concilia después del procesamiento. Compara las compras de GA4 con los pedidos de Shopify por ID de transacción después de que se hayan procesado los informes. Google indica que el procesamiento puede tardar 24–48 horas. La conciliación mide la cobertura registrada; no demuestra que el navegador haya recogido todos los pedidos independientemente del consentimiento o de una página que no se haya cargado.

Modos de fallo habituales

  • Píxeles duplicados. El canal nativo de GA4 y un píxel personalizado pueden enviar compras duplicadas. Mantén una sola ruta y comprueba los ID y el contexto del usuario antes de concluir que los ingresos se han duplicado.
  • Rutas express ausentes. El purchase está vinculado a un flujo que Shop Pay o el express checkout se saltan, así que los pedidos de cartera nunca envían un purchase y desaparecen durante la conciliación. Es el mismo tipo de fallo que se trata en tracking de checkout de Shopify roto.
  • Bloqueo por consentimiento. Con un banner de consentimiento, puede denegarse el almacenamiento de analítica, así que el píxel no tiene permiso para enviar en el caso de esos visitantes. Es una pérdida legítima, no un error que haya que sortear con código. Esto abarca la implementación técnica, no asesoramiento legal; para el mecanismo, consulta consent mode v2.
  • Etiqueta obsoleta en Additional Scripts. El purchase está configurado en una ubicación de scripts retirada. Antes de cambiar la configuración, comprueba la versión de las páginas y si una app o un píxel sustituto ya envía el evento.
  • transaction_id vacío o que no coincide. Un ID en blanco colapsa los pedidos; un ID que difiere entre rutas anula por completo la deduplicación. Consulta el desglose relacionado de GA4 no registra las compras.

Limitaciones

Un píxel personalizado hereda los límites de la recogida en el navegador y no es la integración de Shopify compatible con Google. Sus requisitos de privacidad pueden bloquearlo mientras el consentimiento esté denegado. Una página que no se carga o el bloqueo del navegador también pueden impedir la recogida.

El sandbox también limita la depuración, así que la verificación se apoya en DebugView, Realtime y la conciliación en lugar de los inspectores habituales a nivel de página. Y un píxel arregla el purchase; por sí solo no repara eventos anteriores como add-to-cart si los rompió la misma migración del checkout.

Alternativas

Hay tres formas generales de enviar el purchase de Shopify, y no son mutuamente excluyentes.

  • Integración nativa de Shopify. La app Google & YouTube es la configuración compatible con Google. Comprueba si ya existe una etiqueta de compra personalizada antes de añadirla, para evitar que dos rutas envíen el mismo pedido.
  • Píxel personalizado con GTM o gtag (el ejemplo hipotético anterior). El código es tuyo, pero Google no admite esta configuración. Que un evento se envíe correctamente no demuestra que funcionen las demás características de las etiquetas de Google.
  • Lado del servidor. Una configuración server-side puede reenviar webhooks de pedidos de Shopify mientras los eventos del navegador aportan el contexto de sesión y consentimiento. Los webhooks no contienen cookies del navegador. La configuración necesita alojamiento, supervisión y un diseño de consentimiento; no elimina el requisito de consentimiento.

Si quieres que elija, verifique y concilie la ruta de compra por ti en lugar de mantenerla tú, ese es el alcance de mi trabajo de implementación de GA4; el método de verificación es la conciliación de pedidos.

Si la guía no lo resolvióEUR 375

Hago esta conciliación en tu tienda en solo lectura, por EUR 375 — veredicto por escrito dos días laborables después del kickoff.

Solicitar un Health Check

Preguntas

Preguntas que responde esta guía

¿Sigo necesitando el canal de ventas nativo de GA4 si uso un píxel personalizado?

Elige una sola ruta de compra. Dos integraciones pueden enviar solicitudes duplicadas; que GA4 cuente ambas depende de los ID de transacción y del contexto del usuario. La opción compatible de Google para Shopify es la app Google & YouTube, no las etiquetas de Google dentro de un píxel personalizado. Elimina las etiquetas de compra duplicadas y compara un pedido con el evento recibido.

¿Puedo usar el contenedor de GTM de mi tema para disparar el purchase de Shopify?

No para el nuevo checkout. Un contenedor de GTM en el tema no puede ver los eventos de checkout ni de Thank you, porque se ejecutan en un sandbox aparte. La opción compatible de Google es la app Google & YouTube. Cargar gtag o GTM dentro de un píxel personalizado puede enviar datos, pero Google no lo admite; la otra opción es enviar la compra desde el servidor.

¿Por qué Tag Assistant o GTM Preview no muestran mi evento purchase?

El píxel personalizado se ejecuta en un sandbox al que Tag Assistant y GTM Preview no pueden conectarse como a una página normal. Es una limitación de las herramientas, no una prueba de que el evento haya fallado. Comprueba GA4 DebugView y Realtime y revisa la cobertura después de que se hayan procesado los informes.

El purchase se dispara en el checkout con tarjeta pero no en Shop Pay ni en el express checkout. ¿Por qué?

Prueba cada ruta de pago por separado. Shopify dispara checkout_completed una sola vez, normalmente en Thank you o en la primera página de oferta adicional en los flujos poscompra. Si esa página no se carga, el evento no se dispara. Un evento ausente no basta para identificar un fallo de suscripción o de una app.

¿Qué debo usar como transaction_id?

Usa el ID o el nombre del pedido de Shopify, el mismo valor en todas las rutas y único por pedido. Nunca envíes una cadena vacía: GA4 deduplica juntos los purchase con un transaction_id vacío, lo que colapsa tus ingresos sin hacer ruido. Un ID consistente y no vacío es lo que hace que la deduplicación funcione.

Daniil Maximkin

Hola, soy Daniil.

Trabajo contigo desde la definición del problema hasta la implementación y la entrega. Hablas con quien hace el trabajo. Trabajo en inglés y ruso.

¿Lo has intentado y sigues atascado?

Describe tu tarea

La primera respuesta es gratis, en un día laborable. O escribe directamente: next@taskfordaniel.com