diff --git a/src/app/dashboard/agencia/page.tsx b/src/app/dashboard/agencia/page.tsx index 9173639..9693bbd 100644 --- a/src/app/dashboard/agencia/page.tsx +++ b/src/app/dashboard/agencia/page.tsx @@ -84,7 +84,7 @@ export default async function AgencyPage() {
{tenants.length}
@@ -93,7 +93,7 @@ export default async function AgencyPage() {@@ -104,7 +104,7 @@ export default async function AgencyPage() {
{totalLeads}
@@ -113,7 +113,7 @@ export default async function AgencyPage() {{blendedRoas}x
diff --git a/src/app/dashboard/asistente/page.tsx b/src/app/dashboard/asistente/page.tsx index 0b7197c..a23f358 100644 --- a/src/app/dashboard/asistente/page.tsx +++ b/src/app/dashboard/asistente/page.tsx @@ -212,7 +212,7 @@ export default function AsistentePage() {+
Sin leads Clientify en este contexto. Importa el histórico o activa el webhook (`?tenant=…`). En portafolio, elige un cliente en Contexto.
@@ -238,7 +238,7 @@ export default function CrmDashboard({ {statusRows.map((row) => (+ Sin cierres en el periodo — sincroniza deals Clientify +
+ ); + } const cells: { label: string; v: number | null }[] = [ { label: 'WoW', v: delta.wow }, { label: 'MoM', v: delta.mom }, @@ -55,16 +75,15 @@ function DeltaTriple({ delta, invert }: { delta: Delta; invert?: boolean }) { return (+
{c.label}
-
+
Histórico limitado: si faltan deltas o canales, el warehouse aún no tiene semanas suficientes.
)} - {/* North Star strip */} + {!hasCohort && ( ++ CAC / Revenue / ROAS a cero: no hay deals ganados con fecha de cierre + en este periodo. Se calculan con{' '} + deals Clientify (stage=won), no + solo con leads de ads. +
+ )} ++
{s.label}
-{s.value}
++ {s.value} +
+ {value} +
+{c.hint}
+- {c.format(periodTotals[c.key])} -
-{c.hint}
-+
Plataforma = leads reportados por Meta/Google · CRM = atribución Clientify (origen/UTM) {!hasCrm && portfolioWide @@ -362,61 +408,61 @@ export default function MetricsDashboard({ : ''}
+
Gap = CRM − plat
+
Sin series de canal en el periodo. Los canales Meta/Google aparecen cuando hay filas en ad_daily para este cliente (elige uno en Contexto).
) : (| Canal | -Inversión | -Leads plat | -Leads CRM | -Gap | -CPL plat | -CPL CRM | +Canal | +Inversión | +Leads plat | +Leads CRM | +Gap | +CPL plat | +CPL CRM |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {row.spend > 0 ? ( {row.channel} ) : ( - + {row.channel} )} | -+ | {row.spend ? formatEur(row.spend) : '—'} | -+ | {formatNum(row.platformLeads)} | -+ | {hasCrm ? formatNum(row.crmLeads) : '—'} | @@ -424,12 +470,12 @@ export default function MetricsDashboard({ ? `${row.gap > 0 ? '+' : ''}${formatNum(row.gap)}` : '—'} | -+ | {row.cplPlatform ? `${formatNum(row.cplPlatform)} €` : '—'} | -+ | {hasCrm && row.cplCrm ? `${formatNum(row.cplCrm)} €` : '—'} @@ -440,52 +486,45 @@ export default function MetricsDashboard({ |
{formatEur(daily.spend)}
-+
+ {formatEur(daily.spend)} +
+{formatNum(daily.leads)} leads · {formatNum(daily.impressions)} impr. · {formatNum(daily.clicks)} clicks
-+
Semana actual: {formatEur(week.spend)} · {formatNum(week.leads)}{' '} leads
+
Cómo leer
-👉 {selected.cta}
+👉 {selected.cta}
)} {selected.hashtags && ({selected.hashtags}
diff --git a/src/components/SeguimientoBoard.tsx b/src/components/SeguimientoBoard.tsx index d532739..4428da4 100644 --- a/src/components/SeguimientoBoard.tsx +++ b/src/components/SeguimientoBoard.tsx @@ -518,8 +518,8 @@ export default function SeguimientoBoard() { onClick={() => setMetric(k)} className={`px-2.5 py-1 text-xs rounded-md transition-colors ${ metric === k - ? 'bg-brand-500/20 text-brand-400' - : 'text-gray-400 hover:text-white' + ? 'bg-brand-500 text-white' + : 'text-gray-600 hover:text-gray-900' }`} > {label} @@ -667,7 +667,7 @@ export default function SeguimientoBoard() { target="_blank" rel="noreferrer" onClick={(ev) => ev.stopPropagation()} - className="inline-flex items-center gap-1 text-[11px] text-brand-400 hover:text-brand-300" + className="inline-flex items-center gap-1 text-[11px] text-brand-400 hover:text-brand-700" > Superhuman+
{description}
) : null} @@ -85,10 +85,43 @@ export function EmptyState({{title}
{description ? ( -+
{description}
) : null}