Forecast · Assess & Decide · Analysis & Finance
Weighted sales forecast from the pipeline
A weighted, discount-adjusted forecast: each deal weighted by its stage probability and rolled up by month.
You receive: A reviewed forecast calculator + the passing test report, run on your pipeline.
Part of Choose Business Model, Build a Sales Engine
Example
A sample of what this play produces. Your result is generated for your inputs.
"""Weighted sales forecast, run on STUD's own early pipeline (illustrative).
STUD is pre-revenue (soft launch), so the pipeline below is the illustrative
launch scenario, not booked deals: design-partner conversations priced at the
annual prepay credit packs ($240 for 6,000 credits, $720 for 18,000 credits).
Each opportunity is
weighted by its stage probability from the funnel-standard ladder, then the
optimism discount (0.5, halve it) is applied per the Problem Hunting rule
that founders overweight their own pipeline by more than half.
Worked example (funnel-standard ladder, discount 0.5):
Fictional Co A, $720, verbal commitment (0.75) -> weighted 540.00, discounted 270.00 (2026-09)
Fictional Co B, $240, great demo (0.5) -> weighted 120.00, discounted 60.00 (2026-09)
Fictional Co C, $240, demo scheduled (0.1) -> weighted 24.00, discounted 12.00 (2026-10)
discounted_total 342.00; by_month: 2026-09 = 330.00, 2026-10 = 12.00
stage_distribution: verbal commitment 1, great demo 1, demo scheduled 1
The counterparties are obviously fictional; the pack prices are STUD's
published annual prepay packs (purchased credits never expire). All dollar
figures are illustrative.
"""
def compute_weighted_forecast(inp):
ladder = inp.get("stage_ladder") or {}
if not isinstance(ladder, dict):
ladder = {}
factor = 1.0 - float(inp.get("optimism_discount", 0) or 0)
per = []
by_month = {}
dist = {}
for opp in (inp.get("opportunities") or []):
size = float(opp.get("deal_size", 0) or 0)
if opp.get("stage_probability") is not None:
# An explicit per-opportunity probability overrides the ladder.
prob = float(opp.get("stage_probability") or 0)
key = "unknown"
else:
stage = opp.get("stage")
if stage is not None and stage in ladder:
prob = float(ladder.get(stage) or 0)
key = str(stage)
else:
# A stage absent from the ladder weights zero: no invented odds.
prob = 0.0
key = "unknown"
weighted = round(size * prob, 2)
discounted = round(size * prob * factor, 2)
month = str(opp.get("close_month", ""))
per.append({
"name": str(opp.get("name", "")),
"weighted_value": weighted,
"discounted_value": discounted,
"close_month": month,
})
by_month[month] = round(by_month.get(month, 0.0) + discounted, 2)
dist[key] = dist.get(key, 0) + 1
total = round(sum(p["discounted_value"] for p in per), 2)
months = [{"month": m, "discounted_value": by_month[m]} for m in sorted(by_month)]
return {
"per_opportunity": per,
"discounted_total": total,
"by_month": months,
"stage_distribution": dist,
}
Opens later
This play is not open to run yet, so it has no price. Leave your email and STUD will tell you when it opens.