---
title: "Build a waitlist form"
description: "Collect signups and capture where they came from — without implying every signup gets an invitation."
order: 6
type: "guide"
topic: "Use cases"
tags:
  - "waitlist"
  - "beta"
  - "email"
  - "attribution"
updated: "2026-07-15"
---

A waitlist form records who wants access and why, without promising an invitation or launch date the team can't guarantee.

## Create the form

```ts
const waitlist = defineForm({
  id: "analytics-beta-waitlist",
  title: "Join the analytics beta",
  pages: [{
    id: "request",
    blocks: [
      { id: "email", kind: "email", label: "Work email", required: true },
      { id: "company", kind: "short_text", label: "Company" },
      {
        id: "goal",
        kind: "select",
        label: "What do you want to understand?",
        options: [
          { id: "activation", label: "Activation" },
          { id: "retention", label: "Retention" },
          { id: "reliability", label: "Reliability" },
        ],
      },
      { id: "source", kind: "hidden", label: "Source", paramName: "src" },
    ],
  }],
  settings: {
    submitLabel: "Join waitlist",
    successTitle: "You're on the list",
    successMessage: "We'll email you if this beta is a fit.",
    responseLimit: { by: "field", field: "email", onRepeat: "keep" },
  },
});
```

An email-field response limit cuts down accidental duplicates, but it doesn't verify that the person owns the address. If the waitlist lives inside a signed-in product, use verified respondent identity instead.

## Decide how invitations are sent

Send accepted requests to the response grid, Google Sheets, Notion, Zapier, or a webhook. Qualify people outside the form, record invitation state in the system that owns access, and send invitations from an approved messaging tool — a waitlist response signals interest, it doesn't grant access.

## Test signups, duplicates, and delivery

Try each campaign parameter, a duplicate email, missing optional fields, and destination retries. Keep the confirmation copy honest: it should read true even if no invitation is ever sent.

## Try it

[Start with a prompt](/start?from=guide-build-a-waitlist-form) and your coding agent builds the first form, staged for your review — or [open the editor](/new).

## Related

- [Beta access example](/examples#beta-access): See a live waitlist-style form.
- [Response limits](/docs/response-limits): Reduce repeat requests by contact or signed account.
- [Capture UTM attribution](/guides/capture-utm-attribution): Add campaign context without another visible question.
- [Zapier](/docs/integrations/zapier): Hand accepted requests to a lifecycle workflow.
