Revenue ForecastingADA Asia → Current roleProduction

Revenue Forecasting Platform

Production ML system predicting pipeline and booking outcomes at daily frequency across current and future quarters.

Akash Sharma

Akash Sharma

Primary Owner

Apr 2022 – Present1 min read

5–15%

Model MAPE

4+

Quarter Horizons

Daily

Scoring Frequency

Overview

Built and evolved the core end-of-quarter (EOQ) forecasting system, growing it from a QTD-based heuristic into a multi-layer ML platform. The system produces daily forecasts across four quarter horizons using XGBoost with leakage-safe GroupShuffleSplit validation. Enhancements over 4 years include: time-decay and average-index adjustment layers, SHAP explainability with dual-algorithm contribution logging, and a configurable multi-model framework supporting 30+ parameters for algorithm selection, feature groups, and ensemble composition.

The problem

Revenue teams at B2B SaaS companies needed reliable end-of-quarter pipeline and booking forecasts, starting from day one of the quarter, to drive planning, capacity allocation, and executive reporting. Simple heuristics couldn't capture seasonality, pacing dynamics, or macroeconomic context.

Initial approach
A quarter-to-date (QTD) heuristic projection.
Why it wasn't enough
Heuristics couldn't capture seasonality, pacing dynamics, or macroeconomic context, so the forecast was only as good as the quarter's pace so far.

How the system works

  1. 01

    Raw data

    pipeline and booking records

  2. 02

    Feature engineering

    forecast-category features

  3. 03

    Model families

    XGBoost, Ridge, and others

  4. 04

    Validation

    leakage-safe

  5. 05

    Forecast adjustment

    time-decay and average-index layers

  6. 06

    Daily EOQ prediction

    four quarter horizons

  7. 07

    Production

    scored daily, explained with SHAP

  8. 08

    Actual EOQ

    quarter-end outcome

  9. 09

    Error / accuracy

    5–15% model MAPE

Engineering decisions

Why XGBoost?

Gradient-boosted trees handle the nonlinear interactions across pipeline and booking features, and XGBoost is the core model in the system.

Why leakage-safe validation?

Random splits let future information leak into a forecasting problem, so validation uses GroupShuffleSplit to keep the evaluation honest.

Why multiple model families?

Customer behavior differed enough that one algorithm wasn't universally best, so the framework selects among XGBoost, Ridge, LightGBM, and CatBoost.

Why explainability?

A forecast had to become a decision people could inspect, so SHAP and coefficient contributions are logged to BigQuery.

Validation

Leakage-safe GroupShuffleSplit validation, with daily EOQ forecasts checked against actual quarter-end outcomes.

Results

Holds model MAPE in the 5–15% range through forecast category feature engineering, with daily EOQ forecast accuracy of ~85–99%. System delivers daily pipeline and booking forecasts used by enterprise revenue teams for EOQ planning and boardroom reporting.

Share

Tech Stack

PythonXGBoostRidge RegressionSARIMAXSTL Decompositionscikit-learnSHAPBigQueryGCPParquet

Domain Tags

EOQ ForecastingTime-SeriesLeakage PreventionSHAP ExplainabilityMulti-HorizonRevenue Intelligence

Details

Role
Primary Owner
Status
Production
Tier
Tier 1
Period
Apr 2022 – Present
Employment
ADA Asia → Current role
More Work

Related Revenue Forecasting Projects

Revenue Forecasting
Production

Time-Decay Forecast Smoothing

Dynamic adjustment layer that re-weights prior EOQ history by recency, capturing momentum and velocity signals closer to quarter end.

PythonXGBoostscikit-learn+1
View Case Study →
Revenue Forecasting
Production

Seasonal Index Forecast Adjustment

Statistical fallback layer using day-of-quarter index averages when ML model signals are insufficient.

Pythonscikit-learnBigQuery
View Case Study →
Revenue Forecasting
Production

Model Explainability with SHAP

Dual-algorithm explainability infrastructure: SHAP for tree models, coefficient contribution for linear models, with BigQuery logging.

PythonSHAPTreeExplainer+3
View Case Study →