Data Analytics dashboard

Commercial Performance & Promotion Intelligence

A decision-focused synthetic FMCG commercial analytics dashboard.

fixture

Decision: where should a fictional commercial team reallocate next-quarter promotion investment while protecting net revenue and gross margin?

Deterministic synthetic portfolio data · snapshot 30 Jun 2026 · no employer or customer information.

Net revenue

$12.55MSource: Commercial KPI summaryTables: fact_sales, fact_budget_forecast

Revenue after returns and discounts.

Revenue after returns and discounts.Source: Commercial KPI summaryTables: fact_sales, fact_budget_forecast

Deterministic query executed by scripts/build_analytics_projects.py.

Vs budget

-0.9%Source: Commercial KPI summaryTables: fact_sales, fact_budget_forecast

Actual net revenue versus the complete-period budget.

Actual net revenue versus the complete-period budget.Source: Commercial KPI summaryTables: fact_sales, fact_budget_forecast

Deterministic query executed by scripts/build_analytics_projects.py.

Gross margin

61.5%Source: Commercial KPI summaryTables: fact_sales, fact_budget_forecast

Weighted gross profit divided by net revenue.

Weighted gross profit divided by net revenue.Source: Commercial KPI summaryTables: fact_sales, fact_budget_forecast

Deterministic query executed by scripts/build_analytics_projects.py.

Net units

4.16MSource: Commercial KPI summaryTables: fact_sales, fact_budget_forecast

Gross units less returned units.

Gross units less returned units.Source: Commercial KPI summaryTables: fact_sales, fact_budget_forecast

Deterministic query executed by scripts/build_analytics_projects.py.

Forecast WAPE

2.2%Source: Commercial KPI summaryTables: fact_sales, fact_budget_forecast

Absolute locked-forecast unit error divided by actual units; lower is better.

Absolute locked-forecast unit error divided by actual units; lower is better.Source: Commercial KPI summaryTables: fact_sales, fact_budget_forecast

Deterministic query executed by scripts/build_analytics_projects.py.

Net revenue and budget by month
Net revenue and budget by month data
MonthActual RevenueBudget Revenue
2025-01$575.79K$581.95K
2025-02$539.3K$544.21K
2025-03$651.74K$656.77K
2025-04$664.03K$670.14K
2025-05$759.24K$764.11K
2025-06$770.1K$775.86K
2025-07$828.45K$833.53K
2025-08$799.63K$806.81K
2025-09$673.83K$679.47K
2025-10$669.53K$674.28K
2025-11$711.18K$714.43K
2025-12$812.8K$817.48K
2026-01$601.76K$606.45K
2026-02$561.46K$565.62K
2026-03$674.52K$681.26K
2026-04$691.32K$696.45K
2026-05$765.59K$794.43K
2026-06$800.77K$806.12K

Market performance

Source: Market performanceTables: fact_sales, fact_budget_forecast

Deterministic query executed by scripts/build_analytics_projects.py.

Market performance
MarketNet revenueGross marginVs budget
Central$3.7MSource: Market performanceTables: fact_sales, fact_budget_forecast61.8%Source: Market performanceTables: fact_sales, fact_budget_forecast-0.9%Source: Market performanceTables: fact_sales, fact_budget_forecast
North$3.62MSource: Market performanceTables: fact_sales, fact_budget_forecast63.6%Source: Market performanceTables: fact_sales, fact_budget_forecast-0.8%Source: Market performanceTables: fact_sales, fact_budget_forecast
South$2.8MSource: Market performanceTables: fact_sales, fact_budget_forecast59.3%Source: Market performanceTables: fact_sales, fact_budget_forecast-1%Source: Market performanceTables: fact_sales, fact_budget_forecast
West$2.44MSource: Market performanceTables: fact_sales, fact_budget_forecast60.6%Source: Market performanceTables: fact_sales, fact_budget_forecast-1.1%Source: Market performanceTables: fact_sales, fact_budget_forecast

Promotion decision

Recommendation: Run a bounded next-quarter test in the 10%Source: Promotion effectivenessTable: fact_promotion band (modeled weighted ROI 24.5%Source: Promotion effectivenessTable: fact_promotion); keep the modeled baseline and margin guardrail visible before scaling.

Source: Promotion effectivenessTable: fact_promotion

Deterministic query executed by scripts/build_analytics_projects.py.

Weighted modeled ROI by discount band
Weighted modeled ROI by discount band data
Discount BandPromotion Roi
10%24.5%
15%7.9%
20%1.4%
30%-41.6%

Promotion decision detail

Source: Promotion effectivenessTable: fact_promotion

