---
id: saas/forecast-meta-realizado
industry: SaaS and technology
usage: specific
effort: medium
grain: Deal x week (forecast snapshot) and scope x period (target vs. actuals)
---

# Forecast and target vs. actuals for new MRR

How much new MRR came in, how much should come in by the end of the period and how much is left to target, by channel, team and rep, with the same number for everyone.

## Executive summary

**For:** SaaS companies that close a monthly or quarterly new MRR target and still build the weekly forecast by hand.

**What it solves**

- Target and actuals read in the same scope, without doubling the target.
- New revenue split into new logo, upsell and one-off.
- This week's forecast explained against last week: in, won, slipped, out.

**Why it matters:** The target lives in a spreadsheet, actuals in the CRM and MRR in billing, and every manager arrives at a different gap. In SaaS the number that matters is new MRR, not total contract value, and an upsell counted as a new sale covers a gap that belonged to acquisition. With a single rule, the forecast meeting discusses deals, not the spreadsheet.

**Business questions it answers**

- How are we tracking against this month's new MRR target, by channel and by rep?
- How much of actuals is new logo and how much is upsell?
- What came into and what left the commit this week, and why?
- What daily pace do we need to hit this month's target?
- How much of the MRR won this quarter is already being billed?
- What is the projected month-end MRR, adding sales, expansion and churn?

**What you need**

- CRM connected to Nekt with recurring value, expected close date and forecast category on each deal
- Targets in a spreadsheet or table, with period, scope, revenue type and value
- The owner x channel or team table, maintained by the manager

**What you get**

- A target vs. actuals table by scope and period, with gap and attainment
- The weekly forecast snapshot with each deal's movement
- Daily target and required pace for the team TV
- An AI agent that answers about target and forecast with the same rule

## Detailed

### The problem

The total target and the cuts by channel and product sit on the same spreadsheet rows, and whoever sums without a filter triples the target. Actuals mix new logo, upsell and implementation, and the deal value is sometimes the whole contract, not the MRR. The weekly forecast is redone by hand because the CRM only keeps the current state, and a deal pushed to the next quarter simply vanishes from the count.

### Business rules

