waitlist

Per-product waitlists with confirmation, queue position, referral codes and admin export.

With fz, into the venture manifest

fz add waitlist

With cargo

cargo add cratefield-module-waitlist

fz runs inside your venture repository, linked against its own harness. About fz

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

    Join, answers 202 whatever the state

  • GET/v1/waitlist/confirm

    Confirm and take a position

  • GET/v1/waitlist/status

    A signed status token: position, referrals, share link

  • GET/v1/waitlist/admin/export.csv

    admin tokenThe full list

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.

  1. 0.4.4

    crates.ioReleaseDiff

    Other

    • updated the following local packages: cratefield-core, cratefield-mail-templates
  2. 0.4.3

    crates.ioReleaseDiff

    Other

    • ADR 0030: the mail-theme record takes the number it was sharing (#875)
4 earlier versions 0.3.0 to 0.4.2
  1. 0.4.2

    crates.ioReleaseDiff

    Fixed

    • close eight concurrency races across the pool cache, auth caches, realtime rooms, waitlist confirms and tracker adapters (#823)
  2. 0.4.1

    crates.ioReleaseDiff

    Other

    • seed the missing position-counter rows in migration 0007 (#801)
    • document the deferred confirmation mail, and correct every doc that still promises the join-time 503 (#806)
  3. 0.4.0

    crates.ioReleaseDiff

    Added

    • mail-templates branded mail in each venture's own style for every module that sends mail (#715) (#716)

    Changed

    • Breaking: requires cratefield-core 0.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-templates in 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 own MailTheme; default_templates() renders in the theme resolved from the venture's core Brand and its MAIL_THEME config, which also reaches override templates as theme in their data (#715).
  4. 0.3.0

    crates.ioRelease

    Added

    • core breaking name problem type URIs under the venture's own base (#557) (#581)

    Changed

    • breaking The confirmation mail is deferred: the entry lands on the request path and POST /v1/waitlist now always answers 202 {"ok":true}. Upgrading from 0.2.0 removes the 503 mail-not-configured a join used to return when no mailer was configured — with no mailer the entry is recorded as pending and no mail is sent, and the NotConfigured is only logged. The answer is deliberately identical for every row state so it leaks nothing about the address (#713).

This is the module Cratefield runs for its own early-access list. The form on this site posts to it.