A waitlist with referral positions: people sign up, get a place in the queue and a link, and move up when friends join using it.
Build me a waitlist that replaces GetWaitlist: a signup form, a queue people can move up by referring others, and no way to game it. STACK - Node 20+ with Fastify, server-rendered HTML plus one small embeddable script - SQLite through better-sqlite3, WAL mode - Caddy in front. The form must survive being linked from somewhere busy THE DATA MODEL - lists: id, name, slug, is_open, capacity, invite_batch_size, created_at - entries: id, list_id, email, name, referral_code, referred_by_id, position, points, status, ip_hash, created_at, verified_at, invited_at, joined_at - referrals: id, entry_id, referred_entry_id, created_at, counted — a row per successful referral, so a reversal is a flag and not a decrement - questions and answers, if the list asks anything beyond an email - events: id, entry_id, kind, created_at — signup, verify, refer, invite, join. The archive of what happened to a person - Status: pending, verified, invited, joined, removed SIGNING UP - Email, and nothing else unless the list owner adds a question - Double opt-in by default: a position is not final until the address is verified. This is not a formality — without it a competitor can put a thousand fake addresses at the top of your queue - A referral code per entry, and a link that carries it - Duplicate emails do not create a second row; they get their existing position back - Rate limit per address hash, and a honeypot field, and a minimum fill time THE QUEUE, AND KEEPING IT HONEST - Position is computed, never stored as truth: order by points descending, then by verified_at ascending. Store a cached position for display and recompute it on every change - A referral is worth points only when the referred address verifies. This one rule removes most of the abuse - Cap points from a single referrer per day, and ignore referrals whose address hash matches the referrer's - A removed entry keeps its row and its history — you want to be able to answer 'why did my position change' - Show a person their position, their points, their referral link, and how many places they moved this week INVITING - Invite in batches: the top N, or everybody above a points threshold, or a random sample — random is there because inviting only the loudest people gives you a biased first cohort - An invitation is an email with a signed link that expires, and the entry is marked invited with the time - Joined is set when the product tells the waitlist the person actually signed up, through a webhook or an API call — never assumed from the click - Un-invited entries keep their position; an expired invitation returns them to the queue and says so THE WIDGET AND THE PAGE - A hosted page per list, and an embeddable form under 8KB that posts to the same endpoint - The embed carries no styles of its own beyond a class hook; it inherits the host page - After signing up, the same page shows position, referral link, and share buttons that are plain links — no third-party SDKs - Everything works without JavaScript: the form posts, the page renders the result TELLING PEOPLE - Verification email immediately, and nothing else unless something changes - Optional: a message when somebody moves up by more than N places, capped to one a week - The invitation, and one reminder if unopened after three days - Every email has a one-click unsubscribe that removes them from the list, which is the honest meaning of unsubscribe here WHAT THE OWNER SEES - Signups over time, verification rate, referral coefficient, and the share of entries that came from referrals - Top referrers, with their referred addresses' verification rate beside them so a bulk-fake referrer is visible - Export to CSV, and a JSON feed PRIVACY - The address, the salted hash of the IP, and whatever the list asked for. Nothing else - Deletion by email address, complete, on request and without asking why - No third-party script anywhere THE INTERFACE - Owner: one list per page, a table, and the invite button - Public: the form, then the position. Big type, one screen, no scrolling required OPERATIONS - .env: DATABASE_PATH, BASE_URL, HASH_SALT, SMTP_URL, API_TOKEN - Migrations on boot, each once - Nightly backup off the machine, restore script - Health endpoint WHAT MATTERS MOST Double opt-in and the referral rules are the product. A waitlist with a leaderboard and no verification is a leaderboard of whoever wrote a script first. Build signup, verification and points first, then try to cheat your own queue — if you can, keep going. Give me the repository, the embeddable form, migrations, .env.example, a seed list with a hundred entries, and a README with deploy steps behind Caddy.
What you lose
- Referral mechanics already built, including the anti-gaming rules that keep a queue honest
- A hosted signup page and widget with no deployment
- Position emails sent as the queue moves, which is what makes people share the link
If you would rather not build
- A form plus a position query, which is what the prompt builds
- A Google Form, if referrals do not matter
What it costs
as published on their pricing page
| Plan | Billed monthly | Billed yearly | Last read |
|---|---|---|---|
| — | $21/mo | — | — |
Their pricing page is where these came from. Seeing a different price? Tell us.
The escape hatch
open source · no votes, no paid placement
Listmonk
$0Handles the list and the mails; you write the position logic.
knadh/listmonkfree · open source
Formbricks
$0Self-hosted forms for the signup half, with an API to read responses.
formbricks/formbricksfree · open source
Why this verdict
our own opinion · changed only by a person
93/100
Verdict yes at 93. Computing position at query time rather than storing it is the whole trick; storing it is how these systems end up wrong.
History
tracked since 10 Aug 2026 · nothing is ever overwritten
Questions about GetWaitlist
answered from the record above
Is GetWaitlist free?
No — the plan we track is $21 a month. Around $21/month billed monthly for the growth tier; a free tier covers small lists.
Can you replace GetWaitlist by building your own?
YES. Replaceable in one session with an AI coding agent. Replacement score 93 out of 100, build time one session. Read what you lose before you decide.
How much does GetWaitlist cost?
$21 a month on Growth — $252 a year. Recorded 10 Aug 2026.
What do you lose by replacing GetWaitlist?
Referral mechanics already built, including the anti-gaming rules that keep a queue honest; A hosted signup page and widget with no deployment; Position emails sent as the queue moves, which is what makes people share the link. If any of those carry weight for you, keep paying.
Is there an open-source alternative to GetWaitlist?
Yes: Listmonk, Formbricks. The prompt on this page is for when you want it your way instead.
Related entries
same category first, most replaced first
Every week, something stops being worth paying for.
New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.
free forever · no tracking pixel · stored here, never passed to anyone

