# Minimum Success Criteria

URL: /business/minimum-success-criteria · Id: `page:business/minimum-success-criteria`

> The one number a Startup must reach by a date, checked for reachability before anything is built and read every week after.

The [Minimum Success Criteria](/business/nouns/minimum-success-criteria) is the one number a [Startup](/business/nouns/startup) must reach by a date to stay worth running. The [Founder](/agents/founding/founder) sets it once, beside the [Founding Hypothesis](/business/founding-hypothesis).

## One number and a date
The number is outside revenue, a [Metric](/business/nouns/metric) only outside [Customers](/business/nouns/customer) move. It is a [Goal](/business/nouns/goal) with one target and one deadline. The [Studio](/business/nouns/studio) supplies the default as a [Setting](/business/nouns/setting), and the Founder may raise it.

Revenue from sibling Startups and from the Founder never counts. A number the Startup can pay itself proves nothing.

## Three numbers, three clocks
A Startup reads three numbers at once, each on its own clock. Only one is the Minimum Success Criteria.

| Number | Belongs to | Clock | Decides |
| --- | --- | --- | --- |
| Minimum Success Criteria | the Startup | set once, with its date | whether the Startup stays worth running |
| State Metric | the [Lifecycle](/business/nouns/lifecycle) state | changes at each state | what moves the Startup to the next state |
| Week's Metric | the week's [Experiment](/business/nouns/experiment) | one test, a week at most | what the week's test reads |

## The reachability check
Before anything is built, the number is worked backward through the [Price](/business/nouns/price) and the conversion rates. If the volumes it needs are out of reach, the model fails on paper, at no cost.

```text
Minimum Success Criteria   $4,000 outside revenue a month, by month 9
Price                      $79 a month
Customers needed           51
Leads needed               255     at 20% Lead to Customer
Visitors needed            5,100   at 5% Visitor to Lead
```

The rates open as cited benchmarks. Once enough sibling Startups share the [Product Template](/business/nouns/product-template) and [Motion](/business/nouns/motion), the [Portfolio](/business/nouns/portfolio) median replaces them.

## Dated Key Results
The check compiles into dated [Key Results](/business/nouns/key-result): the path from the first deposit to the number. Each one is a line a week can be read against.

| By | Key Result |
| --- | --- |
| Week 2 | 8 refundable deposits from outside buyers |
| Month 3 | 15 outside paying Customers |
| Month 6 | 30 outside paying Customers |
| Month 9 | $4,000 outside revenue a month |

## What the number decides
The number gives impact a unit. The [weekly test](/business/weekly-test) ranks each slot by how far a wrong answer would move the Startup from it.

At the end of each week, [office hours](/workflows/processes/office-hours) reads the dated Key Results. A missed Key Result raises a [Decision](/business/nouns/decision) to persevere or pivot, and the date itself is the last one.

## Write it
The number lives in `startup.ts` beside the sentence, as one Metric, a value and a date.

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

export default Startup({
  name: 'Platecost',
  domain: 'platecost.app',
  extends: 'solo-saas',
  hypothesis: { /* the five slots */ },
  msc: { metric: 'outside-revenue', value: 4000, by: '2027-07-22' },
})
```

On a running Startup, every [Interface](/business/nouns/interface) writes it with `MinimumSuccessCriteria.create`. Rehearse first: the rehearsal runs the reachability check and writes nothing.

**API**

```bash
curl -X POST "https://api.sb/platecost.app/minimum-success-criteria?mode=try" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"objective":"Outside customers pay enough to keep Platecost running","metric":"outside-revenue","value":4000,"by":"2027-07-22"}'
```

**SDK**

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

const check = await $.MinimumSuccessCriteria.create(
  { objective: 'Outside customers pay enough to keep Platecost running', metric: 'outside-revenue', value: 4000, by: '2027-07-22' },
  { mode: 'try' },
)
```

**CLI**

```bash
npx startup-builder do MinimumSuccessCriteria.create --json '{"objective":"Outside customers pay enough to keep Platecost running","metric":"outside-revenue","value":4000,"by":"2027-07-22"}' --try
```

**MCP**

```json
{
  "name": "do",
  "arguments": {
    "code": "return await $.MinimumSuccessCriteria.create({ objective: 'Outside customers pay enough to keep Platecost running', metric: 'outside-revenue', value: 4000, by: '2027-07-22' })",
    "mode": "try"
  }
}
```


```text
try  MinimumSuccessCriteria.create   nothing written

Target        $4,000 outside revenue a month, by 2027-07-22
Price         $79 a month                                 from: Hypothesis#switch@v1
Needs         51 Customers, 255 Leads, 5,100 Visitors
Rates         20% Lead to Customer, 5% Visitor to Lead    cited benchmarks
Verdict       reachable
Key Results   4, the first: 8 outside deposits by 2026-11-05
```

An unreachable number prints the volume that breaks it, such as `unreachable: needs 51,000 Visitors`. The run without `--try` writes the Goal and its dated Key Results.

To read the path against the week, ask for the record:

```bash
npx startup-builder show /minimum-success-criteria
```

```text
platecost.app   $4,000 outside revenue a month, by 2027-07-22   read 2027-01-18

by           key result                        now      status
2026-11-05   8 refundable outside deposits     9        met
2027-01-22   15 outside paying Customers       13       on track
2027-04-22   30 outside paying Customers       13       open
2027-07-22   $4,000 outside revenue a month    $1,027   open
```

## Next
The [weekly test](/business/weekly-test) turns the weakest slot into the week's one test.