9 min de lecturaTutoriales

Depuración de GA4 Measurement Protocol: por qué 2xx no demuestra nada

Guía para depurar GA4 Measurement Protocol: usa el servidor de validación, interpreta validationMessages, conoce sus omisiones y confirma los eventos de servidor en GA4.

Ana Kowalska
Marketing solutions engineering
Portada de depuración de GA4 Measurement Protocol: un evento de servidor va primero al servidor de validación /debug/mp/collect y devuelve validationMessages antes del envío real

GA4 Measurement Protocol devuelve un estado 2xx para casi cualquier cosa que le envíes: un evento válido, un evento con un nombre mal escrito, un evento sin client_id, un secreto inventado. Por eso, el código de estado no sirve para depurar. Para depurar llamadas de GA4 Measurement Protocol, envía el mismo cuerpo al servidor de validación en /debug/mp/collect, lee los validationMessages que devuelve, corrige lo que indique y solo entonces confirma que llega a DebugView o Realtime.

Ese último paso importa más de lo que la gente espera. ¿Por qué? El servidor de validación no comprueba tu secreto de API, así que una carga útil puede pasar la validación, recibir un 204 del endpoint real y aun así no llegar nunca a tu propiedad. He visto a un equipo perder una semana exactamente por eso antes de que a alguien se le ocurriera copiar el secreto otra vez.

Si estás conectando eventos del lado del servidor para hacer seguimiento de campañas, la guía fundamental sobre seguimiento integral de UTM explica qué debe incluir el enlace antes de todo esto. Esta publicación trata sobre el momento en que envías el evento y no aparece nada.

Por qué Measurement Protocol responde 2xx a todo

La referencia del protocolo de Google es clara al respecto: el endpoint devuelve un código de estado 2xx si recibe la solicitud HTTP y no devuelve un error si la carga útil está mal formada o los datos no se procesan. La recopilación funciona en modo "enviar y olvidar" (fire-and-forget). Tu servidor nunca espera al procesamiento.

Lo comprobamos nosotros mismos. Un POST a /mp/collect con el cuerpo {"garbage":true}, un ID de medición falso y un secreto inventado devolvió HTTP 204 con un cuerpo vacío. Igual que un evento perfecto.

La lógica de reintento basada en códigos de estado detecta fallos de red. Nada más. No puede decirte que GA4 descartó tus eventos. Para eso necesitas el segundo endpoint.

Cómo usar el servidor de validación en /debug/mp/collect

El servidor de validación de Measurement Protocol está en el mismo host. Misma cadena de consulta, mismo cuerpo:

curl -s -X POST \
  "https://www.google-analytics.com/debug/mp/collect?measurement_id=G-XXXXXXXXXX&api_secret=YOUR_SECRET" \
  -H "Content-Type: application/json" \
  -d '{"events":[{"name":"session_start","params":{"firebase_x":1}}]}'

Responde con 200 y un cuerpo JSON en lugar de uno vacío. Esa carga útil de prueba tiene tres problemas, y el servidor informa el primero que encuentra:

{
  "validationMessages": [
    {
      "fieldPath": "client_id",
      "description": "Measurement requires a client_id.",
      "validationCode": "VALUE_REQUIRED"
    }
  ]
}

Añade un client_id y pasará a NAME_RESERVED para session_start; cambia el nombre del evento y el siguiente será el prefijo firebase_. Cada mensaje incluye un fieldPath, una descripción para personas y un código. Los códigos que documenta Google incluyen VALUE_INVALID, VALUE_REQUIRED, NAME_INVALID, NAME_RESERVED, VALUE_OUT_OF_BOUNDS, EXCEEDED_MAX_ENTITIES y NAME_DUPLICATED.

Comparación de endpoints de depuración de GA4 Measurement Protocol: /mp/collect responde HTTP 204 con un cuerpo vacío tanto para eventos válidos como rotos, mientras que /debug/mp/collect responde 200 con validationMessages y no almacena nada, y ninguno comprueba el secreto de API