Deterministic query executed by scripts/build_analytics_projects.py.

Promotion decision detail
Discount bandWeighted ROIModeled unit upliftIncremental profitInvestment
10%24.5%Source: Promotion effectivenessTable: fact_promotion45.4%Source: Promotion effectivenessTable: fact_promotion$1.78KSource: Promotion effectivenessTable: fact_promotion$7.28KSource: Promotion effectivenessTable: fact_promotion
15%7.9%Source: Promotion effectivenessTable: fact_promotion57.8%Source: Promotion effectivenessTable: fact_promotion$761.42Source: Promotion effectivenessTable: fact_promotion$9.66KSource: Promotion effectivenessTable: fact_promotion
20%1.4%Source: Promotion effectivenessTable: fact_promotion71.5%Source: Promotion effectivenessTable: fact_promotion$185.82Source: Promotion effectivenessTable: fact_promotion$12.89KSource: Promotion effectivenessTable: fact_promotion
30%-41.6%Source: Promotion effectivenessTable: fact_promotion54.6%Source: Promotion effectivenessTable: fact_promotion-$7.65KSource: Promotion effectivenessTable: fact_promotion$18.41KSource: Promotion effectivenessTable: fact_promotion
Net revenue by product
Net revenue by product data
Product NameNet Revenue
Luma Granola$982.48K
Luma Oats$885.71K
Orbit Bites$874.86K
Vela Mix$873.26K
Aster Crunch$864.71K
Halo Muesli$857.83K
Northstar Porridge$794.52K
Aster Sparkling$755.2K
Orbit Bar$736.67K
Vela Citrus$735.08K
Vela Protein Shake$726.03K
Aster Still$724.21K
Luma Oat Drink$715.86K
Vela Berry$709.9K
Halo Almond Drink$683.03K
Orbit Plant Snack$631.69K

Product decision detail

Source: Product decision detailTables: fact_sales, fact_budget_forecast

Deterministic query executed by scripts/build_analytics_projects.py.