1. **One target, one scope.** Load the target into a long table: period, scope (total, channel, team, rep, product), scope key, revenue type and value. Total and cuts live in the same table: always sum filtering one scope. Attainment is computed in the pipeline, never by the agent at question time. On load, treat the spreadsheet as a source that changes format: month columns often change every year. (Avoid: Summing every row of the targets spreadsheet.)
2. **Actuals in MRR, split by type.** Use the monthly recurring value of the won deal, not the total contract value: on an annual deal, the total is 12 times the MRR. Classify each win as new logo, upsell or one-off (implementation, one-time service). One-off stays out of the MRR target. If there is a target per type, attainment is per type too, and overall attainment is a declared weighted average (for example, 80% new logo and 20% upsell). (Avoid: Summing the deal amount, with the full annual contract and implementation inside.)
3. **Upsell doesn't cover an acquisition gap.** A deal in the new-business funnel whose company is already a customer, by the company flag in the CRM or by self-declaration on the deal itself, is expansion, not new logo. Generate the list of these cases every week so the manager can fix them before close. (Avoid: Counting a sale to a current customer as new logo.)
4. **Won by won date, open by expected close date.** A won deal's period is the won date's period; an open deal's is the expected close date's. An open deal with no date, or with an overdue date, doesn't go into the current period: it goes to an overdue line for review. CS, renewal, partner and legacy pipelines stay out of the new-business forecast. (Avoid: Every open deal in the month's forecast, including overdue dates.)
5. **Commit, upside and weighted side by side.** If the team flags deals as commit and upside, show commit, upside and weighted in their own columns, never summed. Filter status open or won before summing: a lost deal that still carries the commit flag, because nobody cleared the field when it was lost, comes out of the count. (Avoid: Summing the raw commit flag, with lost deals inside.)
6. **A weekly snapshot explains the change.** Save the forecast every week, because custom CRM fields (such as the forecast category in Pipedrive) have no change history. Compare two snapshots and classify each deal: in, won, slipped, out or MRR changed. Apply the period filter to both snapshots: filtering only the current one makes a deal that moved quarters vanish instead of showing up as slipped. (Avoid: Comparing this week's total with last week's.)
7. **Owner becomes channel through a table, with validity.** Map each owner to a channel or team through a table maintained by the manager, with start and end dates, and normalize names before joining. A joint deal between two channels counts for each on its own row and once in the total. CRM loads are usually daily: an owner change made in the afternoon only shows up the next day. (Avoid: Inferring the channel from the pipeline name or today's owner.)
8. **Daily target by weight, not linear.** To track mid-month, spread the monthly target across days with weights per week and the business-day calendar, preserving the month's total and with no day negative or zeroed by compensation. If the team agrees on an intermediate checkpoint (a fraction of the target by a date in the month), it goes in as a written rule. Compare with actuals through yesterday, in the São Paulo time zone. (Avoid: Monthly target divided by calendar days.)
9. **Won is not billed.** For finance, new MRR starts when the first invoice is paid. Show actuals by won date (sales view) and by first charge (finance view), with the difference between the two. In self-serve products, the charge can come before the deal is marked won; in sales with implementation, weeks later. (Avoid: Using the CRM win as the month's revenue for finance.)
10. **One currency and a declared rate.** Deals in another currency go to the reporting currency at a declared rate (a fixed budget rate, for example) kept stable across weeks. Prefer the account-currency value field the CRM already computes (amount_in_home_currency in HubSpot) when the CRM rate is the one agreed with finance. (Avoid: Summing BRL and USD in the same total.)

### Weekly forecast movement

Comparing this week's snapshot with last week's, with the same period filter on both.

- **wasn't open in the period, now is** → In
- **was open, now won** → Won
- **was open, expected close date left the period** → Slipped
- **was open, now lost or without the commit flag** → Out
- **still open in the period, MRR changed** → Value changed (`current MRR - previous MRR`)
- **still open in the period, same MRR** → No change

### Definitions

| Metric | Definition |
|---|---|
| Target | spreadsheet value for one period, one scope and one revenue type; never summed across scopes |
| New MRR actuals | sum of MRR of new-logo deals won in the period, by won date, in the reporting currency |
| Upsell actuals | sum of the MRR increase of expansion deals won in the period |
| Gap | target - actuals, in the same scope, type and period; zero when actuals exceed the target |
| Attainment | actuals / target in the same scope; with targets per type, a declared weighted average |
| Commit | sum of MRR of open deals with an expected close date in the period and flagged as commit |
| Weighted forecast | sum of MRR of open deals in the period times the stage's historical win rate |
| Pro-rated target | sum of the daily target from the first day of the period through yesterday |
| Required pace | gap / business days left in the period |

### Pitfalls

- **Tripled target.** The total target, the channel target and the product target sat on the same rows, and a dashboard summed them all. The team looked a third of the way there when it had already hit the target. How to avoid: Always sum filtering one scope.
- **Lost but still in commit.** Lost deals kept the commit flag because the field wasn't cleared on loss, and the commit total was inflated. How to avoid: Filter status open or won before summing the forecast category.
- **The deal that changed quarters vanished.** The weekly comparison applied the quarter filter only to the current snapshot, and deals pushed to the next quarter disappeared without showing up as slipped. How to avoid: Apply the same period filter to both snapshots.
- **Existing customer sold as new logo.** Deals from companies that were already customers came in through the new-business funnel and were counted as new logo, covering a gap that belonged to acquisition. How to avoid: Weekly list of new-business deals at companies that are already customers.
- **Owner change invisible until tomorrow.** A deal reassigned in the afternoon stayed under the old owner until the next day's load, and the forecast follow-up went to the wrong person. How to avoid: Show the last load time and check the owner live before acting.
- **Legacy pipeline in open pipeline.** Deals from an old pipeline nobody worked anymore added to the quarter's open pipeline and gave coverage that didn't exist. How to avoid: List the pipelines that go into the forecast and exclude legacy.

Validated on real data: In Nekt's own data, about 1 in 6 deals won in HubSpot has its first Stripe charge in a different month from the won month, and in about 15% the charge came before the deal was marked won. Target vs. actuals by won date and by first charge give different numbers for the same month, which is why the two views sit side by side.

### Acceptance test

- [ ] For each period, the sum of channel-scope targets equals the total target, or the difference shows on an unallocated line.
- [ ] The month's new MRR actuals equal the sum of MRR of new-logo deals won in the CRM by won date (zero difference).
- [ ] No lost deal is in commit, and no deal shows up in two movement categories in the same week.
- [ ] In + won + slipped + out + changed + no change cover every deal in both snapshots.
- [ ] The month's daily targets sum to the monthly target, and no day has a negative target.

### Context document

```text
Forecast and target vs. actuals
- Forecast revenue is MRR (monthly recurring value), not total contract value. One-off (implementation, services) stays out of the MRR target.
- Revenue types: new logo, upsell, one-off. Upsell never counts toward the new-logo target.
- The targets table has a scope (total, channel, team, rep, product). Always sum filtering one scope. Never sum different scopes.
- Attainment and gap come computed from the table. Don't recompute them.
- Won deal: period of the won date. Open deal: period of the expected close date. Overdue or empty date = overdue, out of the period.
- Only acquisition pipelines go into the new-business forecast. Out: CS, renewal, partners, legacy.
- Commit, upside and weighted are separate columns. Never sum them. Commit only from open or won deals.
- Weekly movement: in, won, slipped, out, value changed, no change.
- Sales view = won date. Finance view = first paid charge. Say which one you are using.
- Reporting currency: <currency>, rate: <declared rate>.
- CRM data is from the last daily load. Give the load time when the question is about the current owner.
Per-client exceptions:
- <client>: overall attainment = <weight>% new logo + <weight>% upsell.
- <client>: a joint deal with a partner also credits channel <channel>.
```

### Variations

- **Projected month-end MRR:** Add to opening MRR the forecast new sales, the forecast expansion from the CS pipeline and the forecast churn from the retention pipeline, each in its own column.
- **Quarter in dollars:** Quarter target and actuals in USD at a fixed declared rate, for companies reporting to investors outside Brazil.
- **Risk per deal:** A 0 to 100 index per open deal, with qualification, recent activity and reschedules, for the manager to review the commit.
