Waitlist docs
Getting started

Launch a waitlist.

Paste a ready-made sign-up form into your site, or build your own; submitting an entry is one POST.


1

Enable Waitlist on your workspace

Open the Waitlist area in the console. If your workspace doesn't have Waitlist enabled yet, a workspace owner needs to turn it on under Workspace → Services in the sidebar — find the Waitlist row and hit Enable.


2

Create a waitlist

From the Waitlist area, click New waitlist and give it a slug plus a display name. Open for sign-ups now is on by default, so the waitlist takes sign-ups as soon as your form is live. Turn it off to start as a draft: public sign-ups are then refused until you click Open sign-ups on the waitlist, while test sign-ups from the console still work. (A waitlist created through the API starts as a draft unless you send "status": "active".)

Capacity, manual-approval mode, referral boost, the confirmation message and reCAPTCHA all live on the waitlist's Settings tab — none of them are required to take your first signup.


3

Paste the snippet into your site

Open the waitlist and go to the Get the snippet tab. It has a script tag, a plain HTML form and a React component, already filled in with your workspace and waitlist slugs. Paste one into your page and you are done: it needs no key, and it passes a ?ref= code from the page address along so referrals count. Click Add test signup on the same tab to see an entry appear in the entries list (it goes to Amazon's mailbox simulator, so nobody is emailed).

Under Sites that can sign people up you can list the sites allowed to post to the waitlist from a browser (for example https://acme.com, or https://*.acme.com for every subdomain). Leave it empty to allow any site. A browser on a site that is not listed gets a 403 with the code ORIGIN_NOT_ALLOWED; calls from your own server are not checked.


4

Or post entries from your own form

Prefer your own markup? POST entries straight to the public entries endpoint. No auth header needed:

bash
curl -X POST -H "content-type: application/json" \
  -d '{
    "email": "ada@example.com",
    "name": "Ada Lovelace",
    "metadata": { "company": "Analytical Engines Inc." }
  }' \
  https://api.waitlist.productcraft.co/v1/waitlists/<workspace-slug>/<waitlist-slug>/entries

email and name are the only required fields; anything else you collect goes in metadata. The response gives you the position and referral code to render:

201 Created
{
  "id": "627bc8ef-ce0f-47f5-afd4-8636961b1c82",
  "email": "ada@example.com",
  "name": "Ada Lovelace",
  "position": 1,
  "effective_position": 1,
  "status": "approved",
  "referral_code": "897TKH3C",
  "created_at": "2026-07-28T20:08:38.910Z"
}

A duplicate email on the same waitlist returns 409, a disposable-email domain returns 400, and the endpoint is rate-limited per IP (429). See the API reference for the full request and response shapes.


5

Webhooks for entry events

Webhooks are configured per workspace (console → Webhooks), not per waitlist, and every payload carries a waitlist_id so you can route server-side. You subscribe to any of three events: entry.created, entry.approved, entry.rejected.

Each delivery is signed with Standard Webhooks (webhook-id, webhook-timestamp, webhook-signature), so any Standard Webhooks library verifies it. The whsec_ signing secret is shown once, when the endpoint is created — store it then. Send a test from the console or the API to check your receiver before the first signup. Failed deliveries are retried for about a day, every event stays in the event log for 30 days and can be replayed, and 20 failures in a row (or 24 hours of failures) switch the endpoint off. Chapter 6 has the details.


Next

Where to go from here

  • API reference — every endpoint with request and response schemas.
  • Manage entries — bulk approve / reject from the console, or via PATCH /v1/workspaces/:workspaceId/waitlists/:waitlistId/entries/:entryId with { "status": "approved" | "rejected" }. The admin lane takes a session cookie or a Bearer workspace API key (pcft_live_…), and :workspaceId is the workspace UUID.
  • Analytics — GET /v1/workspaces/:workspaceId/waitlists/:waitlistId/analytics returns totals, a by_status breakdown, signups today / this week / this month, and top referrers.