Conversiones Offline - Google Ads

Guía completa para importar conversiones offline a Google Ads desde tu CRM usando el GCLID capturado por Referrer Tracker.

✓ Beneficios:

  • Recupera conversiones bloqueadas por cookies (+30-40%)
  • Reporta leads cualificados y ventas reales
  • Mejora el Smart Bidding con datos precisos
  • Reduce el CPA hasta un 40%

Configuración en Google Ads

Paso 1: Crear Acción de Conversión

  1. Ve a Google Ads → Herramientas y configuración → Medición → Conversiones
  2. Click en + Nueva acción de conversión
  3. Selecciona Importar
  4. Elige Otras fuentes de datos o CRM → Seguimiento de clics
  5. Configura:
    • Nombre: "Lead Cualificado" (o el que prefieras)
    • Valor: Usa valores específicos
    • Recuento: Una conversión por clic
    • Ventana de conversión: 90 días
  6. Click en Crear y continuar

Consejo: Crea múltiples acciones de conversión para diferentes etapas del embudo:

  • "Lead Cualificado" (valor: 50€)
  • "Demo Agendada" (valor: 200€)
  • "Propuesta Enviada" (valor: 500€)
  • "Venta Cerrada" (valor: real de la venta)

Formato del Archivo CSV

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:

  • Formato de fecha: YYYY-MM-DD HH:MM:SS+TZ (incluir zona horaria)
  • Ventana de tiempo: Máximo 90 días desde el clic original
  • GCLID válido: Debe existir en Google Ads
  • Límite: 100,000 conversiones por archivo

Generar CSV desde tu CRM

Exportar desde HubSpot

Opción 1: Exportación Manual

  1. Ve a Contactos → Listas
  2. Crea una lista con filtro: "Lifecycle Stage = Lead Cualificado" (o el estado que prefieras)
  3. Añade filtro adicional: "GCLID is known"
  4. Click en Exportar → Exportar vista
  5. Selecciona las columnas:
    • GCLID (campo personalizado)
    • Fecha de creación (o fecha de cambio de estado)
    • Deal Amount (si aplica)
  6. Descarga el CSV y formatea según el template de Google

Opción 2: Workflow Automatizado

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
}

Opción 3: API de HubSpot

// 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")

Exportar desde Salesforce

Opción 1: Exportación Manual con Reports

  1. Ve a Reports → New Report
  2. Selecciona Leads o Opportunities
  3. Añade filtros:
    • Status = "Qualified" (o tu estado personalizado)
    • GCLID__c is not null
    • Created Date = Last 7 days (ajusta según necesites)
  4. Añade columnas:
    • GCLID__c
    • Created Date (o Status Change Date)
    • Amount (si es Opportunity)
  5. Click en Run → Export → Formatted Report (Excel)
  6. Convierte a CSV y formatea según template de Google

Opción 2: Process Builder + Flow

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
}

Opción 3: API de Salesforce (SOQL)

// 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")

Exportar desde Zoho CRM

Opción 1: Exportación Manual

  1. Ve a Leads o Deals
  2. Click en el icono de filtro
  3. Crea un filtro personalizado:
    • Lead Status = "Qualified"
    • GCLID is not empty
    • Modified Time = Last 7 days
  4. Selecciona todos los registros
  5. Click en ⋮ → Export → CSV
  6. Selecciona campos: GCLID, Modified Time, Deal Amount
  7. Descarga y formatea según template de Google

Opción 2: Workflow con Webhook

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
}

Opción 3: API de Zoho CRM

// 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")

Subir Conversiones a Google Ads

Método 1: Subida Manual (CSV)

  1. Ve a Google Ads → Herramientas → Subidas
  2. Click en + Subir
  3. Selecciona tu acción de conversión
  4. Click en Subir archivo
  5. Selecciona tu CSV
  6. Mapea las columnas correctamente
  7. Click en Aplicar

✓ Procesamiento: Google Ads procesará las conversiones en 3-6 horas. Verás los resultados en el informe de conversiones.

Método 2: API de Google Ads (Automatizado)

// 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}")

Mejores Prácticas

📋 Recomendaciones:

  • Frecuencia: Sube conversiones semanalmente o cuando tengas mínimo 10-20
  • Ventana de tiempo: No esperes más de 7 días para subir conversiones
  • Validación: Verifica que los GCLIDs sean válidos antes de subir
  • Valores consistentes: Usa valores realistas y consistentes para cada tipo de conversión
  • Monitoreo: Revisa el informe de conversiones para detectar errores
  • No duplicar: Evita subir la misma conversión múltiples veces

Troubleshooting

Error: "GCLID inválido"

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.

Error: "Conversión duplicada"

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.

Conversiones no aparecen en informes

Causa: Google Ads tarda 3-6 horas en procesar conversiones offline.

Solución: Espera unas horas y verifica en Herramientas → Subidas → Historial.