You have two or three years of sales data sitting in a spreadsheet. Your CFO wants a six-month revenue projection for the board deck. Your operations team needs demand numbers for inventory planning. And everyone wants to know: is the holiday spike getting bigger or smaller each year? Revenue Time Series Forecast turns your historical transaction data into month-by-month projections with confidence intervals, seasonal decomposition, and category-level breakdowns. Upload a CSV to make a sales forecast.
Worked Example (Simulated): How Close Is a Six-Month Forecast?
Question: In made-up monthly sales, how much does a model say it will earn over six months, and how close is it to six saved values?
Inputs: Simulated data, seed 2026: monthly sales for Jan 2022 to Dec 2025. The first 42 months are used to fit the model and the last 6 are held out. The script builds revenue as 12,000 + 180 per month + a month-of-year shape (November +350, December +700) + random noise with SD 180.
Method: Fit a straight line plus month effects. A residual is the gap between the fit and the data. The range around each guess is 1.96 times the training residual SD, the usual spread of those gaps. Then compare each guess with its saved value.
import numpy as np
SEED = 2026
rng = np.random.default_rng(SEED)
months = np.arange(48)
season = np.array([0, -180, -120, -40, 20, 70, 100, 80, 40, 100, 350, 700])
revenue = (12000 + 180 * months + season[months % 12]
+ rng.normal(0, 180, size=48))
# Fit a linear trend plus month-of-year effects on the first 42 months.
train_months = months[:42]
train_values = revenue[:42]
def design(x):
month = x % 12
return np.column_stack(
[np.ones(len(x)), x] + [(month == m).astype(float) for m in range(1, 12)]
)
beta, _, _, _ = np.linalg.lstsq(design(train_months), train_values, rcond=None)
residuals = train_values - design(train_months) @ beta
dof = len(train_values) - design(train_months).shape[1]
resid_sd = np.sqrt(np.sum(residuals ** 2) / dof)
future_months = months[42:]
pred = design(future_months) @ beta
lo = pred - 1.96 * resid_sd
hi = pred + 1.96 * resid_sd
actual = revenue[42:]
mae = np.mean(np.abs(actual - pred))
mape = np.mean(np.abs((actual - pred) / actual)) * 100
print(f"Simulated data, seed {SEED}")
print("Inputs: monthly revenue, Jan 2022-Dec 2025.")
print("First 42 months used to fit; last 6 held out.")
print("Method: linear trend plus month-of-year effects.")
print("Range = forecast +/- 1.96 training residual SD.")
print("Month | Forecast | Model-based 95% prediction range | Held-out value")
for i, p, low, high, observed in zip(future_months, pred, lo, hi, actual):
year = 2022 + i // 12
month = i % 12 + 1
print(f"{year}-{month:02d} | ${p:,.0f} | ${low:,.0f} to ${high:,.0f} "
f"| ${observed:,.0f}")
print(f"Held-out evaluation: MAE ${mae:,.0f}; MAPE {mape:.1f}%.")
Printed output:
Simulated data, seed 2026
Inputs: monthly revenue, Jan 2022-Dec 2025.
First 42 months used to fit; last 6 held out.
Method: linear trend plus month-of-year effects.
Range = forecast +/- 1.96 training residual SD.
Month | Forecast | Model-based 95% prediction range | Held-out value
2025-07 | $19,593 | $19,294 to $19,892 | $19,511
2025-08 | $19,867 | $19,568 to $20,166 | $20,080
2025-09 | $19,995 | $19,697 to $20,294 | $20,067
2025-10 | $20,324 | $20,025 to $20,623 | $20,330
2025-11 | $20,636 | $20,337 to $20,935 | $21,023
2025-12 | $21,253 | $20,954 to $21,552 | $21,013
Held-out evaluation: MAE $166; MAPE 0.8%.
Result: From Jul to Dec 2025, the forecast grew from $19,593 to $21,253. Over the six held-out months, MAE (mean absolute error, the average gap) was $166 and MAPE (mean absolute percent error, the average percent gap) was 0.8%. That low error is expected, not a finding: the model has exactly the form the script used to build the data. The printed range leaves out the uncertainty in the fitted line, so it is narrower than a full prediction range. One of the six held-out months falls outside it: Nov 2025 came in at $21,023, above the range top of $20,935.
Limit: These data are made up, and the results hold for this sample only. A real series can shift suddenly, and the model may miss other causes of future error.
Sources
Hyndman, Koehler, Snyder and Grose published state space models for exponential smoothing in 2002. Ljung and Box published their lack-of-fit measure in 1978. Akaike published his information criterion in 1974.
What Is Revenue Time Series Forecast?
Revenue Time Series Forecast takes your historical sales or revenue data, identifies the underlying patterns (long-term growth or decline, repeating seasonal cycles, and irregular fluctuations) then projects those patterns forward to generate month-by-month revenue predictions. ETS (Error, Trend, Seasonality) exponential smoothing is a family of forecasting methods that tracks past error, trend, and seasonal change.
To see where your own measure is heading, with a likely range, try the free forecasting tool.
The core idea is intuitive. Your revenue is not random. It is shaped by forces that repeat: holiday shopping spikes in November and December, summer slowdowns in certain industries, back-to-school demand in August. ETS separates these repeating patterns from the underlying trend (is your business growing 8% year-over-year or contracting?) and from the noise (one-off events like a viral social media post or a supply chain disruption). Once those components are isolated, the model extends them into the future.
What makes this different from drawing a line through your data in Excel is statistical rigor. The report gives one guess and a range from the model. Both ends are estimates, and how well the range covers future values depends on the model. A range from a model describes future values under that model. It cannot ensure the real value will be in the range.
When to Use Revenue Time Series Forecast
The most natural use case is annual budgeting and revenue target setting. If your company sets quarterly or annual revenue targets, this tool replaces the back-of-envelope estimates with a data-driven baseline. Instead of saying "we grew 12% last year so let's plan for 15%," you get a forecast that accounts for which months carry the growth and which months are seasonally weak. A forecast that says Q1 will be $1.2M and Q3 will be $900K is far more useful for resource allocation than an annual number divided by four.
E-commerce revenue forecasting is where the seasonal decomposition shines. Online retailers live and die by seasonal patterns: Black Friday, Prime Day, Valentine's Day, back-to-school. The tool quantifies exactly how large each seasonal peak is, whether it is growing or shrinking relative to the baseline, and what revenue to expect during off-peak months. If your November spike has been growing 15% year-over-year while your baseline growth is only 5%, the seasonal decomposition makes that visible.
Seasonal demand planning follows directly from the forecast. If you know that revenue will peak at $600K in November but drop to $350K in February, you can plan inventory purchases, staffing levels, and marketing spend accordingly. The category-level breakdowns make this even more actionable, if your Electronics category drives 60% of the November spike but Clothing is flat, you know where to concentrate your preparation.
Budget planning from historical sales is another strong fit. Finance teams often need forward-looking numbers for cash flow projections, hiring plans, and investor reporting. The confidence intervals let you present three scenarios (conservative (lower bound), expected (point forecast), and optimistic (upper bound)) each grounded in the same statistical model rather than gut feel.
Investor reporting benefits from the board-ready output option. The tool generates clean forecast charts with confidence bands that communicate both the projection and the uncertainty. A chart that shows revenue growing from $400K to $500K per month over six months, with a shaded band showing the range of outcomes, tells a more credible story than a hockey stick slide with no uncertainty quantification.
What Data Do You Need?
At minimum, you need a CSV with two columns: a date column (order date, transaction date, invoice date: any timestamp associated with each sale) and a numeric revenue column (the dollar amount, sales total, or quantity). The tool aggregates your transaction-level records into monthly totals automatically, so you do not need to pre-aggregate your data. Whether you have one row per order or one row per line item, the tool handles the rollup.
For reliable seasonal estimation, aim for at least 24 months of historical data. The model needs to see at least two full seasonal cycles to distinguish a genuine December spike from a one-time event. With three or more years, the estimates become substantially more stable because the model can verify that the patterns repeat. Data with fewer than 12 months will likely fail to produce a seasonal model, and the tool will flag this.
Optional columns unlock additional analysis. A category column (product category, department, business line) enables per-category trend breakdowns so you can see which segments are growing and which are declining. A region column produces geographic breakdowns. A segment column (customer type, channel, tier) adds another dimension of analysis. You can map any or all of these when you upload.
Date formats are flexible: the tool handles YYYY-MM-DD, MM/DD/YYYY, DD/MM/YYYY, and most other common formats. Revenue values should be numeric and positive. If your data contains returns or refunds as negative values, those are fine. They will net against positive sales during monthly aggregation. However, if entire months net to zero or negative, the multiplicative ETS model may struggle, and the tool will switch to an additive model automatically.
How to Read the Report
The report is organized into sections, each presented as a card in the interactive viewer. Here is what each one tells you and how to use it.
The Analysis Overview slide shows two cards side by side. The overview card summarizes your dataset: how many transactions, the date range covered, and the analysis parameters (forecast horizon, confidence level, seasonality mode). The preprocessing card shows how the raw transactions were aggregated into monthly totals, including any months that were filled in if your data had gaps. Check this to confirm the tool interpreted your data correctly.
The Executive Summary (TL;DR) is the card you send to your boss. It distills the entire analysis into key findings: the overall revenue trajectory, the forecast for the next six months, the strength of seasonal patterns, and the model's accuracy. If the model says revenue is trending up 3% month-over-month with a strong Q4 seasonal component, this is where that conclusion appears in plain language with AI-generated interpretation.
The Revenue Forecast chart is the centerpiece. It shows your historical monthly revenue as a solid line, then extends it into the future with point forecasts and shaded confidence bands (typically 80% and 95% intervals). The narrower inner band is the 80% interval. It is the model's 80% range: it describes future values under that model and cannot ensure the real value will land inside it. The wider outer band is the 95% interval. Use the 80% band for operational planning and the 95% band for stress testing.
The Seasonal Decomposition chart breaks your revenue into three components. The trend line shows the long-term direction stripped of seasonal noise: is your business genuinely growing, flat, or declining? The seasonal component shows the repeating pattern, which months are consistently above or below average, and by how much. The remainder captures everything else: one-off events, measurement noise, and anything the model cannot explain. If the remainder shows large spikes, those are months where something unusual happened.
The Category Trends chart shows monthly revenue broken down by product category (or whatever grouping variable you mapped). This reveals which categories drive overall growth and which are dragging. If total revenue is up 10% but that growth is entirely concentrated in one category while others are flat or declining, this chart makes it obvious. Use this for portfolio decisions: invest in growing categories, investigate declining ones.
The Forecast Detail table lists each forecasted month with the point estimate, lower bound, and upper bound. This is the table you paste into your budget spreadsheet. Each row is a month, each column is a number you can plan against. The lower bound is your conservative scenario, the point forecast is your expected case, and the upper bound is your optimistic scenario.
The Model Performance card reports how well the ETS model fits your historical data. The key metric is MAPE (Mean Absolute Percentage Error): the average percentage the model was off when predicting months it already knew about. Judge MAPE for this task against a simple check. There is no one rating for all cases. RMSE (Root Mean Squared Error) and MAE (Mean Absolute Error) provide additional accuracy measures in absolute dollar terms. The Ljung-Box test checks if model errors show a pattern over time. If p > 0.05, it found no clear pattern. That does not prove the model found every pattern.
When to Use Something Else
If you need to understand what drives revenue rather than just predict it, use a regression model. Revenue Time Series Forecast is purely historical. It extrapolates patterns from the past. It cannot tell you that a 10% increase in ad spend will produce a 5% revenue lift. For causal questions like "what happens if we change pricing?" or "how much does marketing spend affect revenue?", use Ridge Regression or Lasso Regression instead.
If you want more control over the model specification (custom differencing, exogenous variables, or manual ARIMA order selection) use the ARIMA module. ARIMA is more flexible but requires more statistical knowledge to configure correctly. Exponential smoothing gives you less control over the model specification.
If your revenue data has fewer than 12 months of history, time series forecasting is unlikely to produce reliable results. With very short histories, consider a correlation analysis to understand relationships between variables, or simply use a simple trend analysis to visualize the direction without committing to a formal forecast.
If your data is not time-based at all. You have a cross-sectional snapshot of customers, products, or transactions without a meaningful time dimension, then forecasting does not apply. Look at clustering, segmentation, or regression tools instead.
The R Code Behind the Analysis
Every report names its method and includes the R code that produced it, so you can reproduce, audit and cite it. The method code is fixed, not rewritten for each run, so the same data gives the same analysis every time.
Your turn
Bring your own data and the question you actually need answered.
MCP AnalyticsData science by email Send us your data and your question, and we will reply. ds@mcpanalytics.ai