Open deals and stage history from the CRM
Amount x the stage's historical conversion in the expected month, plus the run-rate of deals created and won in the month
Expected revenue by month, pipeline and rep
Weekly forecast, board and AI agent
What it solves
- The nominal pipeline shrinks to the revenue history says will close, plus what usually starts and closes within the month.
- Each deal is weighted by the stage's measured conversion, the same for every rep.
- You can explain why the forecast changed from one week to the next.
Business questions it answers
Ask your agent these questions once the case is live.
What you need
- CRM connected with amount, expected close date and stage history
- Up to 12 closed months of won and lost deals to measure conversion by stage (at least two quarters)
- The amount rule (recurring or total) and currency rule agreed with finance
What you get
- A table of open deals with measured probability and weighted amount
- Forecast by month, pipeline and rep, with the nominal pipeline and the short cycle run-rate on their own lines
- A weekly forecast snapshot with what came in, was won, slipped and went out
- An AI agent that answers forecast questions with the rule applied
Where to activate
Expected revenue by month with nominal pipeline, declared commit and overdue deals side by side.
Answers how much we will close and why the number changed since last week.
Notice to the owner when a relevant deal passes its expected date without being updated.
It depends on the pipeline view to measure conversion by stage. Without history, start with the CRM's probabilities declared as provisional and switch once two quarters are measured. The detailed view has the business rules, the pitfalls and the acceptance test. Or send everything straight to your agent with the Nekt MCP.
The CRM has a probability per stage set years ago and an expected close date reps forget to update. Multiplying one by the other adds deals from pipelines that are not sales, counts dates that already passed in the month and uses probabilities that do not even follow the funnel order. The forecast changes from person to person and nobody can explain the week's variation. And even a well weighted forecast misses when much of the revenue comes from deals created and won within the same month, which never show up in the open pipeline.
How it is usually done, and the rule
Each row is a mistake that already happened in practice.
For each stage, the probability is won / (won + lost) among deals that passed through the stage and closed in the 12 closed months before the snapshot. One window, always the same; with less than 12 months of history, use what there is and declare it. Passed through the stage: in HubSpot, hs_v2_date_entered_<stageId> filled on the deal, which counts even if the deal later moved to another pipeline (the field keeps only the latest entry, so it tells you whether it passed, not how many times). If the team does not mark deals lost and leaves them open indefinitely, the win rate among closed deals is inflated: for measurement, treat as lost any open deal with no activity or stage change for more than a declared N days. The CRM's default probability (the stage's metadata.probability or hs_deal_stage_probability on the deal) is only a declared provisional scale until there is history.
Active customer, partner, onboarding and post-sale pipelines also have stages with high probability, sometimes 80% to 100%. Added to the forecast, they become new revenue that does not exist. Write down the list of acquisition pipelines by pipeline ID, not by name, which changes. If a won deal is moved to another pipeline (for example, a closed sale lands in an activation or self-service pipeline), that destination pipeline goes on the list for wins and for conversion, or the final stage looks like it never wins.
A won deal enters at full amount in the month it was won and leaves the weighted part; a lost deal leaves at zero. Never apply the stage probability, a score or a temperature to a deal that is already closed.
The forecast month is the month of the expected close date. A deal with no expected date or with a date already past does not enter the current month: it goes to a separate overdue line the manager must review. Paused and frozen deals stay out: declare which field marks the pause (a temperature such as frozen, a status or a pause stage). Deals the rep removed from the forecast through the CRM's forecast category (in HubSpot, hs_manual_forecast_category = OMIT) also stay out and count as went out in the weekly snapshot.
If the team uses a qualification on the card (temperature, stars), it can adjust the probability by a fixed, written scale, and the scale states whether it replaces or multiplies the measured probability. Replace: probability = the scale value for the qualification x (1 - the stage's share of losses), where the stage's share of losses = deals lost in the month that were in that stage / all deals lost in the month. In a real case: top 80%, good 60% and average 40%. Multiply: probability = measured probability x factor, with factor 1 for the top qualification and below 1 for the others, or the same conversion is counted twice. A card with no qualification takes the lowest scale, never 100%.
Revenue is a deal metric. Never turn product lines into extra deals to add up. In recurring sales, declare whether the forecast is monthly value (MRR) or total contract value and use the right field; setup and one off services go on their own line.
Convert deals in other currencies to the reporting currency with a declared rate (fixed budget rate or monthly average) and keep the criterion week after week.
Save the forecast every week. If the CRM has a versioned deal history (an SCD Type 2 table with each version's valid from and valid to), the snapshot for any date since that history began can be rebuilt, without depending on weekly saves. Freeze each stage's probability in the snapshot: recalculating conversion every week makes untouched deals show up as amount changed. Comparing two snapshots, each deal falls into one category: came in, won, slipped (the expected date left the period), went out (lost, paused or recategorized) or amount changed. Apply the same period filter to both snapshots, or deals that change period become invisible.
If the team declares commit categories (will close, possible), show the commit next to the weighted forecast, never added together. The weighted number is history's reading; the commit is the rep's reading. The distance between them is information.
Deals created and won within the same month are never in the open pipeline of the snapshot at the start of the month, and in short cycle or self-service sales they can be most of the revenue. Add a run-rate line to expected revenue: the average, over the last 3 closed months, of revenue from deals created and won in the same month. Show that line apart from the weighted amount, so you know how much of the number comes from the pipeline and how much from pace, and measure accuracy with both.
How each deal moves between two forecast snapshots
Comparing last week's snapshot with this week's, with the same period filter on both.
Definitions
Pitfalls that already happened
A team stopped using the CRM's probability field and scorecard after seeing they did not track what closed. The probability in the data became only 100, 0 or blank, and the rep's reading moved to a separate column.
Separate fact (won, lost, open) from opinion (temperature) and measure conversion from history.
Cards with no linked temperature entered at full probability and inflated the forecast, until the rule changed to the lowest temperature.
With no qualification, take the lowest scale.
Paused deals, waiting for the client's budget, entered the current month and never closed.
Paused and frozen deals stay out, with a resume date.
The weekly comparison filtered the period only on the current snapshot, and deals pushed to the next quarter disappeared without showing up as slipped.
Same period filter on both snapshots.
In B2B sales, a win in the CRM took about two weeks to be paid by the client's purchasing department, and the forecast used by finance brought the inflow forward.
Revenue forecast by win date; cash with the declared payment term.
In a short cycle business, most of the month's wins came from deals that did not even exist in the day 1 snapshot. The weighted forecast landed at a fraction of real revenue, and accuracy looked like a probability problem when it was a scope problem.
A run-rate line for deals created and won in the month, apart from the weighted amount.
Acceptance test
The case is done when every item passes.
- For a closed month, the expected revenue in the first business day snapshot (won, weighted and run-rate on their own lines) and the revenue won in the month are in the same table, with accuracy calculated.
- No deal from a pipeline outside the acquisition list, paused, in the OMIT category, won or lost appears with a weighted amount.
- The measured probability rises from the first to the last funnel stage, or the exception is explained; no stage sits above 90% just because lost deals are not marked.
- Between two weekly snapshots, previous total + came in - won - slipped - went out + amount changed = current total.
- Deals with a past expected date appear in the overdue line and not in expected revenue.
Agent package
Paste into Claude, ChatGPT or any client with the Nekt MCP connected.
Probability-weighted revenue forecast - Source: forecast table (open deal x day), with amount, measured stage probability, weighted amount and expected month. Weekly snapshots in the forecast history table, with probability frozen in each snapshot. - Stage probability = win rate, over the 12 closed months before the snapshot, of deals that passed through the stage, with open deals stale for more than <N> days counted as lost. It is not the CRM's default probability. - Acquisition pipelines only, from the list below, including the pipeline wins are moved to. Paused, OMIT, won and lost deals are not weighted. - Expected revenue for the month = revenue already won in the month + weighted amount of open deals with an expected date in the month + run-rate of deals created and won in the month (average of the last 3 closed months), each part on its own line. - A past or blank expected date goes to Overdue, outside expected revenue. - Amount = <MRR | total contract value>. Reporting currency <currency>, rate <declared rate>. - The commit declared by the rep sits next to the weighted number. Never add them. - To explain the week's change, use the categories came in, won, slipped, went out and amount changed. Client exceptions: - <client>: acquisition pipelines = <list of IDs, including where wins land>. - <client>: pause marked by <field and value>; categories out of the forecast = <e.g. OMIT>. - <client>: a stale open deal counts as lost for measurement after <N> days. - <client>: qualification scale = <values>, <replaces | multiplies> the measured probability; a card with no qualification uses <lowest value>.
Build the "Probability-weighted revenue forecast" case in my Nekt workspace following the rules at https://academy.nekt.com/en/casos/previsao-de-receita.md. 1) Find the source tables and confirm the columns the rules use. 2) Create a transformation at the stated grain applying every rule. 3) Run the acceptance test and show me the result of each item. 4) Create the case's context document in the workspace, leaving my clients' exceptions open for me to fill in.
Variations
Without enough history, show a range with three conversion scenarios and say which inputs still need measuring.
The same logic over renewal and upsell pipelines, to forecast revenue from the base.
Deals with more than one product split the amount across the deal's products, without becoming extra deals.