- New GACampaignMes table tracks monthly state of campaigns with activity (ENABLED status or cost > 0 this month) - sync_gacampaignmes(): creates/updates records with PPL, CPAMax, CosteMes, ConvMes, CapTotalMes, Status for current month (numeric Mes: 1-12) - get_active_gacampaignmes(): reads GACampaignMes as source for optimization loop - get_leads_this_month_gads(): filters leads by GoogleCampaignID + utm_source (pmx/google) + utm_medium (paid_search) instead of attr_cursoid - update_gacampaignmes_leads_lake(): links leads to GACampaignMes Leads Lake field - batch_update_gacampaignmes_consejos(): saves agent advice to Consejo field - Google Ads Campaigns table simplified to catalog only (name, status, PPL) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Leads Optimizer — Formación
Agente de optimización automática de campañas Google Ads para generación de leads de formación. Cruza datos de Airtable (leads reales) con métricas de Google Ads y decide ajustes de presupuesto.
Campos requeridos en Airtable
Tabla: "Google Ads Campaigns"
| Campo | Tipo | Descripción |
|---|---|---|
| Curso | Text | Nombre del curso |
| GoogleCampaignID | Number | ID de campaña en Google Ads |
| PPL | Number | Precio por lead (€) |
| CapTotalMes | Number | Capping mensual de leads |
| CPAMaximo | Number | CPA máximo tolerable (€) |
| Activa | Boolean | TRUE para incluir en el análisis |
Tabla: "Leads Lake"
| Campo | Tipo | Descripción |
|---|---|---|
| GoogleCampaignID | Text | ID de campaña de origen |
| FechaEntrada | Date | Fecha del lead (formato YYYY-MM-DD) |
Variables de entorno
export AIRTABLE_TOKEN=pat_xxxxxxxxxxxx
export AIRTABLE_BASE_ID=appXXXXXXXXXXXXXX
export GOOGLE_ADS_DEVELOPER_TOKEN=xxxx
export GOOGLE_ADS_CLIENT_ID=xxxx.apps.googleusercontent.com
export GOOGLE_ADS_CLIENT_SECRET=xxxx
export GOOGLE_ADS_REFRESH_TOKEN=xxxx
export GOOGLE_ADS_LOGIN_CUSTOMER_ID=1234567890 # sin guiones
export ANTHROPIC_API_KEY=sk-ant-xxxx
Instalación y ejecución
# Instalar dependencias
pip install -r requirements.txt
# Ejecutar en modo DRY RUN (recomendado para empezar)
# DRY_RUN = True en config.py → solo muestra decisiones, no aplica cambios
python run.py
# Cuando estés seguro, cambiar DRY_RUN = False en config.py
python run.py
Lógica de urgencia
| Urgencia | Condición | Acción típica |
|---|---|---|
| PAUSAR | leads >= capping | Pausa campaña |
| SPRINT | ritmo muy atrasado + quedan ≤ 5 días | +30-50% presupuesto |
| ACELERAR | ritmo atrasado > 15 puntos vs ratio del mes | +10-25% presupuesto |
| FRENAR | ritmo adelantado > 15 puntos vs ratio del mes | -10-25% presupuesto |
| EN_RITMO | dentro del margen esperado | Mantener |
Automatización con cron
# Ejecutar cada día a las 8:00
0 8 * * * cd /ruta/leads-optimizer && python run.py >> logs/optimizer.log 2>&1
Description
Languages
Python
99.5%
Shell
0.5%