NiravProof of work
← All projects

Data / Analytics

Case 08 / 13

Demand forecasting across 600+ SKUs

Python regression and time-series forecasts across 600+ SKUs that improved forecast accuracy 24% and enabled $3M+ in procurement and planning savings.

Botrista · 2023–2025 · Demand Planner; owner of the forecasting models

  • 600+ SKUs moved from judgment-based to model-based forecasting.
  • 24% better forecast accuracy, enabling $3M+ in procurement and planning savings.
  • Models in Python, delivered through Google Sheets, because that is where the planners already worked.
$3M+ procurement and planning savings from better forecasts

The numbers

  • $3M+
    Procurement and planning savings
  • 24%
    Forecast accuracy improvement
  • 600+
    SKUs under model-based forecasting
  • Python
  • Regression
  • Time-series models
  • Google Sheets
  • Apps Script

Open the actual model

Interactive — synthetic data

Click the sheet tabs along the bottom — each one is a real tab from the actual model.

docs.google.com/spreadsheets/d/1Qm4…Forecast
Demand Forecast Model — v22File  Edit  View  Insert  Format  Data  Extensions
↶↷🖨100%$%.00⊞▾⊟Σ
fx=FORECAST.ETS(B2, $C$2:$C$61, $A$2:$A$61)
ABCDEFGH
1SKU▾Trailing 12mo Avg/mo▾Seasonality Idx▾Next-Mo Forecast▾Error %▾
2SKU-A104241801.1246803.1%
3SKU-A119726400.9424804.8%
4SKU-A125631101.0532602.2%
5SKU-A130918900.88166011.4%
6SKU-A138822701.0223101.9%
7SKU-A141714201.3118606.7%
8
9
10
11
12
13
14
15
16
Forecast vs trailing average⋮
A1042A1197A1256A1309A1388A1417
Trailing avgForecast

The forecasts reach planners in the tool they already used, Google Sheets, so that is what this mockup shows. SKU codes and figures are synthetic; the sheet structure and formulas are representative.

How it fits together

  1. 1Source data consolidation
  2. 2Automated cleaning
  3. 3Per-SKU forecast with seasonality
  4. 4Error measurement
Read the full case study Hide the case study

The problem

Demand planning across 600+ SKUs was manual and judgment-driven. Forecast error propagated straight into procurement, inventory, and production planning decisions, and nobody could say how large that error was because it was not being measured.

Why it mattered

At that SKU count, forecast error is expensive in both directions. Excess inventory ties up capital and creates obsolescence; shortfalls hit service levels and revenue. The planning function was also a bottleneck — manual forecasting at that scale consumed the cycle time that should have gone to analysis.

What I built

Statistical forecasting models across the full SKU portfolio, incorporating seasonality and trend, with an automated data pipeline replacing manual consolidation.

The models themselves were statistical — regression and time-series methods in Python — and the outputs were delivered into Google Sheets with Apps Script automation. That was a deliberate constraint rather than a limitation I worked around: the organization’s planning workflows already lived in Sheets, and adoption mattered more than tooling elegance. A better model that Procurement would not use is worth less than a good model wired into the process they already run.

What I learned

Accuracy improvements only convert to savings if the downstream process actually consumes the forecast. The modelling was less than half the work. Getting procurement to plan against model output rather than judgment was the rest, and it took longer.

What I would do next

Move the delivery layer off spreadsheets onto a proper analytical stack. Segment SKUs so high-volume and intermittent-demand items get different methods rather than one approach applied uniformly. Hierarchical reconciliation across product families.

Prior employer. Described without supplier, customer, or product information. Any figures in the demo are synthetic.