Cuando GA4 y Shopify muestran ingresos distintos, primero pregunto qué incluye cada total. La diferencia puede venir de las definiciones, los límites de fechas o la recogida. Comparo cada pedido y sus ajustes antes de llamarlo fallo de tracking.
¿Por qué pueden diferir los ingresos de GA4 y Shopify?
Distingo las diferencias de alcance de la recogida ausente o incorrecta. Estas comprobaciones pueden explicar una diferencia, pero ninguna establece la causa sin pruebas.
- Atribución y alcance. La atribución reparte el mérito de una compra entre puntos de contacto. Primero comparo los ingresos por compras de todos los canales, en lugar de un subtotal por canal o un recuento de sesiones. Un reparto distinto del mérito entre canales no cambia por sí solo esa suma de eventos de todos los canales.
- Zona horaria. Los metadatos del informe de GA4 indican su zona horaria; Shopify tiene un ajuste de zona horaria de la tienda independiente. Con ajustes distintos, una misma marca temporal puede caer en fechas distintas. El ejemplo sintético de abajo muestra ese límite de forma explícita.
- Configuración del consentimiento. El modo básico de consentimiento bloquea las etiquetas de Google tras una denegación. El modo avanzado puede enviar mediciones sin cookies. Distingo la conciliación de pedidos observados de los totales modelizados de los informes. Esto describe la recogida técnica, no asesoramiento legal.
- Recogida y controles de privacidad. Compruebo si la solicitud de compra se envió y se recibió, y si un control de privacidad o un fallo de etiqueta lo impidió. Una fila ausente del informe no permite distinguir esas posibilidades por sí sola.
- Fecha y envío de reembolsos. Shopify registra una anulación de venta como valor negativo en su fecha de procesamiento, que puede ser posterior al pedido. GA4 necesita un
refundregistrado para ajustar los ingresos por compras. Compruebo el tipo de anulación y su envío; no todos los reembolsos solo de dinero cambian las ventas de Shopify de la misma forma. - Conversión de divisas. En tiendas multidivisa, el valor enviado a GA4 puede estar en la divisa de presentación mientras Shopify informa en la de la tienda, o la conversión puede usar otro tipo de cambio. El recuento de pedidos puede coincidir aunque los ingresos no.
- Filtros de datos y umbrales. Los filtros de exclusión de datos activos excluyen permanentemente los eventos entrantes del procesamiento y de BigQuery. Los umbrales de datos, en cambio, ocultan filas de informes o exploraciones. Compruebo qué mecanismo se aplica; no son el mismo tipo de dato ausente.
¿Cuánta variación de ingresos entre GA4 y Shopify es normal?
La documentación enlazada no establece un porcentaje aceptable. El consentimiento, el alcance del informe y los pedidos del periodo afectan a la comparación. Valoro si cada diferencia está explicada, en lugar de llamar normal a un porcentaje.
Cualquier umbral usado para priorizar una conciliación es una regla de trabajo, no un estándar de las plataformas. La página de síntomas enlazada usa umbrales para priorizar; no los tomo como prueba de que la recogida sea correcta o defectuosa.
Uso tres patrones para decidir dónde investigar:
- La dirección se mantiene. Revisa las diferencias constantes de alcance, la recogida y el envío de reembolsos.
- Apareció en una fecha. Compara los cambios de configuración, consentimiento, tema y checkout alrededor de esa fecha. Un cambio de consentimiento también puede modificar la diferencia.
- Crece. Revisa los cambios en la composición de los pedidos, el alcance y la recogida. El crecimiento por sí solo no identifica un flujo de datos defectuoso.
Después concilio pedidos, comparo ajustes y busco pruebas a nivel de evento. Relacionar registros identifica diferencias; no explica automáticamente por qué falta un evento.
Árbol de decisión de diagnóstico
Usa estos patrones para elegir una comprobación. La columna central enumera posibles explicaciones, no diagnósticos.
Tabla comparativa — desplázate horizontalmente para ver todas las columnas
| Patrón observado | Posible explicación | Cómo verificarlo |
|---|---|---|
| GA4 inferior en general, porcentaje estable cada mes | Alcance, consentimiento o recogida distintos | Compara definiciones y pruebas de recogida por pedido; no deduzcas la causa solo del tráfico Unassigned o de la estabilidad |
| GA4 inferior solo desde una fecha concreta | Un cambio de configuración, consentimiento o checkout | Compara fechas de cambios; prueba el consentimiento, el envío por red y la configuración de depuración |
| GA4 inferior y la diferencia crece | Cambios en los pedidos, el alcance o una ruta de checkout defectuosa | Concilia los pedidos y prueba las rutas asociadas a los eventos ausentes |
| GA4 superior a Shopify | Pedidos de prueba, envío de reembolsos o envíos repetidos | Revisa qué pedidos se incluyen, los reembolsos y los IDs antes de asumir que los ingresos están duplicados |
| La diferencia oscila a diario pero se compensa en el mes | Límite de zona horaria y fecha de reembolsos | Alinea ambas exportaciones a la misma zona horaria y ventana de fechas |
| El recuento de pedidos coincide, pero los ingresos no | Conversión de divisas o parámetro value incorrecto | Verifica currency y value en el evento purchase |
¿Cómo concilio GA4 y Shopify pedido a pedido?
Los totales de los paneles muestran una diferencia; relacionar registros identifica los pedidos y ajustes afectados. Este es mi método. Dejo abiertas las causas desconocidas hasta que las pruebas las respalden.
- Elige un periodo cerrado. Escojo un mes completo y anoto cuándo se exportó. Reviso los ajustes posteriores por separado, sin asumir que el mes ya no puede cambiar.
- Exporta el lado de Shopify. Conservo el nombre o ID del pedido, fecha de creación, total, divisa y estado financiero del CSV de pedidos. Varios artículos pueden generar varias filas; evito contar dos veces un pedido. Acuerdo qué pedidos se incluyen y obtengo por separado las anulaciones de ventas con fecha: el total actual de un pedido no equivale al informe de ventas del periodo.
- Exporta el lado de GA4. Uso filas de informes por ID de transacción o eventos recibidos en BigQuery, incluidas compras y reembolsos. Reviso configuración e integridad de la exportación antes de comparar; el streaming puede tener lagunas.
- Normaliza ambos lados. Alineo zona horaria, fechas, divisa y componentes de ventas, y acuerdo cómo tratar los reembolsos. Documento cada ajuste sin asumir que la normalización explica todas las diferencias.
- Relaciona mediante una clave acordada. Uno el identificador del pedido con el
transaction_idde GA4, usando una correspondencia verificada si los formatos difieren. Mantengo separados los registros sin pareja o ambiguos. - Clasifica las diferencias. Separo pedidos solo en Shopify, registros solo en GA4 y registros relacionados con importes distintos. Son observaciones: fechas, alcance, pruebas, falta de envío y divisa son posibilidades que comprobar, no diagnósticos automáticos.
- Investiga los grupos. Agrupo las diferencias según las pruebas disponibles de checkout o pago. Una característica compartida indica dónde probar; no demuestra una causa en el código. Marco como desconocido lo que no tiene pruebas.
Esta plantilla SQL sintética busca IDs de transacción repetidos en una exportación diaria. No se ha ejecutado sobre datos de clientes. Los IDs repetidos en datos sin procesar no demuestran ingresos inflados en informes; reviso por separado el usuario, el pedido y el alcance de la deduplicación:
-- IDs de transacción de compras enviados más de una vez en un día (exportación GA4 a BigQuery)
SELECT
(SELECT value.string_value FROM UNNEST(event_params)
WHERE key = 'transaction_id') AS transaction_id,
COUNT(*) AS purchase_events
FROM `project.analytics_XXXXXX.events_20260701`
WHERE event_name = 'purchase'
GROUP BY transaction_id
HAVING purchase_events > 1
ORDER BY purchase_events DESC;
Un ejemplo práctico (hipotético)
Es un periodo completamente sintético, no un resultado de cliente. Comparo septiembre de 2026 en una tienda hipotética de Shopify con America/New_York y USD frente a una propiedad de GA4 con UTC y USD. Todos los importes, etiquetas de pedido y tipos de cambio son inventados.
Las exportaciones iniciales usan el corte de septiembre de cada sistema. Shopify muestra Total sales de $400,60; GA4 muestra Purchase revenue de $318,29. La diferencia, Shopify menos GA4, es $82,31. Uso ingresos por compras de todos los canales, no un subtotal atribuido a un canal. Total sales de Shopify incluye anulaciones y otros componentes de ventas; Purchase revenue de GA4 resta los reembolsos registrados.
En este ejemplo, todos los pedidos reales están pagados. Impuestos, envío, aranceles, cargos y descuentos son cero. No hay suscripciones, ingresos por anuncios, otros pedidos ni otros reembolsos. El único reembolso es una anulación de venta de un artículo ya procesada, no un reembolso personalizado solo de dinero: Shopify documenta que pueden diferir en informes y exportaciones. Las filas de reembolso no crean ni eliminan pedidos de compra.
Cada fila aporta su importe a los totales iniciales de septiembre. Todos los dólares son USD; C se pagó en EUR antes de la conversión. Dif. significa Shopify menos GA4. Las etiquetas de fila permanecen visibles si desplazas la tabla.
Tabla comparativa — desplázate horizontalmente para ver todas las columnas
| Fila | Shopify | GA4 | Dif. |
|---|---|---|---|
| A: normal | $120,10 | $120,10 | $0,00 |
| B: normal | $80,20 | $80,20 | $0,00 |
| C: EUR 100 | $110,00 | $108,00 | +$2,00 |
| D: sin permiso | $50,40 | $0,00 | +$50,40 |
| E: corte horario | $60,25 | $0,00 | +$60,25 |
| F: prueba | $0,00 | $9,99 | −$9,99 |
| Reembolso B, 20 sep. | −$20,35 | $0,00 | −$20,35 |
| Total | $400,60 | $318,29 | +$82,31 |
Estas son las pruebas que supongo para cada diferencia. En una conciliación real las exigiría antes de atribuir una causa.
- Divisa, +$2,00. Para C, el equivalente hipotético guardado en Shopify es EUR 100,00 × 1,10 = $110,00. El equivalente hipotético del informe de GA4 es EUR 100,00 × 1,08 = $108,00. Son tipos inventados para el ejemplo, no tipos de septiembre. GA4 convierte divisas locales a la divisa de los informes; uso los valores guardados sin asumir que ambos sistemas eligieron el mismo tipo.
- Consentimiento, +$50,40. D se completó, pero el modo básico hipotético bloqueó las etiquetas de analítica tras la denegación, sin dejar una compra observada. La recogida básica y avanzada difieren. El ejemplo usa transacciones observadas sin añadidos modelizados; no afirma que todos los pedidos con consentimiento denegado falten en todos los informes de GA4. Trata la implementación técnica, no el asesoramiento legal.
- Corte horario, +$60,25. E ocurrió el 30 de septiembre a las 23:30 en America/New_York: el 1 de octubre a las 03:30 UTC. Su compra de GA4 existe en octubre; no es un evento perdido. La ventana acordada va del 1 de septiembre a las 04:00 UTC al 1 de octubre a las 04:00 UTC, excluyendo el final. Ningún otro evento del ejemplo cruza esos límites. Vuelvo a seleccionar los eventos por su marca temporal; cambiar la etiqueta del panel no mueve el evento.
- Inclusión de pruebas, −$9,99. F es un pedido hipotético en modo de prueba de Shopify Payments. Las ventas de Shopify lo excluyen, pero el filtro de pruebas falló en este ejemplo y la compra llegó a GA4. Los informes de ventas excluyen pruebas; las exportaciones de pedidos las incluyen. Retiro F de la comparación e investigo el filtro.
- Reembolso, −$20,35. La anulación de venta del artículo de B, procesada en septiembre, reduce las ventas de Shopify. El ejemplo no envió un refund a GA4, que conserva los $80,20 originales. GA4 necesita un evento refund ligado a la transacción. Incluyo los $20,35 ausentes y anoto el envío del reembolso como trabajo que investigar; no es automáticamente una variación estructural inocua.
Los pedidos también cuadran: Shopify tiene cinco pedidos reales (A–E). La selección original de septiembre de GA4 tiene cuatro compras (A, B, C y la prueba F). Al excluir F quedan tres; al incluir E en la ventana acordada quedan cuatro compras reales observadas. D explica el único pedido no observado restante. El reembolso es un ajuste monetario aparte, no un sexto pedido.
El puente de conciliación es $318,29 − $9,99 + $60,25 + $2,00 − $20,35 = $350,20. Al incluir los $50,40 de D obtengo $400,60, exactamente el total de Shopify. Son ajustes de conciliación, no cambios en GA4 ni instrucciones para enviar una compra con consentimiento denegado. Los $82,31 iniciales quedan completamente explicados: $2,00 + $50,40 + $60,25 − $9,99 − $20,35 = $82,31.
Investigaría el filtro de pruebas y el envío del reembolso ausente. Documentaría las diferencias de divisa y fechas, y respetaría el consentimiento de D. Que un total explicado cuadre no demuestra que todas las rutas funcionen; solo indica que este ejemplo no deja un importe sin explicar.
Cómo verifico esto en implementaciones reales
Uso la conciliación para localizar diferencias; después pruebo el envío de eventos y la configuración. Son comprobaciones propuestas para una implementación real; no se han hecho sobre un sistema de cliente para este artículo.
- DebugView y pruebas de red. Con el modo debug activo, reviso los parámetros de
purchaseen DebugView. Los controles de privacidad o una denegación de consentimiento pueden impedir su visibilidad. Una fila ausente no demuestra por sí sola un fallo de código ni la recepción de una solicitud; reviso el consentimiento, la depuración y las solicitudes de red del navegador. - Varias rutas de checkout. Pruebo las rutas reales de tarjeta, cartera, express y post-purchase dentro del alcance acordado. No asumo que un checkout correcto demuestra que todos funcionan.
- IDs de transacción. Reviso un ID único y no vacío por pedido. GA4 deduplica compras del mismo usuario con un ID compartido en flujos web, no en flujos de apps. Los IDs reutilizados o vacíos pueden ocultar compras distintas; distintos IDs para un pedido pueden impedir la deduplicación.
- Pruebas de BigQuery. Comparo eventos recibidos sin procesar con los registros de pedidos. No muestran eventos no recibidos ni garantizan una recogida completa; también reviso los límites y la configuración de exportación.
Modos de fallo habituales
Investigaría estas posibilidades de implementación en lugar de deducirlas de un total agregado.
- Envío incompleto. Una ruta de checkout necesaria no entrega una compra recibida. Pruebo el activador y la solicitud de esa ruta.
- Envíos repetidos. Dos rutas envían un pedido con IDs distintos o ausentes. Los informes deduplican las compras web del mismo usuario con un ID compartido; dos etiquetas por sí solas no demuestran ingresos duplicados. La guía del evento purchase explica qué rutas revisar.
- Claves ambiguas. Los identificadores necesitan una correspondencia verificada. Una cadena sin pareja no demuestra por sí sola un defecto de deduplicación.
- Reembolso no enviado. Una anulación de venta de Shopify no tiene su refund correspondiente en GA4. Reviso tipo, importe y periodo antes de atribuir la diferencia.
- Valor o divisa incorrectos. Comparo los parámetros recibidos con los importes y componentes previstos.
Limitaciones de la conciliación
La conciliación depende de identificadores utilizables, definiciones comparables y pruebas disponibles. Un total que cuadre puede ocultar errores que se compensan. Las exportaciones sin procesar pueden diferir de los informes modelizados, y ajustes posteriores pueden modificar el periodo comparado.
Si el modo básico o un bloqueador impidieron que un evento llegase a GA4, ese conjunto de eventos recibidos no puede recuperarlo. Necesito pruebas de recogida o consentimiento por pedido para atribuir esa causa; la ausencia por sí sola no basta. El modo avanzado puede enviar mediciones sin cookies: una denegación no implica una ausencia universal. Respeto el consentimiento en lugar de enviar pedidos ausentes para forzar que cuadren.
Alternativas
Si no puedes o no quieres conciliar manualmente, hay opciones más ligeras y más completas. Una auditoría de tracking puntual realiza la conciliación y verificación de eventos y te entrega una lista clasificada de discrepancias.
El etiquetado del lado del servidor traslada el procesamiento a infraestructura que controlas. En el flujo navegador-servidor, el dispositivo sigue teniendo que enviar una solicitud. Acordaría por separado el trabajo server-side, revisando envío y consentimiento; mover el procesamiento no demuestra que se recuperen eventos bloqueados. Para el síntoma recurrente, consulta la discrepancia de ingresos entre GA4 y Shopify y, para el método, la conciliación de pedidos.