109 lines
3.2 KiB
HTML
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 %}
|