From aa9225d3380ddda4cde11afb5f300bb26e448e6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Manuel=20G=C3=B3mez?= Date: Mon, 18 May 2026 17:03:03 +0200 Subject: [PATCH] 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 --- airtable_client.py | 7 +++++-- run.py | 19 ++++++++++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/airtable_client.py b/airtable_client.py index 03f6749..0a7449f 100644 --- a/airtable_client.py +++ b/airtable_client.py @@ -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) diff --git a/run.py b/run.py index 801a2d1..402cb68 100644 --- a/run.py +++ b/run.py @@ -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