{{ loadingMsg }}

Sales Report Dashboard

Simple View-only Analytics

Back
to

Top Sales Items

{{ topItems.length }} Products
Rank Product Name Brand Total Volume Total Revenue ($)
No sales data matches the current filters.
OVERALL SUM ${{ topItems.reduce((sum, i) => sum + i.sales, 0).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}) }}

Top Customer Outlets

{{ salesByOutlet.length }} Outlets
Rank Outlet Name Total Volume Total Spend ($)
No outlet data matches the current filters.
OVERALL SUM ${{ salesByOutlet.reduce((sum, o) => sum + o.sales, 0).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}) }}

Multi-Month Filter Required

To compare month-by-month sales data, please select a broader Date Range of 2 or more months (e.g., from April 1 to June 30) in the filters above.

Month-over-Month Comparison Grid

{{ planningFilters.groupBy === 'products' ? productsMoM.length : brandsMoM.length }} Rows
{{ planningFilters.groupBy === 'products' ? 'Product Name' : 'Brand' }} Brand {{ formatMonthLabel(m) }} Overall Total Average / Month Next 3 Months On Hand Stock Calculate Next PO
{{ row.name }} {{ row.brand }} {{ row.brand }}
${{ row.monthlySales[m].toLocaleString(undefined, {minimumFractionDigits: 0, maximumFractionDigits: 0}) }} {{ row.monthlyQty[m] > 0 ? row.monthlyQty[m].toLocaleString() : '-' }}
${{ row.totalSales.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}) }} {{ row.totalQty.toLocaleString() }} {{ planningFilters.unit }} ${{ getRowMetricAverage(row).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}) }} {{ getRowMetricAverage(row).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}) }} {{ planningFilters.unit }} ${{ getRowMetricNext3Months(row).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}) }} {{ getRowMetricNext3Months(row).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}) }} {{ planningFilters.unit }}
{{ planningFilters.unit }}
{{ calculateNextPO(row).toLocaleString(undefined, {maximumFractionDigits: 0}) }} {{ planningFilters.unit }} 0 {{ planningFilters.unit }}
No sales details matches the current filters.
COLUMN TOTALS ${{ calculateMonthSum(m, 'sales').toLocaleString(undefined, {maximumFractionDigits: 0}) }} {{ calculateMonthSum(m, 'qty').toLocaleString() }} ${{ (planningFilters.groupBy === 'products' ? productsMoM : brandsMoM).reduce((s, r) => s + r.totalSales, 0).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}) }} {{ (planningFilters.groupBy === 'products' ? productsMoM : brandsMoM).reduce((s, r) => s + r.totalQty, 0).toLocaleString() }} {{ planningFilters.unit }} ${{ (planningFilters.groupBy === 'products' ? productsMoM : brandsMoM).reduce((s, r) => s + getRowMetricAverage(r), 0).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}) }} {{ (planningFilters.groupBy === 'products' ? productsMoM : brandsMoM).reduce((s, r) => s + getRowMetricAverage(r), 0).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}) }} {{ planningFilters.unit }} ${{ (planningFilters.groupBy === 'products' ? productsMoM : brandsMoM).reduce((s, r) => s + getRowMetricNext3Months(r), 0).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}) }} {{ (planningFilters.groupBy === 'products' ? productsMoM : brandsMoM).reduce((s, r) => s + getRowMetricNext3Months(r), 0).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}) }} {{ planningFilters.unit }} {{ (planningFilters.groupBy === 'products' ? productsMoM : brandsMoM).reduce((s, r) => s + getOnHandStock(r), 0).toLocaleString() }} {{ planningFilters.unit }} {{ (planningFilters.groupBy === 'products' ? productsMoM : brandsMoM).reduce((s, r) => s + calculateNextPO(r), 0).toLocaleString() }} {{ planningFilters.unit }}

No Data Loaded

Select your date range and filters above, then click 'Fetch Data' to view your sales reports.