Add PPLMedio, CPAMedio, CosteMes, ConvMes to GAMes record

Recalculated each day from fco_ campaign totals:
- CosteMes / ConvMes: from Google Ads monthly accumulated data
- PPLMedio: weighted average by Airtable leads
- CPAMedio: CosteMes / ConvMes

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Jose Manuel 2026-05-18 17:03:03 +02:00
parent a489a08785
commit aa9225d338
2 changed files with 23 additions and 3 deletions

View File

@ -488,8 +488,11 @@ class AirtableClient:
r = self.games.create({"Mes": str(mes), "Año": str(anio)})
return r["id"]
def update_games_metricas(self, record_id: str, metricas_json: str) -> None:
self.games.update(record_id, {"MetricasDiarias": metricas_json})
def update_games_metricas(self, record_id: str, metricas_json: str, totales: dict = None) -> None:
fields = {"MetricasDiarias": metricas_json}
if totales:
fields.update(totales)
self.games.update(record_id, fields)
def get_games_metricas(self, record_id: str) -> dict:
r = self.games.get(record_id)

19
run.py
View File

@ -220,6 +220,7 @@ def run():
advice_updates = [] # (gcm_record_id, consejo, criticidad) para batch update final
metricas_updates = [] # {airtable_id, metricas_json} para MetricasDiarias
games_agg: dict = {} # dia_hoy → {coste, ingreso_sum, ingreso_lxp, leads, leads_lake}
games_mes = {"coste_mes": 0.0, "conv_mes": 0, "ppl_leads": 0.0, "leads_total": 0}
ayer = datetime.now() - timedelta(days=1)
dia_hoy = ayer.strftime("%d")
cambio_mes = ayer.month != datetime.now().month
@ -316,6 +317,12 @@ def run():
games_agg[dia_hoy]["ingreso_lxp"] += leads_lake_hoy * campaign["ppl"]
games_agg[dia_hoy]["leads"] += int(conv_hoy)
games_agg[dia_hoy]["leads_lake"] += leads_lake_hoy
# Totales mes (fuente: Google Ads acumulado mensual)
games_mes["coste_mes"] += metrics.get("cost", 0)
games_mes["conv_mes"] += int(analysis["conversiones_google"])
# PPLMedio ponderado por leads Airtable
games_mes["ppl_leads"] += campaign["ppl"] * leads
games_mes["leads_total"] += leads
metricas_updates.append({
"airtable_id": campaign["airtable_id"],
"metricas_json": json.dumps(md, ensure_ascii=False),
@ -372,7 +379,17 @@ def run():
games_md = at.get_games_metricas(games_rid)
for d, vals in games_agg.items():
games_md[d] = {k: round(v, 2) if isinstance(v, float) else v for k, v in vals.items()}
at.update_games_metricas(games_rid, json.dumps(games_md, ensure_ascii=False))
coste_mes = round(games_mes["coste_mes"], 2)
conv_mes = games_mes["conv_mes"]
ppl_medio = round(games_mes["ppl_leads"] / games_mes["leads_total"], 2) if games_mes["leads_total"] > 0 else 0.0
cpa_medio = round(coste_mes / conv_mes, 2) if conv_mes > 0 else 0.0
totales = {
"CosteMes": coste_mes,
"ConvMes": conv_mes,
"PPLMedio": ppl_medio,
"CPAMedio": cpa_medio,
}
at.update_games_metricas(games_rid, json.dumps(games_md, ensure_ascii=False), totales)
print(" ✓ GAMes actualizado.")
# Snapshot diario: ConvLeadsLakeMesFinal + ConvLeadsLakeMesGrupo