Product decision detail
ProductCategoryNet revenueGross marginVs budgetNet units
Luma GranolaBreakfast$982.48KSource: Product decision detailTables: fact_sales, fact_budget_forecast59.3%Source: Product decision detailTables: fact_sales, fact_budget_forecast-0.8%Source: Product decision detailTables: fact_sales, fact_budget_forecast215.66KSource: Product decision detailTables: fact_sales, fact_budget_forecast
Luma OatsBreakfast$885.71KSource: Product decision detailTables: fact_sales, fact_budget_forecast61.2%Source: Product decision detailTables: fact_sales, fact_budget_forecast-0.7%Source: Product decision detailTables: fact_sales, fact_budget_forecast235.15KSource: Product decision detailTables: fact_sales, fact_budget_forecast
Orbit BitesSnacks$874.86KSource: Product decision detailTables: fact_sales, fact_budget_forecast64%Source: Product decision detailTables: fact_sales, fact_budget_forecast-0.2%Source: Product decision detailTables: fact_sales, fact_budget_forecast304.65KSource: Product decision detailTables: fact_sales, fact_budget_forecast
Vela MixSnacks$873.26KSource: Product decision detailTables: fact_sales, fact_budget_forecast61.9%Source: Product decision detailTables: fact_sales, fact_budget_forecast-0.7%Source: Product decision detailTables: fact_sales, fact_budget_forecast244.69KSource: Product decision detailTables: fact_sales, fact_budget_forecast
Aster CrunchSnacks$864.71KSource: Product decision detailTables: fact_sales, fact_budget_forecast62.4%Source: Product decision detailTables: fact_sales, fact_budget_forecast-0.6%Source: Product decision detailTables: fact_sales, fact_budget_forecast264.74KSource: Product decision detailTables: fact_sales, fact_budget_forecast
Halo MuesliBreakfast$857.83KSource: Product decision detailTables: fact_sales, fact_budget_forecast59.5%Source: Product decision detailTables: fact_sales, fact_budget_forecast-0.9%Source: Product decision detailTables: fact_sales, fact_budget_forecast176.73KSource: Product decision detailTables: fact_sales, fact_budget_forecast
Northstar PorridgeBreakfast$794.52KSource: Product decision detailTables: fact_sales, fact_budget_forecast60.4%Source: Product decision detailTables: fact_sales, fact_budget_forecast-3.4%Source: Product decision detailTables: fact_sales, fact_budget_forecast191.4KSource: Product decision detailTables: fact_sales, fact_budget_forecast
Aster SparklingHydration$755.2KSource: Product decision detailTables: fact_sales, fact_budget_forecast64.6%Source: Product decision detailTables: fact_sales, fact_budget_forecast-0.6%Source: Product decision detailTables: fact_sales, fact_budget_forecast347.39KSource: Product decision detailTables: fact_sales, fact_budget_forecast
Orbit BarSnacks$736.67KSource: Product decision detailTables: fact_sales, fact_budget_forecast65.1%Source: Product decision detailTables: fact_sales, fact_budget_forecast-1.3%Source: Product decision detailTables: fact_sales, fact_budget_forecast437.15KSource: Product decision detailTables: fact_sales, fact_budget_forecast
Vela CitrusHydration$735.08KSource: Product decision detailTables: fact_sales, fact_budget_forecast63.5%Source: Product decision detailTables: fact_sales, fact_budget_forecast-0.6%Source: Product decision detailTables: fact_sales, fact_budget_forecast284.97KSource: Product decision detailTables: fact_sales, fact_budget_forecast
Vela Protein ShakePlant-Based$726.03KSource: Product decision detailTables: fact_sales, fact_budget_forecast56.3%Source: Product decision detailTables: fact_sales, fact_budget_forecast-1.2%Source: Product decision detailTables: fact_sales, fact_budget_forecast166.57KSource: Product decision detailTables: fact_sales, fact_budget_forecast
Aster StillHydration$724.21KSource: Product decision detailTables: fact_sales, fact_budget_forecast64.8%Source: Product decision detailTables: fact_sales, fact_budget_forecast-1%Source: Product decision detailTables: fact_sales, fact_budget_forecast405.7KSource: Product decision detailTables: fact_sales, fact_budget_forecast
Luma Oat DrinkPlant-Based$715.86KSource: Product decision detailTables: fact_sales, fact_budget_forecast59.1%Source: Product decision detailTables: fact_sales, fact_budget_forecast-0.6%Source: Product decision detailTables: fact_sales, fact_budget_forecast225.69KSource: Product decision detailTables: fact_sales, fact_budget_forecast
Vela BerryHydration$709.9KSource: Product decision detailTables: fact_sales, fact_budget_forecast63.2%Source: Product decision detailTables: fact_sales, fact_budget_forecast-0.5%Source: Product decision detailTables: fact_sales, fact_budget_forecast265.41KSource: Product decision detailTables: fact_sales, fact_budget_forecast
Halo Almond DrinkPlant-Based$683.03KSource: Product decision detailTables: fact_sales, fact_budget_forecast58.3%Source: Product decision detailTables: fact_sales, fact_budget_forecast-0.9%Source: Product decision detailTables: fact_sales, fact_budget_forecast186.3KSource: Product decision detailTables: fact_sales, fact_budget_forecast

16 results · Showing first 15

Quality and reconciliation evidence

Source: Executed commercial QA checksTable: quality_checks

Deterministic query executed by scripts/build_analytics_projects.py.

Quality and reconciliation evidence
CheckStatusEvidence
All four planned discount bands are representedPASS4 bands
Daily sales grain is uniquePASS139,776 rows; 0 duplicates
Dashboard and SQL totals agreePASSExact to €0.01
Discount depth is not confounded with one execution mechanicPASS4 mechanics represented in every discount band
Every sales slice has one budget and locked forecastPASS4,608 matched slices
Forecast is locked before each reporting monthPASS0 invalid lock dates
Net revenue formula reconcilesPASS0 rows outside €0.01 tolerance
Promotion dates are validPASS0 invalid windows
Returns never exceed gross unitsPASS0 violations

Method and limitations

Promotion baselines are modeled, so ROI is scenario analysis rather than a causal experiment. Budget and actual cover the same complete period. Exact formulas, SQL, data dictionary, notebook and QA evidence are included beside this dashboard.