Un arreglo vacío, "validationMessages": [ ], significa que la estructura está bien. No se almacena nada de lo enviado a /debug/mp/collect. Úsalo tanto como quieras durante el desarrollo; recuerda únicamente que una llamada de depuración nunca prueba que los datos hayan llegado.

Lo que el servidor de validación no comprueba

La mayoría de los tutoriales omiten esta parte. La página de validación de eventos de Google afirma claramente que el servidor de validación no valida el api_secret. En nuestra prueba del 22 de septiembre de 2026 tampoco comprobó el ID de medición: G-FAKE123 con el secreto nonsense devolvió un arreglo validationMessages vacío.

Un secreto incorrecto pasa. También uno revocado, uno de otra fuente de datos o un error tipográfico en G-. El api_secret de Measurement Protocol es la razón más común que veo para "carga útil válida, sin datos", y solo puedes confirmarlo viendo que llega un evento.

La segunda carencia es el modo de validación. De forma predeterminada, el servidor se ejecuta en modo RELAXED, y en ese modo permitió dos cosas que los propios límites de Google prohíben: un evento con 26 parámetros y un valor de parámetro de 120 caracteres. Añade "validation_behavior": "ENFORCE_RECOMMENDATIONS" al cuerpo de depuración y ambos fallarán, con EXCEEDED_MAX_ENTITIES y VALUE_TOO_LONG. Siempre validaría en modo estricto, aunque producción siga en modo relajado. Es la diferencia entre un verificador y un sello de aprobación automático.

Ver eventos de servidor en GA4 DebugView y Realtime

Una vez que la carga útil se valida, envíala al endpoint real y observa cómo llega. Hay dos vistas que sirven para eventos de servidor, y los informes estándar no son una de ellas, ya que pueden tener un retraso de 24 a 48 horas.

DebugView necesita una activación por evento. La guía de verificación de Google solicita "debug_mode": 1 (o true) en los parámetros del evento, además de un engagement_time_msec positivo. Solo aparecen los eventos que llevan la marca, por lo que un lote donde a un evento le falta parecerá medio vacío. Abre Administrar, luego DebugView, y espera un minuto.

Realtime no necesita nada adicional. Desplázate hasta la tarjeta "Recuento de eventos por nombre del evento" y busca tu evento. Google señala que session_id y engagement_time_msec son importantes para que la actividad del usuario aparezca en Realtime, así que si un evento se valida pero Realtime permanece vacío, comprueba primero esos dos valores.

Una advertencia más de la misma guía: para fuentes web, indica que un evento válido usa un client_id que gtag.js ya ha utilizado. Los ID sintéticos siguen contabilizándose, cada uno como su propio usuario, pero nunca se unen a una sesión del navegador y, en un informe basado en sesiones, eso aparece como una larga cola de usuarios de un solo evento que no puedes explicar hasta saber de dónde vienen. Más información en la siguiente sección. Si faltan datos de campaña en lugar de eventos, los parámetros UTM no aparecen en GA4 explica el lado de DebugView de ese problema.

Errores comunes de carga útil y lo que dice el validador

La mayoría de los eventos defectuosos corresponden a unos pocos patrones. Estos son los resultados que devolvió el servidor de validación cuando enviamos cada uno el 22 de septiembre de 2026:

ErrorRespuesta del validador (modo predeterminado)Solución
Sin client_id en el cuerpoVALUE_REQUIRED en client_idEnvía el valor de _ga o un ID estable propio
Evento llamado session_startNAME_RESERVEDCámbialo; first_visit, user_engagement están reservados
Parámetro con prefijo firebase_NAME_RESERVED en events.paramsElimina los prefijos _, firebase_, ga_, google_
Evento llamado Link ClickNAME_INVALIDLetras, dígitos y _; comienza con una letra
26 parámetros o un valor de 120 caract.Arreglo vacío (el modo estricto lo detecta)Limítate a 25 parámetros y valores de 100 caracteres
timestamp_micros de hace más de 72 hArreglo vacío (el modo estricto lo rechaza)El modo relajado lo reescribe a hace 72 horas
Falta engagement_time_msecArreglo vacíoUsa un número positivo o Realtime puede quedar vacío

