Waitlist Module
Pre-launch email collection, admin management, and CSV export.
VibeKit ships a pre-launch waitlist you can switch on before your product goes live. Visitors leave their email on your landing page; you collect, review, and export the list from the admin area.
Overview
When the waitlist module is enabled, the public site becomes a launch-mode storefront for the waitlist instead of the product:
- Dedicated page:
/waitlistcollects emails; the nav and footer replace the Pricing entry with Join Waitlist pointing there. - Hero: the buy button becomes a Join Waitlist button to
/waitlist. - Final call-to-action: the buy button is replaced by the signup form.
- Pricing experience: on the homepage and
/pricing, prices, plan cards, and Buy CTAs are replaced by the waitlist card in the same visual treatment.
Turning the module off restores the normal purchasable storefront everywhere. Existing customers keep full access to their accounts, billing history, licenses, and downloads — only public entry points convert.
Submissions are stored in your own database, deduplicated, and rate limited. You manage the list under /app/admin/waitlist and can export it as CSV for any email tool.
Key Capabilities
- Landing Page Form: Reusable
<WaitlistForm />component with inline validation, loading, and success states, styled with the design tokens for dark and light mode. - Deduplication: Repeat signups with the same email return success without creating a second entry.
- Rate Limiting: Server-derived account or network signals throttle submissions; a browser-supplied ID is never proof of identity.
- Admin Management: Search by email, filter by status, per-status counts, and entry removal under
/app/admin/waitlist. - CSV Export: One-click export of all entries (id, email, status, source, created date) for import into Loops, Resend, Mailchimp, Kit, or any other tool.
- Optional Emails: A welcome confirmation to the subscriber and an operator notification on each new signup, both configurable.
Configuration
Enable or disable the waitlist module in config.ts:
export const config = {
// ...
waitlist: {
enabled: true,
// Send the operator an email for every new signup. Off by default.
notifyAdminOnSignup: false,
// Send the subscriber a confirmation email. On by default.
sendWelcomeEmail: true,
},
};The module can also be toggled at runtime under /app/admin/modules without a redeploy. Disabling it removes the homepage form and blocks the API procedures immediately.
Placement
Launch mode wires everything automatically: the /waitlist page, the nav and footer entry, the homepage hero button and final CTA, and the pricing experience on both the homepage and /pricing. To place the form elsewhere (footer, a custom section), import the component and pass a source label so you can tell where each signup came from:
import { WaitlistForm } from "@marketing/waitlist";
<WaitlistForm source="hero" />The source label is stored per entry and shown in the admin table and CSV export. It defaults to homepage.
Emails
WaitlistConfirmation thanks the subscriber and sets the expectation that you will follow up when the product launches. WaitlistAdminNotification tells the operator address about each new signup when notifyAdminOnSignup is enabled. Post-signup emails are best-effort: a mail provider hiccup never fails an already-recorded signup.
In development, both emails land in the console mail sandbox; inspect .vibekit/mail-trap.json or run bun run mail:preview to review the templates.
Admin area
The admin waitlist surface stays accessible regardless of the launch-mode toggle — entries you already collected remain visible and manageable after switching the public collector off.
/app/admin/waitlist shows total and per-status counts, a searchable and filterable table, and the CSV export. Removing an entry deletes it from the database; if you need a permanent suppression list instead, keep the CSV export and unsubscribe handling in your email tool.
Privacy notes
Waitlist emails are collected before an account exists, so there is no user record attached to an entry. Entries carry only the email, status, source label, optional UTM/referrer metadata, and timestamps. Export the data or delete entries on request — the admin delete action is a hard delete.