A waitlist that runs itself
Signups append in arrival order, the sheet is the queue, and invites go out in batches. The SheetLink Forms waitlist runs on exactly this setup.
The workflow
A waitlist needs three things: a field for the email address, a durable ordered record of who signed up when, and a way to work through that record when invites go out. A spreadsheet is the second and third thing already; SheetLink Forms is the first.
The single-field form on your prelaunch page posts to a permanent endpoint, each signup is screened and appended as a row, and the sheet is the waitlist - position is literally row order. When you are ready to invite twenty people, you sort by Submitted At, take the top twenty rows without an invite date, and send.
This is not hypothetical: the waitlist form on the SheetLink Forms homepage is a SheetLink Forms endpoint writing into a sheet, and beta invites are worked from that sheet. The product queues its own customers.
Suggested columns
A waitlist sheet stays small and readable:
- Email - the one field that matters.
- Name - optional; asking for less gets you more signups.
- utm_source, utm_medium, utm_campaign - captured automatically by the
sl.jsembed when they are present in the URL. A month in, this is how you know whether the list is being filled by the launch tweet, the newsletter mention, or the ad test. - Submitted At - arrival order, which is queue order.
- Invited On and Notes - working columns. An empty Invited On cell means the person is still waiting.
The form markup
One visible field, the honeypot, and the embed for an inline confirmation instead of a page reload:
<form action="https://sheetlinkforms.com/f/your_token" method="POST" data-sheetlink
data-success-message="You're on the list.">
<input name="email" type="email" placeholder="you@example.com" required>
<input name="_slhp" tabindex="-1" autocomplete="off" style="position:absolute;left:-9999px">
<button type="submit">Join the waitlist</button>
</form>
<script src="https://sheetlinkforms.com/sl.js" data-token="your_token"></script>sl.js submits over AJAX, swaps in the success text, auto-injects the honeypot on dynamically rendered pages, and captures utm parameters - including on single-page frameworks, where a MutationObserver picks up forms that render late. Without the script the form still works; the visitor just gets a redirect to a thank-you page instead. Attribute reference is in the docs.
Working the sheet
Waitlist operations, in full:
- Invite in batches. Filter to rows where Invited On is empty, sort by Submitted At, take the top N, send invites with whatever you already use for email, and write today's date into Invited On. The filter shrinks; the queue advances.
- Watch the source split. A pivot on utm_source tells you which channel fills the list, which is the cheapest launch analytics you will ever run.
- Dedupe lazily. A helper column with
=COUNTIF(A:A, A2)>1flags repeat signups; keep the earliest row, since it holds the person's real place in line.
Because delivery is direct to the sheet with retries and a delivery log, the queue does not silently lose people when an API hiccups - which matters more for a waitlist than almost any form, since a lost row is a person who thinks they are in line.
Spam considerations
Single-field email forms are bot magnets - the easiest possible form to stuff. Three layers do the work here. The honeypot catches auto-fillers and marks them spam outright. The sl.js timing signal flags submissions that arrive faster than any human types. And the disposable-email heuristic catches throwaway domains, which matters because a waitlist full of dead addresses inflates your launch expectations.
Suspicious rows are quarantined for one-click review rather than dropped, so make a habit of sweeping the quarantine before each invite batch - real people occasionally have odd addresses, and approving them takes seconds. The reasoning behind quarantine-over-drop is laid out on how it works.
FAQ
Does SheetLink Forms send the invite emails?
No. The sheet is the list; sending is yours. Filter the rows you want, export or mail-merge with whatever you already use, and record the date in an Invited On column. SheetLink's job is making sure every signup is in the sheet, in order.
Is the SheetLink Forms waitlist really run on SheetLink Forms?
Yes. The homepage waitlist form posts to a standard /f/ endpoint and rows land in a sheet, the same as any customer form. Invites are worked from that sheet.
Can people find out their position in line?
Not automatically - there is no public counter. Position is row order in your sheet, sorted by Submitted At. If you want to tell people, that is a decision for your invite email, not the form.
Should I ask for more than an email?
Usually not. Every extra field costs signups. If you need one qualifying answer (company size, use case), a single dropdown is the ceiling - it lands as a clean, sortable column you can use to prioritize invites.
Related: Newsletter signups you own · Lead capture for ad landing pages · Forms for side projects and hackathons