STUD
← Plays

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.