← Blog

How to quickly validate an idea with a waitlist

Validate a startup idea in a weekend: publish a promise-led landing page, collect waitlist emails, and read the demand signal before you build.

To validate an idea with a waitlist, publish a single landing page that states the promise, capture emails on a spam-resistant endpoint, and treat signups as the demand signal. A sharp page may convert 10–25% of targeted visitors to emails, but the more important question is whether the right people care enough to sign up and reply.

You do not need a product, a database, or an account system to start — only a page and somewhere durable to put the emails. This post is about deciding whether the idea deserves more work; the waitlists use case is the worked product flow.

The weekend validation loop

  • Write the promise — one headline (the outcome), one sub-head (who it is for), 3–5 benefit bullets, and a mockup or short clip.
  • Add one email field — a waitlist form posting to a hosted endpoint. Nothing else is required to measure intent.
  • Drive a little targeted traffic — relevant communities, a Show HN, or a small ad test — and watch the visit → email rate.
  • Talk to your signups — reply to the first ones and ask what they use today, what is broken, and what would make them switch. The qualitative signal beats the raw count.

What counts as a useful signal

Do not over-index on raw signup count. Validation is stronger when the traffic is targeted, the conversion rate is materially better than your broad traffic, and the first replies describe the pain you expected in the audience's own words.

  • Channel quality — tag each launch source so you can see whether demand came from the audience you actually want.
  • Reply quality — the first 5–10 conversations often teach you more than the next 100 passive emails.
  • Decision quality — strong signal means “keep going”; weak signal means rewrite the promise or change the audience before you build.

Why the waitlist implementation still matters

A landing page on Carrd, Framer, Cloudflare Pages, or plain HTML is easy. The awkward bit is the form: you need somewhere durable for emails without standing up an API or a database, and a validation launch attracts bots as well as humans. You want a thin intake layer — accept email, reject junk, export later.

Minimum viable waitlist

  • Email — the only required field to prove demand.
  • Source metadata — a ref or source so you know which post or ad drove each signup and can compute conversion per channel.
  • Spam controls — a domain-locked endpoint, rate limits, and a honeypot keep the signal clean.
  • Export — CSV/JSON when it is time to email the list or send invites.

Simple Signups approach

Create one campaign per idea you are testing, allow-list each hostname you embed from (www, apex, and preview hosts separately), and POST the email to the subscribe endpoint. No SDK, no account for the person signing up. Swap in your public campaign id (pub_…); the full field reference lives in the quickstart.

HTML waitlist form
<form action="https://simple-signups.com/api/subscribe" method="POST">
<input type="hidden" name="campaignId" value="pub_your_campaign_id" />
<input type="email" name="email" required placeholder="you@example.com" />
<input type="text" name="hp" tabindex="-1" autocomplete="off"
style="position:absolute;left:-9999px" aria-hidden="true" />
<button type="submit">Join waitlist</button>
</form>

Track source cleanly: tags for HTML, metadata for JSON

If you stay with a plain HTML form, use a hidden tags field to label the source. If you move to fetch, attach a small metadata object for richer attribution such as source and ref. That lets you compare conversion across the channels you tested without adding visible fields. Caps and types are documented under tags and metadata & extra fields.

fetch with tags + metadata
await fetch('https://simple-signups.com/api/subscribe', {
method: 'POST',
headers: { 'content-type': 'application/json' },
body: JSON.stringify({
campaignId: 'pub_your_campaign_id',
email: 'jane@example.com',
tags: ['waitlist'],
metadata: { source: 'landing', ref: 'hero' },
}),
});

Reading the result

Read visit → email by channel, then read the first conversations behind those signups. High conversion from the wrong audience can mislead you; modest conversion plus repeatable pain language can still be promising. If the signal is weak, rewrite the promise or change the audience before you build. Either way you keep the list — export confirmed or pending subscribers to CSV/JSON, or forward them into your stack with webhooks when you move past validation.

Related