# Startup methods: advance, build, graduate

URL: /code/sdk/startup/lifecycle · Id: `page:code/sdk/startup/lifecycle`

> The Startup Verbs advance, build, graduate as typed SDK methods, with inputs, result, refusals and an example.

Reference for [Startup](/business/nouns/startup), one group of [Startup methods](/code/sdk/startup).

### Startup.advance
Advance moves a Startup to its next Lifecycle state once every entry check of that state passes. [Verb page](/business/nouns/startup/advance?interface=sdk).

```ts
interface StartupVerbs {
  advance(input: StartupAdvanceInput, options?: SB.CallOptions): SB.Call<Startup>
}
```

Emits [`Startup.advanced`](/business/events/Startup.advanced).

**Inputs**

| Input | Type | Required | Description |
| --- | --- | --- | --- |
| `startup` | [Startup](/business/nouns/startup) | Yes | The Startup to advance. |
| `to` | `string` | No | The target state. Defaults to the next state. |

**Returns**

| Output | Type | Required | Description |
| --- | --- | --- | --- |
| `startup` | [Startup](/business/nouns/startup) | Yes | The Startup in its new state. |

**Refuses when**

| Check | Error | Fix | Then call |
| --- | --- | --- | --- |
| Any entry check of the target [Lifecycle](/business/nouns/lifecycle) state | [`refused`](/code/api/errors/refused) | Pass each check the error names, then call it again. | None. |
| The key is valid, but its scopes do not allow this operation. | [`forbidden`](/code/api/errors/forbidden) | Use a key whose scopes cover the operation, or ask an owner of the namespace to grant them. | None. |

**Example**

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

const startup = await $.Startup.advance({ startup: 'startup_l3hr1EnUGY' })
```

### Startup.build
Build provisions the Systems, Sites and Interfaces a Startup’s definition declares, and moves the Startup to Building. [Verb page](/business/nouns/startup/build?interface=sdk).

```ts
interface StartupVerbs {
  build(input: StartupBuildInput, options?: SB.CallOptions): SB.Call<Startup>
}
```

Emits [`Startup.built`](/business/events/Startup.built).

**Inputs**

| Input | Type | Required | Description |
| --- | --- | --- | --- |
| `startup` | [Startup](/business/nouns/startup) | Yes | The Startup to build. |

**Returns**

| Output | Type | Required | Description |
| --- | --- | --- | --- |
| `startup` | [Startup](/business/nouns/startup) | Yes | The Startup, now Building. |

**Refuses when**

| Check | Error | Fix | Then call |
| --- | --- | --- | --- |
| Template chosen (`building-template`) | [`refused`](/code/api/errors/refused) | Name a Startup Template in the definition. | [Startup.update](/business/nouns/startup/update) |
| Problem stated (`building-problem`) | [`refused`](/code/api/errors/refused) | Write the problem slot with its workarounds and why now. | [Hypothesis.create](/business/nouns/hypothesis/create) |
| Brand named (`building-brand`) | [`refused`](/code/api/errors/refused) | Give the Brand a name, a voice, a logo, and a theme. | [Brand.update](/business/nouns/brand/update) |
| Products declared (`building-products`) | [`refused`](/code/api/errors/refused) | Set the kind of every Product. | [Product.update](/business/nouns/product/update) |
| Three slots at Commitment (`building-slots`) | [`refused`](/code/api/errors/refused) | Run the cheapest test on each slot below Commitment, such as a reserve deposit. | [Experiment.start](/business/nouns/experiment/start) |
| The key is valid, but its scopes do not allow this operation. | [`forbidden`](/code/api/errors/forbidden) | Use a key whose scopes cover the operation, or ask an owner of the namespace to grant them. | None. |

**Example**

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

const startup = await $.Startup.build({ startup: 'startup_l3hr1EnUGY' })
```

### Startup.graduate
Graduate moves a Startup to a Company of its own, with its Customers, Domains and records intact. [Verb page](/business/nouns/startup/graduate?interface=sdk).

```ts
interface StartupVerbs {
  graduate(input: StartupGraduateInput, options?: SB.CallOptions): SB.Call<Startup>
}
```

Emits [`Startup.graduated`](/business/events/Startup.graduated).

**Inputs**

| Input | Type | Required | Description |
| --- | --- | --- | --- |
| `startup` | [Startup](/business/nouns/startup) | Yes | The Startup to graduate. |
| `company` | [Company](/business/nouns/company) | Yes | The Company that holds it next. |

**Returns**

| Output | Type | Required | Description |
| --- | --- | --- | --- |
| `startup` | [Startup](/business/nouns/startup) | Yes | The Startup, held by its new Company. |

**Refuses when**

| Check | Error | Fix | Then call |
| --- | --- | --- | --- |
| Company of its own (`graduate-company`) | [`refused`](/code/api/errors/refused) | A company of its own holds the Startup, with its Brand, Customers, and records moved intact. | None. |
| The key is valid, but its scopes do not allow this operation. | [`forbidden`](/code/api/errors/forbidden) | Use a key whose scopes cover the operation, or ask an owner of the namespace to grant them. | None. |

**Example**

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

const startup = await $.Startup.graduate({ startup: 'startup_l3hr1EnUGY', company: 'company_28zYNZEno0' })
```