# Registration

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

> A Registration is one person’s place at a Gathering: invited, requested, or waitlisted, then registered, then attended or no-show.

A Registration is one person’s place at a [Gathering](/business/nouns/gathering): invited, requested, or waitlisted, then registered, then attended or no-show.

## Properties
| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `status` | `string` | Yes | One of `invited`, `requested`, `waitlisted`, `registered`, `attended`, or `noShow`. |
| `registeredAt` | `datetime` | No | When the place was confirmed. |

## Object
```json
{
  "$id": "https://api.sb/patentpad.com/registrations/registration_1",
  "$type": "Registration",
  "status": "invited",
  "registeredAt": "2026-10-22T12:00:00Z"
}
```

## Relationships
- <a id="rel-gathering"></a>A Registration **has** one [Gathering](/business/nouns/gathering): a [Gathering](/business/nouns/gathering) admits Registrations up to its capacity, then waitlists the rest. `gathering`, inverse [`admits`](/business/nouns/gathering#rel-admits).
- <a id="rel-names"></a>A Registration **names** one [Contact](/business/nouns/contact): each Registration holds one [Contact](/business/nouns/contact)’s place; one Contact registers for many [Gatherings](/business/nouns/gathering). `names`, inverse [`registrations`](/business/nouns/contact#rel-registrations).

## Lifecycle

| State | Meaning | Moves to |
| --- | --- | --- |
| `invited` (first) | Offered a place, by the host’s invitation or the Gathering’s public Page, and not yet taken. | `registered` by [Gathering.register](/business/nouns/gathering/register); `waitlisted` by [Gathering.register](/business/nouns/gathering/register); `requested` by [Gathering.register](/business/nouns/gathering/register) |
| `requested` | Asked for a place at a Gathering whose host approves each one. | `registered` by [Registration.approve](/business/nouns/registration/approve); `waitlisted` by [Registration.approve](/business/nouns/registration/approve) |
| `waitlisted` | Next in line for a place, in the order they asked. | `registered` by [Registration.admit](/business/nouns/registration/admit) |
| `registered` | Holds a place; the reminders and the join link go to the Contact. | `attended` by [Registration.attend](/business/nouns/registration/attend); `noShow` on [`Registration.missed`](/business/nouns/registration#registrationmissed) |
| `attended` | Joined the Gathering. | None: it ends here. |
| `noShow` | Held a place and never joined before the Gathering ended. | None: it ends here. |

## Verbs
| Verb | Description | Subject | Event | Class |
| --- | --- | --- | --- | --- |
| [Registration.admit](/business/nouns/registration/admit) | Admit gives the next Contact in line a place at a Gathering when one frees up or its capacity rises. | [Marketing Lead](/agents/marketing/marketing-lead) | [`Registration.admitted`](/business/events/Registration.admitted) | Two-way: `try`, `send`, `do` |
| [Registration.approve](/business/nouns/registration/approve) | Approve gives a requested place at a Gathering to the Contact who asked, or a place in line when the Gathering is full. | [Marketing Lead](/agents/marketing/marketing-lead) | [`Registration.approved`](/business/events/Registration.approved) | Two-way: `try`, `send`, `do` |
| [Registration.attend](/business/nouns/registration/attend) | Attend records that a registered Contact joined the Gathering; an online room calls it on join. | [Marketing Lead](/agents/marketing/marketing-lead) | [`Registration.attended`](/business/events/Registration.attended) | Two-way: `try`, `send`, `do` |
| <a id="create"></a>[Registration.create](/business/nouns/registration/create) | Creates a Registration. Inherited from [Noun](/business/nouns/noun). | None. | `Registration.created` | Two-way: `try`, `send`, `do` |
| <a id="get"></a>[Registration.get](/business/nouns/registration/get) | Returns one Registration by id. Inherited from [Noun](/business/nouns/noun). | None. | None. | Read: `try`, `do` |
| <a id="list"></a>[Registration.list](/business/nouns/registration/list) | Returns Registrations, newest first, one page at a time. Inherited from [Noun](/business/nouns/noun). | None. | None. | Read: `try`, `do` |
| <a id="update"></a>[Registration.update](/business/nouns/registration/update) | Changes the given properties of a Registration. Inherited from [Noun](/business/nouns/noun). | None. | `Registration.updated` | Two-way: `try`, `send`, `do` |
| <a id="delete"></a>[Registration.delete](/business/nouns/registration/delete) | Deletes a Registration; its history is kept. Inherited from [Noun](/business/nouns/noun). | None. | `Registration.deleted` | One-way: `send`, `do` |

## Events
Events no Verb emits. Each Verb’s Event is in the Verbs table above; every Event is delivered in the same shape.

### Registration.missed
A Gathering ended, and a Contact who held a place never joined. Raised by a clock.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | `string` | Yes | `Registration.missed`. |
| `at` | `datetime` | Yes | When it happened. |
| `seq` | `integer` | No | Its position in the namespace, one more than the Event before; any seq is a cursor into the history. |
| `data` | `json` | Yes | The Thing as the Action left it. |
| `data.registration` | [Registration](/business/nouns/registration) | Yes | The Registration as the change left it. |
| `data.registration.status` | `string` | Yes | One of `invited`, `requested`, `waitlisted`, `registered`, `attended`, or `noShow`. |
| `data.registration.registeredAt` | `datetime` | No | When the place was confirmed. |
| `data.previous.status` | `string` | Yes | The `status` before this Event: `registered`. |

```json
{
  "$id": "https://api.sb/patentpad.com/events/event_1",
  "$type": "Event",
  "name": "Registration.missed",
  "at": "2026-10-22T12:00:00Z",
  "data": {
    "registration": {
      "$id": "https://api.sb/patentpad.com/registrations/registration_1",
      "$type": "Registration",
      "status": "noShow",
      "registeredAt": "2026-10-22T12:00:00Z"
    },
    "previous": {
      "status": "registered"
    }
  },
  "seq": 1
}
```

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

| Operation | `owner` | `admin` | `member` | `viewer` |
| --- | --- | --- | --- | --- |
| `Registration.create` | Yes | Yes | Yes | No |
| `Registration.get` | Yes | Yes | Yes | Yes |
| `Registration.list` | Yes | Yes | Yes | Yes |
| `Registration.update` | Yes | Yes | Yes | No |
| `Registration.delete` | Yes | Yes | Yes | No |
| `Registration.admit` | Yes | Yes | Yes | No |
| `Registration.approve` | Yes | Yes | Yes | No |
| `Registration.attend` | Yes | Yes | Yes | No |

## Call it

**Ask**

```text
Approve the latest registration.
```

**API**

```bash
curl -X POST https://api.sb/tutorloop.com/registrations/registration_1/approve \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
```

```json
{
  "api": "https://api.sb/tutorloop.com",
  "registration": {
    "$id": "https://api.sb/tutorloop.com/registrations/registration_1",
    "$type": "Registration",
    "status": "invited"
  },
  "action": {
    "$id": "https://api.sb/tutorloop.com/actions/action_1",
    "operation": "Registration.approve",
    "status": "done"
  },
  "links": {
    "self": "https://api.sb/tutorloop.com/actions/action_1"
  }
}
```

**SDK**

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

const registration = await $.Registration.approve({ registration: 'registration_1' })
```

**CLI**

```bash
npx startup-builder do Registration.approve --json '{"registration":"registration_1"}'
```

**MCP**

```json
{
  "name": "do",
  "arguments": {
    "code": "return await $.Registration.approve({ registration: 'registration_1' })"
  }
}
```

## Example
A product manager registers for a pricing workshop and gets a calendar invite. She joins 10 minutes late, and her Registration moves from `registered` to `attended`.