Files
2026-06-17 17:51:03 -04:00

109 lines
3.2 KiB
HTML

{% extends "base.html" %}
{% block title %}{{ _('Admin · Analytics') }}{% endblock %}
{% block content %}
{% include "admin/_nav.html" %}
<div class="card">
<h2>{{ _('Analytics — last 30 days') }}</h2>
<div class="kpi-grid">
<div class="card kpi-card">
<div class="kpi-label">{{ _('New signups (30d)') }}</div>
<div class="kpi-value">{{ signups|sum(attribute='n') }}</div>
</div>
<div class="card kpi-card">
<div class="kpi-label">{{ _('Listings posted (30d)') }}</div>
<div class="kpi-value">{{ listings_chart|sum(attribute='n') }}</div>
</div>
<div class="card kpi-card">
<div class="kpi-label">{{ _('Revenue (30d)') }}</div>
<div class="kpi-value">${{ '%.2f'|format((revenue_chart|sum(attribute='cents') or 0) / 100) }}</div>
</div>
<div class="card kpi-card">
<div class="kpi-label">{{ _('Ad impressions (active ads)') }}</div>
<div class="kpi-value">{{ ad_stats.total_impressions or 0 }}</div>
</div>
<div class="card kpi-card">
<div class="kpi-label">{{ _('Ad clicks (active ads)') }}</div>
<div class="kpi-value">{{ ad_stats.total_clicks or 0 }}</div>
</div>
<div class="card kpi-card">
<div class="kpi-label">{{ _('Overall CTR') }}</div>
<div class="kpi-value">
{% if ad_stats.total_impressions %}
{{ '%.2f'|format(ad_stats.total_clicks / ad_stats.total_impressions * 100) }}%
{% else %}—{% endif %}
</div>
</div>
</div>
</div>
<div class="card">
<h3>{{ _('Signups per day') }}</h3>
{% if signups %}
<table class="list">
<thead><tr><th>{{ _('Date') }}</th><th>{{ _('Signups') }}</th></tr></thead>
{% for row in signups %}
<tr>
<td class="muted small">{{ row.day }}</td>
<td>{{ row.n }}</td>
</tr>
{% endfor %}
</table>
{% else %}
<p class="muted">{{ _('No signups in the last 30 days.') }}</p>
{% endif %}
</div>
<div class="card">
<h3>{{ _('Listings posted per day') }}</h3>
{% if listings_chart %}
<table class="list">
<thead><tr><th>{{ _('Date') }}</th><th>{{ _('Listings') }}</th></tr></thead>
{% for row in listings_chart %}
<tr>
<td class="muted small">{{ row.day }}</td>
<td>{{ row.n }}</td>
</tr>
{% endfor %}
</table>
{% else %}
<p class="muted">{{ _('No listings posted in the last 30 days.') }}</p>
{% endif %}
</div>
<div class="card">
<h3>{{ _('Revenue per day') }}</h3>
{% if revenue_chart %}
<table class="list">
<thead><tr><th>{{ _('Date') }}</th><th>{{ _('Revenue') }}</th></tr></thead>
{% for row in revenue_chart %}
<tr>
<td class="muted small">{{ row.day }}</td>
<td>${{ '%.2f'|format((row.cents or 0) / 100) }}</td>
</tr>
{% endfor %}
</table>
{% else %}
<p class="muted">{{ _('No revenue in the last 30 days.') }}</p>
{% endif %}
</div>
<div class="card">
<h3>{{ _('Top categories by active listings') }}</h3>
{% if top_cats %}
<table class="list">
<thead><tr><th>{{ _('Category') }}</th><th>{{ _('Active listings') }}</th></tr></thead>
{% for name, n in top_cats %}
<tr>
<td>{{ name }}</td>
<td>{{ n }}</td>
</tr>
{% endfor %}
</table>
{% else %}
<p class="muted">{{ _('No listings.') }}</p>
{% endif %}
</div>
{% endblock %}