Window: last {{ days }} days ·
90 days ·
180 days ·
365 days ·
All time
Overview
Total orders
{{ data.overview.total_orders }}
{{ data.overview.unique_customers }} unique customers
Delivered
{{ data.overview.delivered_count }}
Revenue (delivered)
TSh {{ data.overview.total_revenue|floatformat:0 }}
Avg order value
TSh {{ data.overview.avg_order_value|floatformat:0 }}
Top products (by revenue)
| Product | Qty sold | Orders | Revenue | % of revenue | Stock left |
{% for p in data.top_products %}
| {{ p.name }} |
{{ p.quantity }} |
{{ p.order_count }} |
TSh {{ p.revenue|floatformat:0 }} |
{{ p.pct_of_revenue }}% |
{% if p.stock_qty is not None %}{{ p.stock_qty }}{% if p.stock_qty < 10 %} low{% endif %}{% else %}—{% endif %} |
{% empty %}
| No completed orders in this window yet. |
{% endfor %}
Orders & spend by area
Matched to the nearest known area for each delivery pin — the closest proxy this app has for
demand/population by neighborhood.{% if data.unmatched_area_count %} {{ data.unmatched_area_count }} order{{ data.unmatched_area_count|pluralize }} had no delivery pin to match.{% endif %}
| Area | Orders | Revenue |
{% for a in data.spend_by_area %}
| {{ a.area }} | {{ a.order_count }} | TSh {{ a.revenue|floatformat:0 }} |
{% empty %}
| No geolocated orders yet. |
{% endfor %}
Orders by source market
Derived from the assigned picker's registered market — a proxy, not a direct order field.
| Market | Orders | Revenue |
{% for m in data.orders_by_market %}
| {{ m.market }} | {{ m.order_count }} | TSh {{ m.revenue|floatformat:0 }} |
{% empty %}
| No orders yet. |
{% endfor %}
Which days customers order
{% for d in data.day_pattern %}
{% if d.count > 0 %}{{ d.count }}{% endif %}
{{ d.label }}
{% endfor %}
What time of day (East Africa Time)
{% for h in data.hour_pattern %}
{% if h.count > 0 %}{{ h.count }}{% endif %}
{{ h.label }}
{% endfor %}
Monthly / seasonal trend
{% for m in data.monthly_trend %}
{% if m.order_count > 0 %}{{ m.order_count }}{% endif %}
{{ m.label }}
{% endfor %}
New vs. returning customers (per month)
| Month | New customers | Returning customers |
{% for c in data.customer_trend %}
| {{ c.label }} | {{ c.new_customers }} | {{ c.returning_customers }} |
{% endfor %}
Delivery cost analysis
{% if data.delivery_cost %}
Avg delivery fee
TSh {{ data.delivery_cost.avg_delivery_fee|floatformat:0 }}
Avg distance
{{ data.delivery_cost.avg_distance_km|floatformat:1 }} km
Realized fee / km
TSh {{ data.delivery_cost.fee_per_km|floatformat:0 }}
Avg picking fee
TSh {{ data.delivery_cost.avg_picking_fee|floatformat:0 }}
Avg package fee
TSh {{ data.delivery_cost.avg_package_fee|floatformat:0 }}
Quick delivery share
{{ data.delivery_cost.quick_delivery_pct }}%
{% else %}
No delivered orders in this window yet.
{% endif %}
Picker ratings ({{ data.rating_breakdown.total_ratings }} total)
{% for r in data.rating_breakdown.distribution reversed %}
{{ r.stars }}★
{{ r.count }} ({{ r.pct }}%)
{% endfor %}
Pickers needing improvement
| Picker | Avg rating | Ratings |
{% for p in data.rating_breakdown.needs_improvement %}
| {{ p.name }} | ★ {{ p.average }} | {{ p.count }} |
{% empty %}
| Not enough rating data yet. |
{% endfor %}
Product demand signals — what to add / restock
Most-searched terms that returned zero results
| Search term | Times searched |
{% for s in data.demand_signals.top_zero_result_searches %}
| {{ s.query }} | {{ s.count }} |
{% empty %}
| No zero-result searches logged yet. |
{% endfor %}
Most-searched terms overall
| Search term | Times searched |
{% for s in data.demand_signals.top_searches %}
| {{ s.query }} | {{ s.count }} |
{% empty %}
| No searches logged yet. |
{% endfor %}
Recent "Contact Us" messages
| From | Message | When |
{% for m in data.demand_signals.recent_contact_messages %}
{{ m.name }} {{ m.email }} |
{{ m.message }} |
{{ m.created_at|slice:":10" }} |
{% empty %}
| No contact messages yet. |
{% endfor %}