Open-source waitlist with built-in referrals. The "refer friends to skip the line" launch mechanic, self-hosted and free. GetWaitlist and LaunchList are hosted SaaS that keep your signup data and charge to remove their branding. Refqueue is yours.
▶ Live demo: refqueue.com
They took the free plan away and the category leader just got acquired. Here's the open-source one that can't be paywalled or taken from you.
- Email signup → a live queue position ("You're #247").
- A unique referral link per signup with X / WhatsApp / LinkedIn / email share buttons.
- Confirmed referrals move you up the line: every friend who joins and confirms their email bumps your position. Unconfirmed signups never count.
- Configurable reward milestones ("refer 3 → early access") with automatic emails.
- A maker dashboard: signups, positions, top referrers, a 30-day chart, CSV export.
- Themeable: logo, color, and copy via environment variables.
- "Powered by Refqueue" credit: on by default, removable with one env var.
A referral counts only after the referred email completes double opt-in. That makes a fake referral cost a real, verifiable inbox, the single rule that keeps the numbers honest. Per-IP rate limiting and disposable-email blocking back it up.
Refqueue is a Next.js app backed by Supabase (Postgres + Auth).
Set up Supabase first (see supabase/README.md), then deploy.
Set APP_BASE_URL to your deployment's public URL after the first deploy.
cp .env.docker.example .env.docker # fill in your values
docker compose up -dThe app serves on port 3000; put it behind your reverse proxy and point APP_BASE_URL at
the public URL.
All configuration is environment variables, no settings UI to break. Copy .env.example
and fill in. The app refuses to start in production if a required variable is missing.
| Variable | Required | What it's for |
|---|---|---|
SUPABASE_URL |
yes | Supabase project URL |
SUPABASE_SERVICE_ROLE_KEY |
yes | Server-side data access (keep secret) |
SUPABASE_ANON_KEY |
yes | Maker auth sessions |
APP_BASE_URL |
yes | Your public URL, used in verification links |
EMAIL_FROM |
yes | From-address for emails |
RESEND_API_KEY or SMTP_* |
yes | An email provider (double-opt-in needs one) |
WAITLIST_NAME |
no | Display name (default "Waitlist") |
MAKER_EMAIL / MAKER_PASSWORD |
no | Enables the /dashboard (omit = no dashboard) |
THEME_ACCENT_COLOR / THEME_LOGO_URL / THEME_HEADLINE / THEME_SUBHEAD / THEME_CTA_LABEL |
no | Branding |
REWARD_TIERS |
no | JSON array of {referrals, label} milestones |
POWERED_BY |
no | Set to false to remove the credit |
See .env.example for the full annotated list.
npm install
npx supabase start # local Postgres + Auth (needs Docker/colima)
cp .env.example .env # fill in local values (supabase status -o json for keys)
npm run dev
npm test # unit
npm run test:integration # needs the local Supabase stack runningTo populate a demo instance with believable, already-confirmed signups (a live 30-day curve, a top-referrers leaderboard, a real-looking queue position), point the script at your Supabase env and run:
npm run seed -- --dry-run # preview the generated data, write nothing
npm run seed -- --env .env --count 250 # seed 250 verified signupsIt writes directly with the service role, so it needs no email provider. By
default it clears the waitlist's existing signups first; pass --append to keep them.
Refqueue v1 is deliberately small. Documented tradeoffs (tracked for v1.1):
- Rate limiting is per-instance and keyed on
x-forwarded-for. Deploy behind a proxy that sets it, and expect a shared limiter to arrive with multi-instance support. - A milestone reward email can rarely double-send if two referred users confirm in the same instant (best-effort semantics; bounded to a duplicate email, never a broken flow).
- Re-signing up with a known email returns that email's status: convenient status read-back, but it discloses membership. Use a generic response if that matters to you.
- The dashboard loads all signups per view: fine to tens of thousands; revisit at scale.
- Embeddable widget: drop the signup form into an existing site (most-requested).
- Position-jump animation: the satisfying "move up the line" motion.
- Email-provider sync (Mailchimp/ConvertKit), shared/distributed rate limiting, generated Supabase types.
Issues and PRs welcome. See CONTRIBUTING.md.
MIT. An open-source alternative to GetWaitlist / LaunchList. Own implementation; no affiliation.

