# Forecast

URL: /business/nouns/forecast · Id: `noun:forecast`

> A Forecast is a dated week-by-week projection of a Startup’s cash, revenue and Cost, computed from its records, that sets its spend state.

A Forecast is a dated week-by-week projection of a [Startup](/business/nouns/startup)’s cash, revenue and [Cost](/business/nouns/cost), computed from its records, that sets its spend state.

## Properties
| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `asOf` | `datetime` | Yes | When the inputs were read. |
| `runwayWeeks` | `number` | Yes | Weeks until cash reaches zero at the projected rates. |
| `defaultAlive` | `boolean` | Yes | True when projected revenue covers projected Cost before cash runs out. |
| `profitWeek` | `date` | No | The first week projected revenue covers fully loaded Cost. |
| `spendState` | `string` | Yes | The spend state it sets: `free` when default alive, `tight` when default dead, `hold` under 13 weeks of runway. |

## Object
```json
{
  "$id": "https://api.sb/patentpad.com/forecasts/forecast_1",
  "$type": "Forecast",
  "asOf": "2026-10-22T12:00:00Z",
  "runwayWeeks": 1,
  "defaultAlive": true,
  "profitWeek": "2026-10-22",
  "spendState": "free"
}
```

## Relationships
- <a id="rel-startup"></a>A Forecast **has** one [Startup](/business/nouns/startup): the default-alive check writes a Forecast every week and after every large money [Decision](/business/nouns/decision); the latest sets the spend state. `startup`, inverse [`forecasts`](/business/nouns/startup#rel-forecasts).

## Verbs
| Verb | Description | Subject | Event | Class |
| --- | --- | --- | --- | --- |
| <a id="create"></a>[Forecast.create](/business/nouns/forecast/create) | Creates a Forecast. Inherited from [Noun](/business/nouns/noun). | None. | `Forecast.created` | Two-way: `try`, `send`, `do` |
| <a id="get"></a>[Forecast.get](/business/nouns/forecast/get) | Returns one Forecast by id. Inherited from [Noun](/business/nouns/noun). | None. | None. | Read: `try`, `do` |
| <a id="list"></a>[Forecast.list](/business/nouns/forecast/list) | Returns Forecasts, newest first, one page at a time. Inherited from [Noun](/business/nouns/noun). | None. | None. | Read: `try`, `do` |

A Forecast is kept forever and never edited: it has no `update` or `delete`.

## Permissions
Which Access level may call each Verb. One-way Verbs wait their delay window.

| Operation | `owner` | `admin` | `member` | `viewer` |
| --- | --- | --- | --- | --- |
| `Forecast.create` | Yes | Yes | Yes | No |
| `Forecast.get` | Yes | Yes | Yes | Yes |
| `Forecast.list` | Yes | Yes | Yes | Yes |

## Call it

**Ask**

```text
Add a forecast to ShiftNote.
```

**API**

```bash
curl -X POST https://api.sb/shiftnote.app/forecasts \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"asOf":"2026-10-22T12:00:00Z","runwayWeeks":1,"defaultAlive":true,"spendState":"free"}'
```

```json
{
  "api": "https://api.sb/shiftnote.app",
  "forecast": {
    "$id": "https://api.sb/shiftnote.app/forecasts/forecast_1",
    "$type": "Forecast",
    "asOf": "2026-10-22T12:00:00Z",
    "runwayWeeks": 1,
    "defaultAlive": true,
    "spendState": "free"
  },
  "action": {
    "$id": "https://api.sb/shiftnote.app/actions/action_1",
    "operation": "Forecast.create",
    "status": "done"
  },
  "links": {
    "self": "https://api.sb/shiftnote.app/actions/action_1"
  }
}
```

**SDK**

```ts
import { $ } from 'startup-builder'

const forecast = await $.Forecast.create({ asOf: '2026-10-22T12:00:00Z', runwayWeeks: 1, defaultAlive: true, spendState: 'free' })
```

**CLI**

```bash
npx startup-builder do Forecast.create --json '{"asOf":"2026-10-22T12:00:00Z","runwayWeeks":1,"defaultAlive":true,"spendState":"free"}'
```

**MCP**

```json
{
  "name": "do",
  "arguments": {
    "code": "return await $.Forecast.create({ asOf: '2026-10-22T12:00:00Z', runwayWeeks: 1, defaultAlive: true, spendState: 'free' })"
  }
}
```

## Example
A [Startup](/business/nouns/startup) with $180,000 in cash and $9,000 of weekly net burn gets a Forecast of 20 runway weeks. Revenue does not cover [Cost](/business/nouns/cost) in that window, so `defaultAlive` is false and the spend state is `tight`.