waitlist
Per-product waitlists with confirmation, queue position, referral codes and admin export.
What it is
waitlist.
A visitor joins a named waitlist and confirms by email; on confirmation the module assigns a dense queue position inside a single atomic batch, so two people confirming at once never share a place. Referral codes credit a confirmed referrer on the same product. It answers identical bytes for every row state, so the endpoint reveals nothing about who is on the list.
Positions are dense at assign time per product and never recomputed on delete, and the referrer credit and the position update run in one Database::batch — atomic on D1, a transaction on SQLite and Postgres.
Ports
Database · Mailer · Signer · Captcha and RateLimiter optional
Routes
/v1/waitlist
- POST
/v1/ waitlist - GET
/v1/waitlist/confirm - GET
/v1/waitlist/status - GET
/v1/waitlist/admin/ export.csv
UI surface
A join form, a status page, and an admin export table, rendered at /ui from the handler's own types.
Emits
waitlist.joined, waitlist.confirmed
History
Changelog.
From the crate’s CHANGELOG.md in the harness, as of 0c5560b. 6 versions recorded, newest first. Every published version is on crates.io.
Other
- updated the following local packages: cratefield-core, cratefield-mail-templates
Other
- ADR 0030: the mail-theme record takes the number it was sharing (#875)
4 earlier versions 0.3.0 to 0.4.2
Fixed
- close eight concurrency races across the pool cache, auth caches, realtime rooms, waitlist confirms and tracker adapters (#823)
Added
Changed
- Breaking: requires
cratefield-core0.8 (was 0.7), and so a minor rather than a patch bump: a venture still on core 0.7 does not pick this release up through a caret requirement and end up with two copies of core (#712). - The confirmation and "you're in" mails render through
cratefield-mail-templatesin the venture's theme: a 600px email-client-safe layout with a dark variant, a preheader and a plain-text twin, replacing the askama templates. Subjects are unchanged; the confirmation gains an "ignore this if you didn't join" note.themed_templates(&theme)composes the venture's ownMailTheme;default_templates()renders in the theme resolved from the venture's coreBrandand itsMAIL_THEMEconfig, which also reaches override templates asthemein their data (#715).
- Breaking: requires
Changed
- breaking The confirmation mail is deferred: the entry lands on the request path and
POST /v1/waitlistnow always answers202 {"ok":true}. Upgrading from 0.2.0 removes the503 mail-not-configureda join used to return when no mailer was configured — with no mailer the entry is recorded aspendingand no mail is sent, and theNotConfiguredis only logged. The answer is deliberately identical for every row state so it leaks nothing about the address (#713).
- breaking The confirmation mail is deferred: the entry lands on the request path and
This is the module Cratefield runs for its own early-access list. The form on this site posts to it.