Complete Rybbit campaign aggregation
This commit is contained in:
@@ -34,6 +34,11 @@ export function AnalyticsDashboard() {
|
||||
auditOpens: number;
|
||||
ctaClicks: number;
|
||||
outboundClicks: number;
|
||||
byPath?: Record<string, {
|
||||
auditOpens: number;
|
||||
ctaClicks: number;
|
||||
outboundClicks: number;
|
||||
}>;
|
||||
} | null>(null);
|
||||
const [rybbitError, setRybbitError] = useState<string | null>(null);
|
||||
const metricEntries = useMemo(() => {
|
||||
@@ -43,6 +48,37 @@ export function AnalyticsDashboard() {
|
||||
|
||||
return Object.entries(dashboard.metrics).filter(([key]) => key in metricLabels);
|
||||
}, [dashboard]);
|
||||
const rybbitGroups = useMemo(() => {
|
||||
if (!dashboard || !rybbitData?.byPath) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const grouped = new Map<string, { label: string; auditOpens: number; ctaClicks: number }>();
|
||||
for (const segment of dashboard.auditSegments) {
|
||||
const metrics = rybbitData.byPath[segment.path];
|
||||
if (!metrics) {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (const [kind, label] of [
|
||||
["Kampagne", segment.campaignName],
|
||||
["Nische", segment.niche],
|
||||
["Region", segment.region],
|
||||
] as const) {
|
||||
const key = `${kind}:${label}`;
|
||||
const current = grouped.get(key) ?? {
|
||||
label: `${kind}: ${label}`,
|
||||
auditOpens: 0,
|
||||
ctaClicks: 0,
|
||||
};
|
||||
current.auditOpens += metrics.auditOpens;
|
||||
current.ctaClicks += metrics.ctaClicks;
|
||||
grouped.set(key, current);
|
||||
}
|
||||
}
|
||||
|
||||
return [...grouped.values()].slice(0, 8);
|
||||
}, [dashboard, rybbitData]);
|
||||
|
||||
useEffect(() => {
|
||||
let isMounted = true;
|
||||
@@ -165,6 +201,15 @@ export function AnalyticsDashboard() {
|
||||
<p>Audit-Öffnungen: {rybbitData?.auditOpens ?? dashboard.metrics.rybbitAuditOpens}</p>
|
||||
<p>CTA-Klicks: {rybbitData?.ctaClicks ?? dashboard.metrics.rybbitCtaClicks}</p>
|
||||
<p>Website-Link-Klicks: {rybbitData?.outboundClicks ?? 0}</p>
|
||||
{rybbitGroups.length > 0 ? (
|
||||
<div className="space-y-1 pt-2">
|
||||
{rybbitGroups.map((group) => (
|
||||
<p key={group.label}>
|
||||
{group.label}: {group.auditOpens} Öffnungen · {group.ctaClicks} CTA
|
||||
</p>
|
||||
))}
|
||||
</div>
|
||||
) : null}
|
||||
<p>Public-Audit Tracking läuft nur auf veröffentlichten Audit-Seiten.</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
Reference in New Issue
Block a user