Guía completa para importar conversiones offline a Google Ads desde tu CRM usando el GCLID capturado por Referrer Tracker.
✓ Beneficios:
Consejo: Crea múltiples acciones de conversión para diferentes etapas del embudo:
Google Ads requiere un CSV con las siguientes columnas:
Google Click ID,Conversion Name,Conversion Time,Conversion Value,Conversion Currency TeSter-123abc,Lead Cualificado,2024-01-15 14:30:00+01:00,100,EUR TeSter-456def,Venta Cerrada,2024-01-20 10:00:00+01:00,12000,EUR TeSter-789ghi,Demo Agendada,2024-01-18 16:45:00+01:00,200,EUR
Requisitos importantes:
YYYY-MM-DD HH:MM:SS+TZ (incluir zona horaria)Crea un workflow que exporte automáticamente cuando un contacto cambia de estado:
// Workflow en HubSpot:
// Trigger: "Lifecycle Stage cambia a Lead Cualificado"
// Acción: Webhook a tu servidor
{
"gclid": "{{contact.gclid}}",
"email": "{{contact.email}}",
"conversion_name": "Lead Cualificado",
"conversion_time": "{{contact.hs_lifecyclestage_lead_date}}",
"conversion_value": 100
}
// Script Python para exportar desde HubSpot
import requests
import csv
from datetime import datetime
# Configuración
HUBSPOT_API_KEY = "tu_api_key"
HUBSPOT_API_URL = "https://api.hubapi.com/crm/v3/objects/contacts"
# Obtener contactos cualificados con GCLID
params = {
"properties": "gclid,hs_lifecyclestage_lead_date,email",
"limit": 100
}
headers = {"Authorization": f"Bearer {HUBSPOT_API_KEY}"}
response = requests.get(HUBSPOT_API_URL, params=params, headers=headers)
contacts = response.json()["results"]
# Generar CSV para Google Ads
with open('google_ads_conversions.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(['Google Click ID', 'Conversion Name', 'Conversion Time',
'Conversion Value', 'Conversion Currency'])
for contact in contacts:
gclid = contact["properties"].get("gclid")
date = contact["properties"].get("hs_lifecyclestage_lead_date")
if gclid and date:
# Formatear fecha para Google Ads
dt = datetime.fromisoformat(date.replace('Z', '+00:00'))
formatted_date = dt.strftime('%Y-%m-%d %H:%M:%S%z')
writer.writerow([
gclid,
'Lead Cualificado',
formatted_date,
100,
'EUR'
])
print("CSV generado: google_ads_conversions.csv")
Crea un Process Builder que se active cuando el Lead Status cambia:
// Process Builder:
// Object: Lead
// Trigger: When a record is created or edited
// Criteria: Status EQUALS "Qualified" AND GCLID__c IS NOT NULL
// Action: Call HTTP Callout
POST https://tu-servidor.com/api/google-ads-conversion
{
"gclid": "{!Lead.GCLID__c}",
"conversion_name": "Lead Cualificado",
"conversion_time": "{!Lead.StatusChangeDate}",
"conversion_value": 100
}
// Script Python con simple-salesforce
from simple_salesforce import Salesforce
import csv
from datetime import datetime
# Conectar a Salesforce
sf = Salesforce(
username='tu_usuario@empresa.com',
password='tu_password',
security_token='tu_token'
)
# Query SOQL para obtener leads cualificados
query = """
SELECT GCLID__c, StatusChangeDate, Email
FROM Lead
WHERE Status = 'Qualified'
AND GCLID__c != null
AND StatusChangeDate = LAST_N_DAYS:7
"""
results = sf.query(query)
# Generar CSV para Google Ads
with open('google_ads_conversions.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(['Google Click ID', 'Conversion Name', 'Conversion Time',
'Conversion Value', 'Conversion Currency'])
for record in results['records']:
gclid = record['GCLID__c']
date = record['StatusChangeDate']
# Formatear fecha
dt = datetime.strptime(date, '%Y-%m-%dT%H:%M:%S.%f%z')
formatted_date = dt.strftime('%Y-%m-%d %H:%M:%S%z')
writer.writerow([
gclid,
'Lead Cualificado',
formatted_date,
100,
'EUR'
])
print(f"CSV generado con {len(results['records'])} conversiones")
Configura un workflow que envíe datos cuando el estado cambia:
// Workflow en Zoho:
// Module: Leads
// Trigger: Field Update (Lead Status = Qualified)
// Condition: GCLID is not null
// Action: Webhook
URL: https://tu-servidor.com/api/google-ads-conversion
Method: POST
Body:
{
"gclid": "${Leads.GCLID}",
"conversion_name": "Lead Cualificado",
"conversion_time": "${Leads.Modified_Time}",
"conversion_value": 100
}
// Script Python con Zoho CRM API
import requests
import csv
from datetime import datetime
# Configuración
ZOHO_ACCESS_TOKEN = "tu_access_token"
ZOHO_API_URL = "https://www.zohoapis.eu/crm/v2/Leads"
# Headers
headers = {
"Authorization": f"Bearer {ZOHO_ACCESS_TOKEN}"
}
# Parámetros de búsqueda
params = {
"criteria": "(Lead_Status:equals:Qualified)and(GCLID:is_not_empty)",
"fields": "GCLID,Modified_Time,Email",
"per_page": 200
}
# Obtener leads
response = requests.get(ZOHO_API_URL, headers=headers, params=params)
leads = response.json()["data"]
# Generar CSV para Google Ads
with open('google_ads_conversions.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(['Google Click ID', 'Conversion Name', 'Conversion Time',
'Conversion Value', 'Conversion Currency'])
for lead in leads:
gclid = lead.get("GCLID")
date = lead.get("Modified_Time")
if gclid and date:
# Formatear fecha
dt = datetime.fromisoformat(date.replace('Z', '+00:00'))
formatted_date = dt.strftime('%Y-%m-%d %H:%M:%S%z')
writer.writerow([
gclid,
'Lead Cualificado',
formatted_date,
100,
'EUR'
])
print(f"CSV generado con {len(leads)} conversiones")
✓ Procesamiento: Google Ads procesará las conversiones en 3-6 horas. Verás los resultados en el informe de conversiones.
// Script Python con Google Ads API
from google.ads.googleads.client import GoogleAdsClient
from google.ads.googleads.errors import GoogleAdsException
import csv
# Configurar cliente
client = GoogleAdsClient.load_from_storage("google-ads.yaml")
customer_id = "1234567890" # Tu Customer ID
# Leer CSV
conversions = []
with open('google_ads_conversions.csv', 'r') as f:
reader = csv.DictReader(f)
for row in reader:
click_conversion = client.get_type("ClickConversion")
click_conversion.gclid = row['Google Click ID']
click_conversion.conversion_action = f"customers/{customer_id}/conversionActions/123456"
click_conversion.conversion_date_time = row['Conversion Time']
click_conversion.conversion_value = float(row['Conversion Value'])
click_conversion.currency_code = row['Conversion Currency']
conversions.append(click_conversion)
# Subir conversiones
conversion_upload_service = client.get_service("ConversionUploadService")
request = client.get_type("UploadClickConversionsRequest")
request.customer_id = customer_id
request.conversions = conversions
request.partial_failure = True
try:
response = conversion_upload_service.upload_click_conversions(request=request)
print(f"Subidas {len(response.results)} conversiones")
# Verificar errores parciales
if response.partial_failure_error:
print(f"Errores: {response.partial_failure_error}")
except GoogleAdsException as ex:
print(f"Error: {ex}")
📋 Recomendaciones:
Causa: El GCLID no existe en Google Ads o ha expirado (>90 días).
Solución: Verifica que el GCLID sea correcto y que la conversión ocurra dentro de los 90 días del clic.
Causa: Ya subiste una conversión para ese GCLID y acción de conversión.
Solución: Google Ads solo permite una conversión por GCLID por acción. Usa diferentes acciones de conversión para diferentes etapas.
Causa: Google Ads tarda 3-6 horas en procesar conversiones offline.
Solución: Espera unas horas y verifica en Herramientas → Subidas → Historial.