Generate a free splitforms key
Sign in at splitforms.com — your access key is created instantly. No credit card, no setup wizard, no SDK to install.
Waitlist · React
Pre-launch capture form with optional referral source. Free for 200 submissions total — no backend, no SDK, no plugin.

Copy-paste code
Replace YOUR_ACCESS_KEY with your splitforms key, paste into a React page, and ship. No build-time integration required.
'use client';
import { useState, type FormEvent } from 'react';
export default function WaitlistForm() {
const [status, setStatus] = useState<'idle' | 'sending' | 'sent' | 'error'>('idle');
async function onSubmit(e: FormEvent<HTMLFormElement>) {
e.preventDefault();
setStatus('sending');
const data = new FormData(e.currentTarget);
data.set('access_key', 'YOUR_ACCESS_KEY');
data.set('subject', 'New waitlist signup');
const res = await fetch('https://splitforms.com/api/submit', {
method: 'POST',
body: data,
headers: { Accept: 'application/json' },
});
const json = await res.json();
if (json.success && json.payment_url) {
// Payment form: finish the payment on the secure Stripe page.
window.location.href = json.payment_url;
return;
}
setStatus(json.success ? 'sent' : 'error');
if (json.success) e.currentTarget.reset();
}
if (status === 'sent') return <p>Thanks — we’ll be in touch.</p>;
return (
<form onSubmit={onSubmit}>
<label htmlFor="email">Email *</label>
<input id="email" type="email" name="email" placeholder="[email protected]" required />
<label htmlFor="name">Name</label>
<input id="name" type="text" name="name" placeholder="Optional" />
<label htmlFor="referral">How did you hear about us?</label>
<select id="referral" name="referral">
<option value="">Choose…</option>
<option>Twitter</option>
<option>Friend</option>
<option>Search</option>
<option>Newsletter</option>
<option>Other</option>
</select>
<button type="submit" disabled={status === 'sending'}>
{status === 'sending' ? 'Sending…' : 'Send'}
</button>
{status === 'error' && <p>Something went wrong. Try again.</p>}
</form>
);
}React + Waitlist
React ships nothing for form delivery — it's a view layer. The historical options are an Express server you stand up just for POST /api/contact, a Vercel serverless function with SMTP wiring, or a third-party library like Formik that still leaves the backend problem unsolved. The waitlist on this page uses useState for submit state and a plain fetch POST to splitforms — no form library, no context provider, no wrapper component. It works in Create React App, Vite, Remix, and every React bundler because it's just standard FormData and the Fetch API.

Waitlist fields
The posted payload contains email, name, how did you hear about us?. Required fields are email. Rename, remove, or add your own — splitforms accepts any name you POST.

Template playbook
Waitlists are the cheapest growth tool a pre-launch product has — Superhuman, Notion, and Linear all built sizable waitlists before paid launch. The form captures email plus a question or two on use case ('what would you use this for?', 'what tools do you use today?') so the launch sequence segments by intent. Multi-step flow boosts completion vs a single form — the prospect commits in step 1 and answers the qualifying questions in step 2-3 with momentum. Push waitlist signups to a dedicated ESP audience (Loops, ConvertKit, Beehiiv) so launch-day emails segment by use case and target the highest-intent signups first.

Setup
Three actions stand between you and your first waitlist submission — no backend, no database, no CAPTCHA library.
Sign in at splitforms.com — your access key is created instantly. No credit card, no setup wizard, no SDK to install.
Drop the form snippet into a React page, component, or layout. Replace YOUR_ACCESS_KEY with the key from your dashboard. The form action is a hard-coded URL — no env vars or build-time wiring needed.
Dashboard updates live on Free. Free includes owner email delivery; Starter adds signed webhooks, CSV export, Slack/Discord forwarding, and BCC to your team.
How SplitForms works
Connect your form, collect every submission, and send data where it needs to go — without building backend infrastructure.

Point your form to your unique SplitForms endpoint. That's it.

We instantly capture and organize every submission in your inbox.

Send data to email, spreadsheets, CRMs, webhooks, and 7,000+ apps.

No credit card required. Set up in under 60 seconds.
Connect & automate
SplitForms works with the destinations you route to and the platforms you build on — from Slack and Sheets to WordPress, Shopify, and Next.js. And with Stripe connected, your forms can take payments too.

Trusted by indie teams and agencies shipping forms worldwide
Testimonials
40 quotes on record — from indie hacks to agency migrations.
“Submissions are isolated per account with row-level security. As someone who reviews vendors for a living, the /security page told me everything I needed.”
“I run three client retainers through one splitforms account, each form tagged and routed to its own inbox. Clean separation, one dashboard.”
“The Eleventy starter I use now ships with splitforms by default. Every site I spin up has a working form before I write a line of content.”
“Notifications include the full submission, so I can triage a lead from my phone without logging in. That's the whole experience I wanted.”
“I wired a ChatGPT-built chatbot's qualified leads straight into splitforms. It's the backend the AI hands the data to, exactly as it should be.”
“We A/B-tested two landing pages, each with its own form, and compared submission counts in the dashboard. No analytics gymnastics required.”
Common questions
Yes. The form is plain HTML with a single POST endpoint, so it runs on any React site without server-side code, plugins, or SDKs. Drop the snippet into a React page or component and submissions land in your splitforms dashboard.
Free for 200 submissions total — no credit card, no trial. Pro is $5/mo for 5,000 submissions, and there's a one-time $59 3-year plan (15,000 submissions/mo for 36 months). The same pricing applies regardless of which framework hosts the form.
Yes. The template ships with sensible defaults (email, name, how did you hear about us?…) — add, remove, or rename any of them. Splitforms accepts whatever fields you POST.
A hidden honeypot field catches dumb bots, and a tuned classifier scores the rest. You only see real submissions in your dashboard. No CAPTCHA, no friction for human users — and it works the same on React as on any other framework.
Yes. Webhooks are available on paid plans, with auto-formatted payloads for Slack, Discord, and WhatsApp (via CallMeBot). Or send raw signed JSON to any URL — Zapier, n8n, your own server. Configure in the splitforms dashboard.
Yes — the form posts directly to splitforms from the browser, so no server is involved. Works on Vercel, Netlify, GitHub Pages, Cloudflare Pages, S3, or any plain Apache host.
Showing 'you're #347 in line' on the confirmation creates social proof but invites comparison. Showing total waitlist size ('join 2,500 people on the waitlist') without per-person position is the safer middle. Refer-a-friend mechanics that move people up the list (Robinhood-style) drive viral growth but require more eng work.
Tag waitlist signups by use case in the ESP audience (Loops, ConvertKit). Launch-day, segment by tag and send invite waves over 48-72 hours. Highest-intent / closest-fit goes first; broadest casts go last. Spreads server load and lets you triage onboarding support.
Yes — webhook the JSON. Loops has direct webhook support and is purpose-built for product transactional + waitlist email. ConvertKit and Beehiiv accept via API or Zapier. All three handle the launch-sequence segmentation cleanly.
Simple pricing
Choose a plan that fits your workflow — from a free form endpoint to full automations, exports, Stripe payments, and higher submission limits.
For side projects and indie devs.
For agencies and growing products.
Pay $59. 3 years sorted.
No credit card required on Free • Cancel anytime