Retail, Demand and Supply Chain

Forecasting a product with no history

A brand-new product has no sales history to learn from, so the forecast has to borrow a shape from products that are already similar to it.

Read these first

On this page 5
  1. Why it exists
  2. How it works
  3. Where you have already seen it
  4. Remember this
  5. What to learn next

One lesson, three depths. Pick the one that fits you today — you can switch any time.

Beginner — No maths. Plain English.

A brand-new product has zero sales history. To forecast it, you borrow the shape of products that already resemble it.

Think about how a film producer estimates a new movie's opening-weekend collection before a single ticket is sold. There is no box office data for a film that has not released yet. So the producer looks at similar films — same genre, same lead actor, similar budget — and uses how those performed as a starting guess.

Retail does the same thing for a brand-new product. No sales exist yet, so the forecast has to come from somewhere else.

Why it exists

Every forecasting method covered so far in this section needs history — past sales to average, smooth, or fit a trend to. A new product breaks that assumption completely on day one.

Guessing badly here is expensive in both directions. Order too little, and a promising launch stumbles because shelves are empty in the first, most important week. Order too much, and a product that never finds its audience sits in a warehouse, unsold.

The standard fix is called analog forecasting. Find past products that resemble the new one — by category, price, and any other useful attribute. Use their launch pattern as a starting estimate, and update it fast once the new product's own first real sales come in.

How it works

NEW PRODUCT:  a budget-tier snack, launching next week, zero sales history

PAST PRODUCTS, all snacks:
  snack_A (budget tier)   -> week 1: 80,  week 2: 95,  week 3: 70 ...
  snack_B (budget tier)   -> week 1: 90,  week 2: 100, week 3: 75 ...
  snack_C (premium tier)  -> week 1: 40,  week 2: 55,  week 3: 42 ...

The two budget-tier snacks are the closest match ("analogs").
Average their launch curves -> the forecast for the new product.

The shape matters as much as the level. Most new products spike in week one or two — driven by curiosity and initial distribution — then settle to a lower, steadier rate. A forecast that ignores this shape and orders a flat amount every week regardless gets both the launch and the settle-down wrong.

Where you have already seen it

  • A new flavour of an existing snack brand, stocked based on how earlier flavour launches from the same brand performed.
  • A new smartphone model, whose first-week demand is estimated from the previous model's launch, adjusted for hype and price.
  • A newly opened store in a chain, whose early sales are forecast using a similar-sized, similar-location store that opened before it.

Remember this

  • A new product has no history of its own, so the first forecast has to borrow from similar products instead.
  • Getting the analogs right — genuinely similar products, not only convenient ones — matters more than the averaging method used afterward.
  • The forecast should update quickly once real sales start arriving, rather than sticking with the borrowed estimate for long.

What to learn next

Developer — Code and libraries.

Setup

bash
pip install numpy pandas

Minimal runnable code

Five past products, each with a category and price tier, and eight weeks of real launch sales. A new budget-tier snack is about to launch with none. We find the closest analogs and average their curves.

new_product_forecast.py
import numpy as np
import pandas as pd

rng = np.random.default_rng(21)

# Past products, each with attributes and 8 weeks of launch sales.
past_products = pd.DataFrame({
    "product": ["snack_A", "snack_B", "snack_C", "drink_A", "drink_B"],
    "category": ["snack", "snack", "snack", "drink", "drink"],
    "price_tier": [1, 1, 2, 1, 2],   # 1 = budget, 2 = premium
})

launch_curves = {
    "snack_A": [80, 95, 70, 60, 55, 50, 48, 45],
    "snack_B": [90, 100, 75, 65, 58, 52, 50, 47],
    "snack_C": [40, 55, 42, 38, 35, 33, 30, 28],
    "drink_A": [120, 140, 110, 90, 80, 75, 70, 68],
    "drink_B": [60, 70, 55, 48, 44, 40, 38, 35],
}
for name, curve in launch_curves.items():
    past_products.loc[past_products["product"] == name, [f"w{i+1}" for i in range(8)]] = curve

print(past_products)
print()

# A new snack, budget-tier, about to launch with zero sales history.
new_product = {"category": "snack", "price_tier": 1}

# Find analogs: same category, closest price tier.
analogs = past_products[past_products["category"] == new_product["category"]].copy()
analogs["distance"] = (analogs["price_tier"] - new_product["price_tier"]).abs()
analogs = analogs.sort_values("distance")
print("candidate analogs, closest first:")
print(analogs[["product", "category", "price_tier", "distance"]])
print()

week_cols = [f"w{i+1}" for i in range(8)]
k = 2
top_k = analogs.head(k)
forecast_curve = top_k[week_cols].mean()
print(f"using the {k} closest analogs: {top_k['product'].tolist()}")
print("forecast for the new product's first 8 weeks:")
print(forecast_curve.round(1).to_dict())
Output
   product category  price_tier     w1     w2  ...    w4    w5    w6    w7    w8
