The problem
Revenue planning for a services company runs on recurring service intervals, a backlog of scheduled work, and a pipeline of new opportunities, each with different dynamics and different data. A single forecast number assembled by hand each month cannot say how confident it is or which of those drivers moved.
Leadership needed a forecast they could plan against: one total, a prediction interval around it, and a reconciled breakdown by category that adds up to the same total.
What I did
-
Built the forecasting data layer from the service-management warehouse and Salesforce opportunity snapshots, with a scripted snapshot job so pipeline history exists as of each month rather than being overwritten.
-
Trained a set of specialist forecasters rather than one model: damped Holt-Winters and SARIMA on log revenue, Ridge direct models, LightGBM, and two time-series foundation models (Chronos-2 and TimesFM-2.5), plus structural experts for unit renewals, facility-by-category mix, backlog, and open pipeline.
-
Combined them with learned weights fit on rolling-origin backtests, then reconciled the category forecasts hierarchically so they sum to the total forecast. Every release reports holdout error against a confirmation window before it is used.
-
Benchmarked the LightGBM approach against the public Walmart M5 competition data with its official WRMSSE scorer, so the modeling choices were tested somewhere I could not fool myself.
-
Published the results as an HTML dashboard with prediction intervals, so the executives see the range and the drivers, not just the point estimate.
- Data layer Warehouse history plus monthly Salesforce pipeline snapshots.
- Specialist forecasters 6 Damped Holt-Winters, SARIMA, Ridge, LightGBM, Chronos-2, TimesFM-2.5, plus structural experts for renewals, mix, backlog, and pipeline.
- Learned weights Fit on rolling-origin backtests, so the weights reflect out-of-sample error.
- Reconcile Category forecasts are adjusted so they sum to the total. gate
- Publish An HTML dashboard with prediction intervals and drivers.
Outcome
The learned-weight combination beats the best single forecaster on holdout, and the reconciled total is the number revenue planning now starts from.
Because the pipeline is reproducible and backtested, a change to the data or the models is a measurable change in error, not a matter of opinion.
- Training window
- Holdout scored against actuals
- Forecast ahead
Each origin trains on history to that point and scores the next months against what actually happened. The learned ensemble weights are fit on these holdout errors, and a release is used only after it beats the previous one on them.
In the stack
Where it sits
The highlighted nodes are the systems and people this project touched.
Skills used
- Python (production automation, 6,000+ lines)
- Time-series forecasting (ETS, SARIMA, gradient boosting, foundation models)
- Econometrics & statistics (regression with robust and clustered errors, GLMs)
- SQL
- MS SQL Server
- Salesforce (administration, integration, reporting)
- Data modeling & analytics
- Executive stakeholder management
- Revenue operations & pipeline analytics