← All stories

BRANCH · ef-025-waitlist-public

Waitlist Public Submission + Status Check

EF-025 Persona: Public guest (no auth) Stage: Public Roots in: public-event-page

A guest who cannot register still deserves a clear path: join the waitlist, receive a token, and check status without exposing the list. The public waitlist surface must be honest about uncertainty while staying private under email and token probing.

Preconditions

Inherits public-event-page in page-resolves. Promotion emails and organizer waitlist reports are outside this public branch and noted as reference gaps.

Happy path

  1. Guest clicks Join waitlist.

    The waitlist form asks for name and email, using the same public form conventions as registration.

  2. Guest submits.

    Server creates one waitlisted registration and returns a tokenized status-check link.

  3. Guest checks status later.

    The status page accepts email plus waitlist token and shows either a position or generic “we’ll reach out” copy, depending on event policy.

Failure modes

Capacity full mid-fill

Trigger: a guest starts public registration, loses the race, and is handed into waitlist submit.

The waitlist form is prefilled from registration and completes without requiring the guest to retype. The 409 becomes a waitlist success path.

Two-tab idempotency

Trigger: guest joins waitlist twice in two tabs.

Only one waitlist row exists. The second tab shows the existing waitlist status for that email/token.

Network drop during submit

Trigger: the waitlist POST lands but response is lost.

Retry uses the same Idempotency-Key and returns the original token or status, not a second position.

Invalid input rejected without info leak

Trigger: fake event slug, fake waitlist token, or guessed status URL.

The status page returns the same generic “we couldn’t verify that status link” shape for malformed and unknown inputs.

Source page archived, draft, or deleted

Trigger: waitlist form or status check runs after event lifecycle changes.

The flow shows one generic unavailable page and does not reveal archived, draft, or deleted state.

Browser back after success

Trigger: guest joins waitlist and presses back.

The form does not resubmit. It shows the existing waitlist state with the submitted email read-only.

Open Graph tags present

Trigger: waitlist URL is shared.

OG tags remain canonical to the event hero and URL. Status tokens and email addresses never appear in metadata.

Bot-fill rate-limited

Trigger: one IP submits ten waitlist forms in thirty seconds.

UI surfaces retry-after or captcha. The response does not disclose whether submitted emails are already waitlisted.

Status check wrong email

Trigger: valid token is paired with a different email.

The page uses the same generic verify-failed message as an invalid token. It does not reveal the waitlisted email.

Position hidden by policy

Trigger: organizer disables public position display.

Status page shows “you’re on the waitlist” without a number. The page does not leak total waitlist length in copy or metadata.

Promotion happens while status page is open

Trigger: a confirmed guest cancels and this waitlisted guest is promoted.

Refresh or polling moves to a promoted state with next-step instructions. Email notification channel is referenced but not proven in this public story.

Stable test attributes

Visibility teeth. Each attribute must be effectively visible for its active waitlist state.

data-testWherePurpose
waitlist-panelPublic event pageRoot waitlist submission flow
waitlist-formInside panelWaitlist form
waitlist-nameInside formName input
waitlist-emailInside formEmail input
waitlist-submitInside formSubmit waitlist request
waitlist-confirmationSuccess stateWaitlist confirmation
waitlist-status-formStatus pageEmail plus token lookup
waitlist-status-emailStatus formStatus email input
waitlist-status-tokenStatus formStatus token input
waitlist-positionStatus resultVisible waitlist position when policy allows
waitlist-generic-statusStatus resultGeneric status when position hidden
waitlist-promotedStatus resultPromoted from waitlist state
waitlist-rate-limit429 stateRetry-after or captcha message
waitlist-unavailableUnavailable stateGeneric unavailable page
waitlist-verify-failedStatus error stateGeneric verification failure

Agent test plan

Run waitlist creation and status lookup against fixtures for visible-position policy, hidden-position policy, wrong-email token pairing, promotion, capacity handoff, and throttling.