Fas 1b punkt 6: First Scan Coach + aktiveringsmätning

This commit is contained in:
Sven (AAMOS AI)
2026-08-06 04:14:49 +07:00
parent 2f3cdf8016
commit bd8df59138
29 changed files with 9378 additions and 29 deletions
+36
View File
@@ -27,6 +27,14 @@ interface EventCountsResult {
unique_users: number;
}>;
}
interface ActivationResult {
totalHouseholds: number;
scanned: number;
activated: number;
valueConfirmed: number;
activationRate: number;
valueConfirmationRate: number;
}
function today() {
return new Date().toISOString().slice(0, 10);
@@ -51,6 +59,7 @@ export function AnalyticsPage() {
const [countsStart, setCountsStart] = useState<string>(weekAgo());
const [countsEnd, setCountsEnd] = useState<string>(today());
const [counts, setCounts] = useState<EventCountsResult | null>(null);
const [activation, setActivation] = useState<ActivationResult | null>(null);
const [error, setError] = useState<string | null>(null);
useEffect(() => {
@@ -60,6 +69,9 @@ export function AnalyticsPage() {
if (res.funnels[0]) setFunnelName(res.funnels[0].name);
})
.catch((e) => setError(String(e.message)));
api<ActivationResult>("/admin/v1/analytics/activation")
.then(setActivation)
.catch((e) => setError(String(e.message)));
}, []);
const loadFunnel = () => {
@@ -107,6 +119,30 @@ export function AnalyticsPage() {
<h2>Analytics</h2>
{error && <div className="error-text">{error}</div>}
{activation && (
<div className="panel">
<h3>Aktivering</h3>
<div className="metrics">
<div className="stat">
<div className="value">{activation.totalHouseholds}</div>
<div className="label">Hushåll</div>
</div>
<div className="stat">
<div className="value">{activation.scanned}</div>
<div className="label">Skannat</div>
</div>
<div className="stat">
<div className="value">{(activation.activationRate * 100).toFixed(1)}%</div>
<div className="label">Aktiverade</div>
</div>
<div className="stat">
<div className="value">{(activation.valueConfirmationRate * 100).toFixed(1)}%</div>
<div className="label">Value confirmed</div>
</div>
</div>
</div>
)}
<div className="panel">
<h3>Funnels</h3>
<div className="form-row">