Para importar conversiones offline a Google Ads necesitas tres cosas: el GCLID guardado en el lead desde el formulario, una acción de conversión con origen de importación desde clics, y un fichero con la hora de la venta y su importe. Sin el identificador almacenado no hay nada que importar. Lo implementamos en los trabajos de medición y datos de Codezone.
El porqué de conectar las dos piezas está en la lógica de conectar Google Ads con el CRM. Aquí va la implementación. Mientras no existe, la puja aprende de formularios y no de ventas, y manda presupuesto a las campañas con más leads, no con más facturación.
Al terminar sabrás qué campos añadir y por qué Google rechaza filas. El diagnóstico previo está en el descuadre entre panel y pipeline, y la captura del dato depende de la arquitectura de conversión de la landing.
Qué es una conversión offline importada
Es una venta cerrada fuera de la web que se devuelve a Google Ads asociada al clic que la originó, mediante el identificador de ese clic. Google la atribuye a la fecha del clic, no a la del cierre, así que las cifras del panel cambian hacia atrás cuando subes el fichero.
Capturar el GCLID en el formulario
El GCLID llega en la URL de aterrizaje. Hay que leerlo, persistirlo mientras el visitante navega y enviarlo en un campo oculto del formulario, para que acabe en un campo propio del lead. Dos detalles rompen implementaciones: distingue mayúsculas, así que no lo normalices, y si el visitante vuelve por otro anuncio el último clic sobrescribe el valor. Ese campo lo define tu el almacén de datos propios de la empresa.
En clics de iOS aparecen otros dos parámetros. GBRAID: clic en anuncio web que lleva a tu app de iOS. WBRAID: clic en anuncio dentro de una app de iOS que lleva a tu web. La documentación de subida de conversiones de clic de Google recomienda enviar el GCLID siempre que exista y, si puedes asociar GCLID y GBRAID a la misma conversión, mandar los dos. Con ellos no hay variables de conversión personalizadas.
Dónde se guarda y cuánto dura
En el CRM el identificador va en el registro de oportunidad, no en una nota, porque se filtra en cada subida. La caducidad es el límite que más sorpresas da: Google conserva el GCLID 90 días, según su guía de errores y discrepancias en importaciones offline. Si tu ciclo medio supera ese plazo, parte de las ventas no entrarán nunca y el ajuste es de estructura de campaña.
El fichero de importación y la frecuencia
La fila `Parameters:TimeZone` abre el fichero y acepta un identificador de zona horaria o un desplazamiento GMT. Después van Google Click ID, Conversion Name, Conversion Time y, con valor, Conversion Value y Conversion Currency. Google admite varios formatos de hora, entre ellos `yyyy-MM-dd HH:mm:ss`. El valor es el importe cerrado, no el estimado, y subir a diario basta para casi todos los ciclos B2B.
Un cambio para el calendario: Google ha anunciado que desde el 15 de junio de 2026 la importación offline y las conversiones mejoradas para clientes potenciales se migran a la Data Manager API y se bloquean en la Google Ads API.
CodeZone Pro Tip: genera el CSV desde las oportunidades ganadas del CRM con la zona horaria declarada en la primera fila, para que la subida no se rechace por formato y el importe que optimiza Google sea el facturado.
import csv
from datetime import datetime
from zoneinfo import ZoneInfo
MADRID = ZoneInfo("Europe/Madrid")
def exportar_csv(oportunidades, ruta):
"""Genera el CSV de importacion offline a partir de oportunidades ganadas."""
with open(ruta, "w", newline="", encoding="utf-8") as fh:
w = csv.writer(fh)
# La zona horaria se declara una vez aqui. Si la omites, Google
# interpreta las horas en la zona de la cuenta y desplaza la atribucion.
w.writerow(["Parameters:TimeZone=Europe/Madrid"])
w.writerow(["Google Click ID", "Conversion Name",
"Conversion Time", "Conversion Value", "Conversion Currency"])
for o in oportunidades:
# Sin GCLID no hay nada que atribuir: la fila se descartaria arriba.
if not o["gclid"]:
continue
cerrado = o["cerrado_en"].astimezone(MADRID)
# Google rechaza conversiones anteriores al clic. Filtramos aqui
# para no gastar una subida en filas que ya sabemos invalidas.
if cerrado < o["clic_en"].astimezone(MADRID):
continue
w.writerow([
o["gclid"], # sensible a mayusculas
o["accion_conversion"], # nombre exacto de la cuenta
cerrado.strftime("%Y-%m-%d %H:%M:%S"),
f"{o['importe_facturado']:.2f}", # el cerrado, no el estimado
o["moneda"],
])En negocio, el script cambia qué aprende la puja. En lugar de perseguir volumen de formularios, Google recibe el importe facturado de cada clic y concentra el gasto donde el ticket medio es mayor. La fila inválida se filtra antes y el informe de errores queda limpio.
Cuando No Hay GCLID: Conversiones Mejoradas para Clientes Potenciales
Son la versión ampliada de la importación offline: usan datos del usuario, como el email, hasheados, para complementar lo que mandas por identificador de clic. Recuperan conversiones entre dispositivos que el GCLID no capta, y Google pide seguir enviándolo cuando exista.
El coste es que tratas datos personales en la capa de etiquetas: el consentimiento deja de ser un detalle y el hash debe cumplir el formato de Google, con email sin espacios ni puntos consecutivos y teléfono en E.164. Esa capa se controla con etiquetado avanzado.
Las Filas que Google Rechaza
Google nombra las causas y casi todas se evitan antes de subir. Identificador más antiguo que la ventana. Clic registrado en otra cuenta. Nombre de acción que no coincide con el de la cuenta o cuyo origen no es importación desde clics. Acción no activa cuando ocurrió el clic. Datos personales sin hashear en subidas programadas. Hora de conversión anterior a la del clic. Clic de menos de seis horas.
Deja la revisión del informe de subidas dentro del proceso. Si el campo del identificador no existe en tu CRM, el trabajo empieza ahí y encaja en cualquier proyecto de sincronización de ERP y CRM en Madrid. Para ver la venta desde la sesión original está medir de la sesión a la factura, y el equivalente en Meta es el envío duplicado de eventos con deduplicación.
Si tienes ventas cerradas en el CRM que Google Ads no sabe que existen, montamos la importación con tus datos y te decimos antes qué parte de tu histórico es recuperable.