Dos vías, una acción de conversión
Google Ads mide las conversiones de dos maneras:
- La etiqueta de Google en el navegador —
gtag('event', 'conversion', { send_to: 'AW-XXXX/label', value, currency, transaction_id }), opcionalmente con Enhanced Conversions (user_datacon correo electrónico, teléfono y dirección, con el hash aplicado por la etiqueta). - Subidas de conversiones a través de la API de Google Ads —
ConversionUploadService.UploadClickConversions, enviadas desde tu servidor.
Ambas se refieren a la misma acción de conversión. La vía de la API es la que hace posibles las ventas offline, los leads cualificados en el CRM y las correcciones por reembolso, y es la que sobrevive a las peticiones bloqueadas en el navegador.
La petición de subida
POST https://googleads.googleapis.com/v25/customers/{customerId}:uploadClickConversions con las cabeceras Authorization: Bearer <OAuth2>, developer-token y, cuando accedes a la cuenta a través de una cuenta de administrador, login-customer-id.
Cada ClickConversion necesita:
conversionAction— el nombre de recursocustomers/{cid}/conversionActions/{id}conversionDateTime—yyyy-mm-dd hh:mm:ss+|-hh:mm, con un desfase horario explícito- al menos una clave de atribución:
gclid,gbraid,wbraidouserIdentifiers(Enhanced Conversions for Leads) - opcionalmente
conversionValueconcurrencyCode, yorderIdpara la deduplicación consentconadUserDatayadPersonalizationaGRANTEDoDENIED
Establece partialFailure: true —la API informa entonces de los fallos por fila en lugar de rechazar el lote— y usa validateOnly: true para las pruebas. Una subida de solo validación demuestra que las credenciales, el token de desarrollador y el acceso a la cuenta funcionan sin registrar nada.
Enhanced Conversions: qué se hashea
Para userIdentifiers, Google espera SHA-256 de valores normalizados:
- correo electrónico: sin espacios sobrantes, en minúsculas; en las direcciones de gmail.com y googlemail.com, elimina los puntos y los sufijos
+antes de aplicar el hash - teléfono: E.164 (
+y prefijo de país) antes de aplicar el hash - nombre, apellidos, calle: en minúsculas, sin espacios sobrantes y después con hash
- ciudad, provincia o estado, código postal, código de país: en texto plano
Cada objeto identificador lleva además userIdentifierSource: FIRST_PARTY. Una fila puede combinar varios identificadores; Google empareja con cualquiera de ellos.
Reglas de tiempo que provocan pérdidas silenciosas
- La hora de la conversión debe ser posterior al clic y estar dentro de la ventana de conversión por clic de la acción de conversión. Subir una compra con una marca de tiempo anterior al clic devuelve
CONVERSION_PRECEDES_CLICK. - Los clics de hace pocas horas pueden no ser aún emparejables (
TOO_RECENT_CLICK). Reintentar más tarde es el comportamiento correcto; Track los trata como reintentables. - Los desfases horarios son obligatorios.
2026-09-03 10:15:00sin+02:00se rechaza.
Los campos de consentimiento no son opcionales en la práctica
Desde Consent Mode v2, las subidas sin consent.adUserData para tráfico del EEE quedan marcadas. Deriva los indicadores de las finalidades de consentimiento registradas con el evento: marketing → adUserData: GRANTED; marketing + personalización → adPersonalization: GRANTED; cualquier otro caso → DENIED. Nunca pongas «granted» por defecto solo porque el campo exista.
Deduplicación con la etiqueta del navegador
Usa el mismo transaction_id en la etiqueta de Google y orderId en la subida. Google deduplica las conversiones con el mismo ID de pedido para la misma acción de conversión, de modo que una compra vista tanto por la etiqueta como por el servidor cuenta una sola vez. Para leads sin pedido, mantén navegador y servidor en acciones de conversión distintas (por ejemplo «Lead (etiqueta)» y «Lead cualificado (CRM)») en lugar de intentar deduplicarlos.
Un flujo de pruebas que no contamina los informes
- Conecta la cuenta de Google mediante OAuth y valida: Track envía una subida de solo validación e informa de si se aceptan el token de desarrollador y el ID de cliente.
- Mapea
purchaseal ID de la acción de conversión. - Envía un evento de prueba en el asistente. Mientras el destino esté en modo de prueba, cada subida usa
validateOnly: true; la respuesta confirma la estructura del payload. - Desactiva el modo de prueba, envía una compra real con un gclid reciente y comprueba Conversiones → Diagnóstico en Google Ads al día siguiente.
Errores habituales, descifrados
| Error | Significado | Solución |
|---|---|---|
UNAUTHENTICATED | token OAuth no válido | vuelve a conectar la cuenta de Google |
PERMISSION_DENIED / USER_PERMISSION_DENIED | sin acceso al ID de cliente | comprueba login-customer-id y el acceso a la cuenta |
DEVELOPER_TOKEN_NOT_APPROVED | el token solo permite cuentas de prueba | solicita el acceso básico |
CLICK_NOT_FOUND | gclid desconocido | el clic es demasiado antiguo, es de otra cuenta o tiene un formato incorrecto |
INVALID_CONVERSION_ACTION_TYPE | la acción no es de tipo subida | crea una acción de conversión con origen «Subida desde clics» |
Cada uno de estos errores aparece con su código en el depurador de eventos junto al payload enmascarado que lo produjo.