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.
1Create a FormSMTP project
Sign up free 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.
2Give 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.
3Add the form
<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.
4Show a message without leaving the page
On a one-page landing site, swap the button for a confirmation instead:
<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>5Tag 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:
<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.
6Check 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
waitlisttag 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.
7Email the list on launch day
- Design the launch email in Templates.
{{first_name|there}}greets people by name when they gave one. - Open Emails, pick the template and choose the
waitlisttag (orteamfor just that group). - 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, Webflow and Carrd. 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
waitlisttag. - 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 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.