Dos filas merecen un comentario. El prefijo ga_ está reservado según la referencia, pero el validador aceptó ga_session_id en ambos modos cuando lo probamos, así que no tomes un arreglo vacío como autorización. Y el límite de 100 caracteres para valores suele afectar a las URL de destino completas: una página de destino con cinco etiquetas UTM suele ser más larga.

El propio client_id es el punto sutil. Cualquier cadena pasa la validación relajada, pero el modo estricto rechazó tanto c1 como elido-12-4711 con "It should be in . format". Si tus eventos deben vincularse a sesiones del navegador, envía el valor real de _ga; la guía de seguimiento de GA4 del lado del servidor explica esa vinculación en detalle.

Cómo lo aplican el reenviador de GA4 de Elido y el botón Probar conexión

Elido reenvía los clics de enlaces cortos a GA4 del lado del servidor. Pegas un ID de medición y un secreto de API de Measurement Protocol en la tarjeta de GA4 dentro de Integraciones, y desde entonces cada clic en ese espacio de trabajo se convierte en un evento link_click:

{
  "client_id": "elido-12-4711",
  "events": [
    {
      "name": "link_click",
      "params": {
        "workspace_id": 12,
        "link_id": 4711,
        "slug": "spring-26",
        "country": "DE",
        "device": "mobile",
        "destination": "https://shop.example/spring?utm_source=newsletter",
        "engagement_time_msec": 100
      }
    }
  ]
}

El client_id es elido-<workspace>-<link>, así que cada clic en un enlace se interpreta como el mismo usuario de GA4 y ninguno se une a una sesión del navegador. Es la contrapartida honesta de hacerlo sin una cookie: los totales y los desgloses por slug, país y dispositivo funcionan; los recuentos de usuarios y los embudos de sesión no. País y dispositivo son parámetros de evento simples. Regístralos primero como dimensiones personalizadas. Además, un destination de más de 100 caracteres se topa con el límite de la tabla anterior, así que construye tus informes con slug o link_id en su lugar.

El botón Probar conexión sigue el orden que recomienda este artículo:

Cómo el botón Probar conexión de Elido depura una integración de GA4 Measurement Protocol: valida un link_click sintético en /debug/mp/collect, falla con el propio mensaje de Google si validationMessages no está vacío; de lo contrario, envía el evento a /mp/collect y muestra la respuesta del proveedor con una nota de que el secreto no se verifica

Primero envía un link_click sintético, marcado con elido_test: true, a /debug/mp/collect. Si validationMessages no está vacío, la prueba falla y muestra literalmente las descripciones de Google. Si el arreglo está vacío, el mismo evento se envía de verdad a /mp/collect. Debajo del botón ves la respuesta del proveedor (estado HTTP, el endpoint de depuración con tu ID de medición pero nunca el secreto y el cuerpo de Google), además de una nota que indica que Measurement Protocol no verifica el secreto de API.

Así que verde significa "válido y Google lo recibió". No significa "tu propiedad lo tiene". El evento de prueba lleva debug_mode: 1 y elido_test: true, así que aparece en DebugView como link_click; Realtime también funciona. Si quieres eventos de clic en GA4 sin una etiqueta en cada página de destino, crea un espacio de trabajo y apunta primero la tarjeta de GA4 a una propiedad de prueba.

Un orden eficaz para depurar GA4 Measurement Protocol

Cuando los eventos de GA4 no aparezcan, sigue este orden y detente en el primer fallo:

  1. Envía el cuerpo a /debug/mp/collect con validation_behavior establecido en ENFORCE_RECOMMENDATIONS. Corrige cada mensaje.
  2. Copia otra vez el secreto de API desde Administrar, Fuentes de datos, tu fuente web, secretos de API de Measurement Protocol. Comprueba que procede de la misma fuente que el ID G-.
  3. Envía un evento a /mp/collect con debug_mode: 1 y observa DebugView durante dos minutos.
  4. Quita la marca y comprueba Realtime; después, da a los informes estándar uno o dos días.

