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:
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>/entriesemail 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:
{
"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/:entryIdwith{ "status": "approved" | "rejected" }. The admin lane takes a session cookie or aBearerworkspace API key (pcft_live_…), and:workspaceIdis the workspace UUID. - Analytics —
GET /v1/workspaces/:workspaceId/waitlists/:waitlistId/analyticsreturns totals, aby_statusbreakdown, signups today / this week / this month, and top referrers.