# Waitlist form for a landing page (free, no backend)

> Collect waitlist signups from any landing page into tagged contacts with one HTML form, then email everyone on launch day through your own SMTP account.

Source: https://formsmtp.com/guides/waitlist-form · Last updated November 3, 2026

## How it works

A normal FormSMTP form emails each submission to you. Add a hidden `_subscribe` field and it does something else: it saves the visitor’s email (and name, if you ask for one) to your project’s *Contacts*, tagged with the field’s value. No email is sent at signup. When you’re ready to launch, you email everyone with that tag, now or at a scheduled time.

It posts with the public form key (`fk_…`), so it’s safe in your page source, and the same spam protection applies: per-visitor limits, a honeypot field and an optional CAPTCHA.

## 1. Create a FormSMTP project

[Sign up free](https://app.formsmtp.com/#/signup) and add a project. Pick your email provider so the SMTP host and port fill in, enter your login, and click *Test connection*. Gmail, Google Workspace, Microsoft 365, Zoho, Amazon SES, Brevo, SendGrid, Resend, Mailgun and any other SMTP server work. Personal Outlook.com and Hotmail addresses don’t, because Microsoft only allows OAuth sign-in for them.

## 2. Give the list its own project

Use a project only for this waitlist, not the one behind your contact form or any API or AI use. In *Settings → Security*, set **Allowed websites** to your landing page’s address, for example `https://yourproduct.com`.

Leave **Allowed recipients** empty in this project: scheduled emails skip anyone who isn’t on that list, so filling it with your own address would stop your launch email from reaching anyone else. That’s also why the list needs its own project. With the list empty, this project’s API key (`fs_…`) and any AI assistant connected to it could email anyone, so don’t use its API key or connect an assistant to it. The form key in your page still can’t email anyone but you.

Turn on a CAPTCHA under *Settings → Spam protection* as well (Cloudflare Turnstile is free). Signups aren’t confirmed by email, so it’s your main guard against bots filling the list; see [contact form spam protection](https://formsmtp.com/guides/contact-form-spam-protection).

## 3. Add the form

```html
<form action="https://app.formsmtp.com/api/v1/form/YOUR_FORM_KEY" method="POST">
  <label>Email <input name="email" type="email" autocomplete="email" required></label>
  <label>Name (optional) <input name="name" autocomplete="name"></label>

  <input type="hidden" name="_subscribe" value="waitlist">
  <input type="hidden" name="_next" value="/thanks">
  <input type="text" name="_gotcha" style="display:none" tabindex="-1" autocomplete="off">

  <button type="submit">Join the waitlist</button>
</form>
```

Replace `YOUR_FORM_KEY` with the form key from *API & code*. After signing up, visitors land on `/thanks`, which must be on the same site.

## 4. Show a message without leaving the page

On a one-page landing site, swap the button for a confirmation instead:

```html
<script>
  const form = document.querySelector("form");
  form.addEventListener("submit", async (e) => {
    e.preventDefault();
    const button = form.querySelector("button");
    button.disabled = true;
    const res = await fetch(form.action, {
      method: "POST",
      headers: { Accept: "application/json" },
      body: new URLSearchParams(new FormData(form)),
    });
    const data = await res.json();
    if (data.success) {
      form.innerHTML = "<p>You're on the list. We'll email you when we launch.</p>";
    } else {
      button.disabled = false;
      alert(data.error);
    }
  });
</script>
```

## 5. Tag by interest (optional)

The `_subscribe` value can hold several tags, separated by commas. Let visitors pick one and you can email each group differently later:

```html
<select name="_subscribe">
  <option value="waitlist,solo">Just me</option>
  <option value="waitlist,team">My team</option>
</select>
```

Use this in place of the hidden `_subscribe` input. Only the email, name and tags are saved, so put anything else you want to know into tags.

## 6. Check the list before you send

FormSMTP doesn’t send a confirmation email at signup, so anyone can type someone else’s address, and bots can add thousands. Emailing people who never asked for it gets your mailbox or domain flagged for spam, and in many countries it needs consent you don’t have.

- Open *Contacts*, filter by the `waitlist` tag and delete anything suspicious: bursts of signups in the same minute, random-looking addresses, or many addresses at one unknown domain.
- Send a small test batch first (tag a few real contacts `launch-test`) and watch *Logs* for bounces before you email everyone.
- For a large list, send from an account built for bulk email, such as Amazon SES, Brevo or Mailgun, not your personal mailbox.

## 7. Email the list on launch day

1. Design the launch email in *Templates*. `{{first_name|there}}` greets people by name when they gave one.
2. Open *Emails*, pick the template and choose the `waitlist` tag (or `team` for just that group).
3. Choose **Send now**, or **Schedule** it for launch morning. Each person gets their own copy with an unsubscribe link.

Want to keep the list warm until then? Set a monthly update with **Repeat** and a **Stop after** date on launch day. You can also *Export CSV* from *Contacts* if you move the list elsewhere.

## Framer, Webflow and Carrd

The form works on any site builder that lets you set a form’s action or embed HTML. The builder guides show where to paste it: [Framer](https://formsmtp.com/guides/framer-contact-form), [Webflow](https://formsmtp.com/guides/webflow-contact-form) and [Carrd](https://formsmtp.com/guides/carrd-contact-form). Use the waitlist form above in place of the contact form, keeping the hidden `_subscribe` field.

## What it doesn’t do

- **No confirmation email (double opt-in).** FormSMTP doesn’t send a “please confirm” or “you’re on the list” email at signup, so addresses aren’t verified. Check the list before launch (step 6); your thank-you page or message tells visitors they’re in.
- **No email to you per signup.** New signups appear under *Contacts*, or ask your AI assistant how many people have the `waitlist` tag.
- **No positions or referrals.** There’s no queue number or invite-a-friend tracking.
- **Unsubscribes stick.** Someone who unsubscribed and signs up again gets the tag but stays unsubscribed.

Running an ongoing newsletter rather than a one-off launch list? The [newsletter signup guide](https://formsmtp.com/guides/newsletter-signup-form) covers regular sends to subscribers.

## FAQ

### Is the waitlist form free?

Yes. Collecting signups doesn’t send email, so it doesn’t use your monthly emails. The launch email counts one per person, and the Free plan includes 1,000 emails a month.

### What happens if someone signs up twice?

They stay one contact. A repeat signup only adds any new tags, so nobody gets your launch email twice.

### Can I collect more than an email address?

The signup saves the email, an optional name and the tags in _subscribe. To capture choices like team size, offer them as tag options.

### How do I see who joined?

Open Contacts in your project and filter by the waitlist tag. You can export the list as CSV at any time.

## More guides

- [Newsletter signup form for a static site](https://formsmtp.com/guides/newsletter-signup-form)
- [How to send email from a static website (no backend)](https://formsmtp.com/guides/send-email-from-static-website)
- [HTML contact form that emails you (copy-paste, no backend)](https://formsmtp.com/guides/html-contact-form)
- [Add a contact form to GitHub Pages](https://formsmtp.com/guides/github-pages-contact-form)