El paso 2 es donde termina la mayor parte de mis propias depuraciones. La página de solución de problemas de Google comienza con las mismas tres preguntas: secreto correcto, todavía válido, copiado exactamente. Cuando por fin fluyen los números y aun así no coinciden con los recuentos de tus enlaces, clics de enlaces cortos frente a sesiones de GA4 explica la diferencia, y seguimiento de conversiones del lado del servidor cubre los eventos de conversión que suelen venir después. El mismo hábito de validar y luego verificar se aplica a los demás destinos de la página de seguimiento de conversiones.

Relacionado en el blog

Preguntas frecuentes

¿Cómo depuro eventos de GA4 Measurement Protocol?

Envía la misma carga útil a https://www.google-analytics.com/debug/mp/collect en lugar de a /mp/collect. El servidor de validación responde con un arreglo validationMessages que indica el campo, describe el problema y proporciona un código como NAME_RESERVED o VALUE_REQUIRED. Un arreglo vacío significa que la estructura es válida. Luego envía el evento real con debug_mode establecido en 1 y observa cómo llega a DebugView.

¿Por qué mis eventos de Measurement Protocol no aparecen en GA4?

Las causas habituales son un secreto de API incorrecto o revocado, un ID de medición de otra fuente de datos, la ausencia de client_id o consultar los informes estándar demasiado pronto. El endpoint devuelve 2xx en todos esos casos, así que el código de estado no te dice nada. Valida la carga útil, revisa el secreto manualmente y consulta Realtime o DebugView en lugar de los informes, que pueden retrasarse un día o más.

¿El servidor de validación de GA4 comprueba el secreto de API?

No. La documentación de Google indica que el servidor de validación no valida api_secret y, en nuestra propia prueba del 22 de septiembre de 2026, también aceptó un ID de medición que no pertenece a ninguna propiedad. Un arreglo validationMessages vacío solo significa que el JSON está bien formado. Solo puedes confirmar que el secreto coincide con la fuente de datos al ver que el evento llega a GA4.

¿Los eventos enviados a /debug/mp/collect aparecen en los informes de GA4?

No. El servidor de validación comprueba la carga útil y la descarta, por lo que nada de lo que envíes allí llega a los informes, Realtime o DebugView. Para ver un evento en DebugView, envíalo al endpoint normal /mp/collect con un parámetro debug_mode de 1 y un engagement_time_msec positivo, tal como describe la guía de verificación de Google.

¿Qué client_id debo enviar con GA4 Measurement Protocol?

Para una fuente web, Google espera el client_id generado por la etiqueta de GA4 de tu sitio, el valor almacenado en la cookie _ga, para que los eventos de servidor se unan a la sesión del navegador. Cualquier cadena pasa la validación predeterminada, pero el modo más estricto ENFORCE_RECOMMENDATIONS rechaza los ID que no tengan el formato número.número. Un ID inventado sigue contabilizando eventos; simplemente nunca se une a una sesión del navegador.

¿Cuántos parámetros puede tener un evento de Measurement Protocol?

Veinticinco parámetros por evento y 25 eventos por solicitud, con nombres de hasta 40 caracteres y valores de hasta 100 caracteres en una propiedad estándar, o 500 en GA4 360. El modo de validación predeterminado no señaló un parámetro número 26 ni un valor de 120 caracteres cuando lo probamos; al establecer validation_behavior en ENFORCE_RECOMMENDATIONS en la llamada de depuración, sí lo hizo.

Prueba Elido

Pega una URL, obtén un enlace corto

Sin registro. El enlace vive 30 días. Crea una cuenta para conservarlo.

Gratis, sin registro · 2 por día

Prueba Elido

Acortador de URL alojado en la UE: dominios personalizados, análisis profundo y API abierta. Plan gratuito - sin tarjeta de crédito.

Etiquetas
ga4 measurement protocol debug
measurement protocol validation server
debug/mp/collect
ga4 events not showing
measurement protocol api_secret
ga4 debugview server events

Seguir leyendo