fix: Ads Meta conv/CPL = Clientes potenciales (sin sumar acciones solapadas)

Las creatividades inflaban ~3× al sumar lead + lead_grouped + registration.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
4Ventures
2026-09-28 18:32:51 +02:00
parent 990915a051
commit 6d8dfaa79c
4 changed files with 36 additions and 30 deletions

View File

@@ -123,12 +123,20 @@ function aggregate(rows: AdDailyRow[]): PlatformKpis {
const impressions = active.reduce((a, r) => a + Number(r.impressions || 0), 0);
const clicks = active.reduce((a, r) => a + Number(r.clicks || 0), 0);
const conversions = active.reduce((a, r) => a + convOf(r), 0);
// Round once after sum (Ads Manager style; Google stores fractional daily).
const conversionsRounded = Math.round(conversions * 100) / 100;
const ads = new Set(
active
.map((r) => String(r.ad_id || campaignName(r) || '').trim())
.filter((n) => n && n !== 'Sin nombre')
).size;
return rates({ spend, impressions, clicks, conversions, ads });
return rates({
spend,
impressions,
clicks,
conversions: Math.round(conversionsRounded),
ads,
});
}
function byCampaign(rows: AdDailyRow[]): CampaignRow[] {
@@ -161,6 +169,7 @@ function byCampaign(rows: AdDailyRow[]): CampaignRow[] {
return [...map.values()]
.map((c) => ({
...c,
conversions: Math.round(c.conversions * 100) / 100,
cpl: c.conversions > 0 ? c.spend / c.conversions : null,
}))
.sort((a, b) => b.spend - a.spend);