0  snack_A    snack           1   80.0   95.0  ...  60.0  55.0  50.0  48.0  45.0
1  snack_B    snack           1   90.0  100.0  ...  65.0  58.0  52.0  50.0  47.0
2  snack_C    snack           2   40.0   55.0  ...  38.0  35.0  33.0  30.0  28.0
3  drink_A    drink           1  120.0  140.0  ...  90.0  80.0  75.0  70.0  68.0
4  drink_B    drink           2   60.0   70.0  ...  48.0  44.0  40.0  38.0  35.0

[5 rows x 11 columns]

candidate analogs, closest first:
   product category  price_tier  distance
0  snack_A    snack           1         0
1  snack_B    snack           1         0
2  snack_C    snack           2         1

using the 2 closest analogs: ['snack_A', 'snack_B']
forecast for the new product's first 8 weeks:
{'w1': 85.0, 'w2': 97.5, 'w3': 72.5, 'w4': 62.5, 'w5': 56.5, 'w6': 51.0, 'w7': 49.0, 'w8': 46.0}

What actually happened

The filter analogs["category"] == new_product["category"] rules out drink_A and drink_B immediately — a drink's launch curve tells you very little about a snack's. Category is doing most of the work here; the price_tier distance only breaks the remaining tie.

Averaging snack_A and snack_B week by week produces a forecast that inherits their shared shape: a strong week-two peak followed by a steady decline. That shape is the valuable part of this forecast, arguably more valuable than the exact numbers.

Common mistakes

Picking analogs on convenience rather than genuine similarity. "We happen to have data on this other product" is not the same as "this product behaves like the new one." A cheap snack and a premium snack from the same category can have very different launch shapes.

Averaging the raw sales level without checking store count. If snack_A launched in 500 stores and the new product launches in 50, its forecast needs scaling down first, or every number here is wrong by a factor of ten.

Sticking with the analog forecast too long. The whole point of analog forecasting is to have a reasonable starting guess. Once even one or two weeks of real sales exist, blend them in and let the analog's influence fade — see Try it yourself below.

Using only one analog. A single past product can be an outlier for reasons that had nothing to do with being a snack — a competitor stockout, a viral social media post. Averaging a small group is more robust than trusting one.

Try it yourself

Add a "w1_actual": 70 entry once real week-one sales for the new product come in. Blend it with the analog forecast using a simple weighted average — 0.5 * actual + 0.5 * analog_forecast["w1"] — and watch how quickly the forecast can be pulled toward reality as real data starts to exist.

What to learn next

Researcher — Mathematics and papers.

The Bass diffusion model

Where analog forecasting borrows an empirical curve wholesale, the classical parametric alternative is the Bass diffusion model (Bass, 1969, A New Product Growth Model for Consumer Durables, Management Science), which describes adoption as driven by two forces: innovators acting independently, and imitators influenced by prior adopters.

f(t) / (1 - F(t)) = p + q * F(t)
  • F(t) — cumulative fraction of the eventual market that has adopted by time t
  • f(t) — the instantaneous adoption rate, dF/dt
  • p — the coefficient of innovation (adoption driven by external factors: advertising, media)
  • q — the coefficient of imitation (adoption driven by word of mouth among prior adopters)

Solved in closed form, this produces the S-shaped or single-peaked adoption curves seen across countless product categories. p and q cannot be estimated from a product's own history before launch, by definition — so the standard practice is exactly the analog method above, applied one level up the abstraction: fit p and q on comparable historical launches, and use those fitted values (or their category average) as the new product's starting parameters. This is sometimes called "guessing by analogy with the Bass model" in the diffusion-of-innovations literature (Mahajan, Muller and Bass, 1990, New Product Diffusion Models in Marketing: A Review and Directions for Research).

Attribute-based and hierarchical Bayesian approaches

Pure nearest-neighbour analog selection, as in the developer example, does not scale gracefully to many attributes or weight them by relevance. Two more principled extensions:

  • Regression on launch-curve summary statistics. Fit a model (often gradient-boosted trees) predicting week-one sales, or the ratio of week-two to week-one sales, from product attributes (price, category, brand strength, marketing spend, distribution breadth) across a large history of past launches. This generalises analog matching into a proper supervised-learning problem.
  • Hierarchical Bayesian shrinkage. Treat each new product's launch parameters as drawn from a category-level (or brand-level) distribution, estimated from all products in that category. A new product's forecast is then a shrinkage estimate — pulled toward the category average, with the pull strength shrinking automatically as the product's own early sales accumulate. This formalises "start from the analog average, update fast toward real data" with an explicit statistical rule for exactly how much to trust each source, rather than an ad hoc blend weight.

The evaluation problem specific to new products

Standard forecast accuracy metrics computed against long history do not apply here — there is no long history. New-product forecast quality is typically evaluated retrospectively: hold out a set of past launches entirely, run the analog or model-based forecast as if it were being made pre-launch, and score against what actually happened. This retrospective validation set is one of the more labour-intensive pieces of infrastructure in a real demand-planning system, precisely because a "new product" by definition never repeats.

Key references

  • Bass, F. (1969). A New Product Growth Model for Consumer Durables. Management Science 15(5).
  • Mahajan, V., Muller, E. & Bass, F. (1990). New Product Diffusion Models in Marketing: A Review and Directions for Research. Journal of Marketing 54(1).

What to learn next