Sources

  1. Commercial KPI summarysql/analytics.sql · SQLite 3 · 2026-06-30T18:00:00Z

    Deterministic query executed by scripts/build_analytics_projects.py.

    SQL query
    WITH actual_by_slice AS (
      SELECT month, sku_id, market, channel,
             SUM(net_units) AS actual_units,
             SUM(net_revenue_eur) AS net_revenue,
             SUM(gross_profit_eur) AS gross_profit
      FROM fact_sales GROUP BY month, sku_id, market, channel
    ), actual AS (
      SELECT SUM(net_revenue) AS net_revenue,
             SUM(gross_profit) AS gross_profit,
             SUM(actual_units) AS net_units,
             SUM(ABS(actual_units - forecast_units)) AS absolute_forecast_error,
             SUM(actual_units) AS actual_units
      FROM actual_by_slice
      JOIN fact_budget_forecast USING (month, sku_id, market, channel)
    ), plan AS (
      SELECT SUM(budget_revenue_eur) AS budget_revenue FROM fact_budget_forecast
    )
    SELECT ROUND(net_revenue, 2) AS net_revenue,
           ROUND((net_revenue - budget_revenue) / budget_revenue, 6) AS budget_variance_rate,
           ROUND(gross_profit / net_revenue, 6) AS gross_margin_rate,
           net_units,
           ROUND(absolute_forecast_error * 1.0 / actual_units, 6) AS forecast_wape
    FROM actual CROSS JOIN plan;
  2. Monthly revenue and budgetsql/analytics.sql · SQLite 3 · 2026-06-30T18:00:00Z

    Deterministic query executed by scripts/build_analytics_projects.py.

    SQL query
    SELECT s.month,
           ROUND(SUM(s.net_revenue_eur), 2) AS actual_revenue,
           ROUND(MAX(b.budget_revenue), 2) AS budget_revenue,
           ROUND(SUM(s.gross_profit_eur), 2) AS gross_profit
    FROM fact_sales s
    JOIN (SELECT month, SUM(budget_revenue_eur) AS budget_revenue
          FROM fact_budget_forecast GROUP BY month) b ON b.month = s.month
    GROUP BY s.month ORDER BY s.month;
  3. Market performancesql/analytics.sql · SQLite 3 · 2026-06-30T18:00:00Z

    Deterministic query executed by scripts/build_analytics_projects.py.

    SQL query
    WITH budgets AS (
      SELECT market, SUM(budget_revenue_eur) AS budget_revenue
      FROM fact_budget_forecast GROUP BY market
    )
    SELECT s.market,
           ROUND(SUM(s.net_revenue_eur), 2) AS net_revenue,
           ROUND(SUM(s.gross_profit_eur) / SUM(s.net_revenue_eur), 6) AS gross_margin_rate,
           ROUND((SUM(s.net_revenue_eur) - MAX(b.budget_revenue)) / MAX(b.budget_revenue), 6) AS budget_variance_rate
    FROM fact_sales s JOIN budgets b ON b.market = s.market
    GROUP BY s.market ORDER BY net_revenue DESC;
  4. Promotion effectivenesssql/analytics.sql · SQLite 3 · 2026-06-30T18:00:00Z

    Deterministic query executed by scripts/build_analytics_projects.py.

    SQL query
    SELECT CASE
             WHEN discount_pct < .125 THEN '10%'
             WHEN discount_pct < .175 THEN '15%'
             WHEN discount_pct < .25 THEN '20%'
             ELSE '30%'
           END AS discount_band,
           ROUND(AVG(discount_pct), 4) AS discount_pct,
           ROUND(SUM(incremental_profit_eur), 2) AS incremental_profit_eur,
           ROUND(SUM(promotion_investment_eur), 2) AS promotion_investment_eur,
           ROUND(SUM(incremental_profit_eur) / SUM(promotion_investment_eur), 6) AS promotion_roi,
           ROUND(SUM(actual_units - baseline_units) * 1.0 / SUM(baseline_units), 6) AS unit_uplift_pct
    FROM fact_promotion GROUP BY discount_band ORDER BY discount_pct;
  5. Product decision detailsql/analytics.sql · SQLite 3 · 2026-06-30T18:00:00Z

    Deterministic query executed by scripts/build_analytics_projects.py.

    SQL query
    WITH budgets AS (
      SELECT sku_id, SUM(budget_revenue_eur) AS budget_revenue
      FROM fact_budget_forecast GROUP BY sku_id
    )
    SELECT s.sku_id, MAX(s.product_name) AS product_name, MAX(s.category) AS category,
           ROUND(SUM(s.net_revenue_eur), 2) AS net_revenue,
           ROUND(SUM(s.gross_profit_eur) / SUM(s.net_revenue_eur), 6) AS gross_margin_rate,
           ROUND((SUM(s.net_revenue_eur) - MAX(b.budget_revenue)) / MAX(b.budget_revenue), 6) AS budget_variance_rate,
           SUM(s.net_units) AS net_units
    FROM fact_sales s JOIN budgets b ON b.sku_id = s.sku_id
    GROUP BY s.sku_id ORDER BY net_revenue DESC;
  6. Executed commercial QA checkssql/analytics.sql · SQLite 3 · 2026-06-30T18:00:00Z

    Deterministic query executed by scripts/build_analytics_projects.py.

    SQL query
    SELECT "check" AS "check", status, result FROM quality_checks ORDER BY "check";