URL: /code/apps/forms-and-waitlists · Id: `page:/code/apps/forms-and-waitlists`

# Forms and waitlists

> Forms and Waitlists turn a visit into a lead, and the Visitor record joins earlier visits to the Contact once they sign up.

[Forms](https://startupbuilder.dev/business/nouns/form) and [Waitlists](https://startupbuilder.dev/business/nouns/waitlist) turn a visit into a [lead](https://startupbuilder.dev/business/nouns/lead), and the [Visitor](https://startupbuilder.dev/business/nouns/visitor) record joins earlier visits to the [Contact](https://startupbuilder.dev/business/nouns/contact) once they sign up.

- **System:** [Forms and waitlists](https://startupbuilder.dev/systems/forms)
- **Nouns:** 3
- **Verbs:** 6
- **Events:** 6

## Nouns
| Noun | What it is |
| --- | --- |
| [Form](https://startupbuilder.dev/business/nouns/form) | A Form is a set of fields someone fills in on a Site or in a Message, producing a lead, Evidence, or a Thing. |
| [Waitlist](https://startupbuilder.dev/business/nouns/waitlist) | A Waitlist is the leads waiting for an offer that is not open to them, invited in the order a Setting chooses. |
| [Visitor](https://startupbuilder.dev/business/nouns/visitor) | A Visitor is someone a startup cannot name, known by an id scoped to that startup. |

## Properties
The hub defines each Noun’s core Properties; Forms and waitlists adds the ones a sale needs.

### Form
| Property | Type | What it holds | Defined by |
| --- | --- | --- | --- |
| `fields` | `json` | The fields and their types. | The hub |
| `creates` | `'lead' \| 'evidence'` | What a submission makes: a lead by default. | Forms and waitlists |

### Waitlist
| Property | Type | What it holds | Defined by |
| --- | --- | --- | --- |
| `invited` | `integer` | How many leads have been invited. | The hub |
| `rank` | `string` | The invite order: first come, best ICP fit, or most referrals first. | The hub |
| `offer` | `Offer` | The offer it waits on. | Forms and waitlists |

### Visitor
| Property | Type | What it holds | Defined by |
| --- | --- | --- | --- |
| `firstSeenAt` | `datetime` | When the first request arrived. | The hub |
| `organization` | `Organization \| null` | The company behind the visit, from `Organization.resolve`, when one is known. | Forms and waitlists |

## Verbs
| Verb | What it does | Approval |
| --- | --- | --- |
| [`Waitlist.join`](https://startupbuilder.dev/business/nouns/waitlist/join) | Adds a lead to the Waitlist for an offer that is not open to them yet. | Runs on its own |
| [`Waitlist.admit`](https://startupbuilder.dev/business/nouns/waitlist/admit) | Lets leads in from a Waitlist to the offer they waited for, in the order the Waitlist ranks them. | Runs on its own |
| [`Visitor.identify`](https://startupbuilder.dev/business/nouns/visitor/identify) | Joins an anonymous Visitor to the Contact they turn out to be, so their earlier visits count. | Runs on its own |
| [`Visitor.merge`](https://startupbuilder.dev/business/nouns/visitor/merge) | Joins two Visitor ids that belong to one person and keeps both as aliases. | Runs on its own |
| [`Form.create`](https://startupbuilder.dev/business/nouns/form/create) | Saves a set of fields for a page or a Message; each submission makes a lead. | Runs on its own |
| [`Form.update`](https://startupbuilder.dev/business/nouns/form/update) | Changes a Form’s fields; submissions already in keep the fields they had. | Runs on its own |

## Reads the market
A Data Verb reads the market and returns a reading. A Software Verb changes your records and emits an Event. Forms and waitlists saves what these Data Verbs return; they are not its own Verbs.

[`Organization.resolve`](/code/data/organizations/resolve)

## Events
| Event | Emitted by |
| --- | --- |
| `Waitlist.joined` | [`Waitlist.join`](https://startupbuilder.dev/business/nouns/waitlist/join) |
| `Waitlist.admitted` | [`Waitlist.admit`](https://startupbuilder.dev/business/nouns/waitlist/admit) |
| `Visitor.identified` | [`Visitor.identify`](https://startupbuilder.dev/business/nouns/visitor/identify) |
| `Visitor.merged` | [`Visitor.merge`](https://startupbuilder.dev/business/nouns/visitor/merge) |
| `Form.created` | [`Form.create`](https://startupbuilder.dev/business/nouns/form/create) |
| `Form.updated` | [`Form.update`](https://startupbuilder.dev/business/nouns/form/update) |

A [Trigger](https://startupbuilder.dev/business/nouns/trigger) can start a Workflow on any of them, and a Watch delivers each to your endpoint, signed ([Events and webhooks](/code/events)).

## Who operates it
| Part | Forms and waitlists |
| --- | --- |
| Accountable | [Marketing lead](https://startupbuilder.dev/agents/marketing/marketing-lead) |
| Also calls its Verbs | [Sales lead](https://startupbuilder.dev/agents/sales/sales-lead) |
| Seat | An agent holds each seat until you seat a person in it. |
| Asks you first | None of its Verbs: each runs within its seat’s Limits |

## Integrations
[Google Analytics](/code/integrations/google-analytics)

## Import and export
| Direction | What | How |
| --- | --- | --- |
| Import | A waitlist kept elsewhere | `Waitlist.join` for each person, with the date they joined, so the order holds |
| Export | Submissions and joins | `Collection.export` |

## Example
**A waitlist admitted in order of fit.**

1. `Form.create` puts a three-field form on the pricing page; each submission joins the Waitlist.
2. `Waitlist.admit` lets in the first 20 by ICP fit, and `Message.broadcast` sends their invite.