{{-- ===================== Filters ===================== --}}
@if ($range === 'custom')
@endif
@if ($country || $gender || $ageBand)

Demographic filters use member profiles, so these numbers cover signed-in members only.

@endif {{-- ===================== KPIs ===================== --}}
@foreach ([ ['label' => 'Unique visitors', 'value' => number_format($kpis['visitors']), 'hint' => $rangeLabel], ['label' => 'Page views', 'value' => number_format($kpis['page_views']), 'hint' => 'HTML pages served'], ['label' => 'Actions taken', 'value' => number_format($kpis['actions']), 'hint' => 'Saves, submissions, downloads'], ['label' => 'Active members', 'value' => number_format($kpis['active_members']), 'hint' => 'Signed in during period'], ['label' => 'New members', 'value' => number_format($kpis['new_members']), 'hint' => 'Dashboards created'], ['label' => 'Assessments completed', 'value' => number_format($kpis['assessments']), 'hint' => 'All assessments'], ['label' => 'Tool plans saved', 'value' => number_format($kpis['plans_saved']), 'hint' => 'Calculator results kept'], ['label' => 'PDF downloads', 'value' => number_format($kpis['pdf_downloads']), 'hint' => 'Reports and guides'], ['label' => 'Leads captured', 'value' => number_format($kpis['leads']), 'hint' => 'Emails collected'], ['label' => 'Revenue (KES)', 'value' => number_format($kpis['revenue_kes']), 'hint' => 'Verified payments'], ] as $kpi)

{{ $kpi['label'] }}

{{ $kpi['value'] }}

{{ $kpi['hint'] }}

@endforeach
{{-- ===================== Traffic trend (inline SVG) ===================== --}} @php $maxViews = max(1, $traffic->max('views')); $count = max(1, $traffic->count() - 1); $pts = fn (string $key) => $traffic->values()->map( fn ($row, $i) => round($i / $count * 600, 1).','.round(150 - ($row->{$key} / $maxViews * 140), 1) )->implode(' '); @endphp

Traffic over time

Page views Unique visitors
@foreach ([0.25, 0.5, 0.75] as $f) @endforeach
{{ $traffic->first()?->day ? \Illuminate\Support\Carbon::parse($traffic->first()->day)->format('j M') : '' }} Peak: {{ number_format($maxViews) }} views/day {{ $traffic->last()?->day ? \Illuminate\Support\Carbon::parse($traffic->last()->day)->format('j M') : '' }}
{{-- Top pages --}}

Most visited pages

@php $maxPage = max(1, $topPages->max('views')); @endphp
@forelse ($topPages as $page)
{{ $page->path === '/' ? 'Home' : $page->path }} {{ number_format($page->views) }} · {{ number_format($page->visitors) }} people
@empty

No page views recorded in this period yet.

@endforelse
{{-- Actions --}}

Actions taken

@php $maxEvent = max(1, $eventsBreakdown->max('total')); @endphp
@forelse ($eventsBreakdown as $row)
{{ \Illuminate\Support\Str::headline($row->event) }} {{ number_format($row->total) }} · {{ number_format($row->sessions) }} people
@empty

No actions recorded in this period yet.

@endforelse
{{-- Tool usage --}}

How the tools are used

Views Saves PDFs
@php $maxTool = max(1, $tools->max('views')); @endphp
@forelse ($tools as $tool)
{{ \Illuminate\Support\Str::headline($tool->slug) }} {{ number_format($tool->views) }} · {{ $tool->saves }} saved · {{ $tool->pdfs }} PDF
@empty

No tool activity in this period yet.

@endforelse
{{-- Assessment funnel --}}

Assessment funnel

@php $maxAssessment = max(1, $assessments->max('views')); @endphp
@forelse ($assessments as $row)
{{ \Illuminate\Support\Str::headline($row->slug) }} {{ number_format($row->views) }} · {{ $row->completions }} done{{ $row->rate !== null ? ' · '.$row->rate.'%' : '' }}
@empty

No assessment activity in this period yet.

@endforelse
{{-- ===================== Audience ===================== --}}

Who your audience is

From member profiles collected at onboarding. Members active in the period, or all members when the period has no member activity.

@foreach ([ ['title' => 'Gender', 'rows' => $genders], ['title' => 'Age bands', 'rows' => $ages], ['title' => 'Where they live', 'rows' => $locations], ['title' => 'Their money goals', 'rows' => $goals], ['title' => 'Devices', 'rows' => $devices->map(fn ($d) => (object) ['label' => ucfirst($d->device ?? 'Unknown'), 'total' => $d->visitors])], ] as $panel)

{{ $panel['title'] }}

@php $maxRow = max(1, collect($panel['rows'])->max('total')); $sum = max(1, collect($panel['rows'])->sum('total')); @endphp
@forelse ($panel['rows'] as $row)
{{ $row->label }} {{ number_format($row->total) }} · {{ round($row->total / $sum * 100) }}%
@empty

No profile data yet, it fills as members complete onboarding.

@endforelse
@endforeach