Step 1: Get a free access key (15 seconds)
- Open splitforms.com/login
- Type your email, click Send sign-in code
- Check your inbox, paste the 6-digit code, click Sign in
- You're in. Copy the access key from the dashboard — it looks like
4f3a2c1b...
That's your authentication. No API keys to manage, no environment files to set up. The access key goes directly in your form HTML.
Step 2: Paste the HTML (30 seconds)
This works on any website that lets you edit HTML. Copy this snippet, replace YOUR_ACCESS_KEY with your real key, and paste it.
<form action="https://splitforms.com/api/submit" method="POST">
<input type="hidden" name="access_key" value="YOUR_ACCESS_KEY" />
<label>Name <input name="name" type="text" required /></label>
<label>Email <input name="email" type="email" required /></label>
<label>Message <textarea name="message" required></textarea></label>
<!-- Honeypot — bots fill this, humans don't see it -->
<input type="checkbox" name="botcheck" style="display:none" tabindex="-1" />
<button type="submit">Send</button>
</form>That's the entire form. No <script> tags, no JavaScript libraries, no backend code. The browser handles the POST natively.
Step 3: Submit a test (15 seconds)
Open the page in your browser, fill in the form, click submit. Within 2–5 seconds your inbox shows the message. Done.
The submission also lives in your dashboard at splitforms.com/dashboard/submissions so you can search/filter past submissions later.
Framework-specific snippets
Same access key. Different syntax. Each takes the same 60 seconds end-to-end.
Next.js (App Router, client component)
"use client";
import { useState } from "react";
export default function ContactForm() {
const [status, setStatus] = useState("idle");
async function onSubmit(e) {
e.preventDefault();
setStatus("loading");
const formData = new FormData(e.target);
formData.append("access_key", "YOUR_ACCESS_KEY");
const res = await fetch("https://splitforms.com/api/submit", {
method: "POST", body: formData,
});
const data = await res.json();
setStatus(data.success ? "ok" : "err");
}
return (
<form onSubmit={onSubmit}>
<input name="name" required />
<input name="email" type="email" required />
<textarea name="message" required />
<input type="checkbox" name="botcheck" style={{ display: "none" }} tabIndex={-1} />
<button>{status === "loading" ? "Sending..." : "Send"}</button>
</form>
);
}Full Next.js guide: /forms/nextjs
React (Vite, CRA, Remix)
Same code as Next.js without the "use client" directive. See /forms/react.
Vue / Nuxt
Astro
Pure HTML form with no client JavaScript needed: /forms/astro
Webflow
Use Webflow's native Form Block. Set Action = https://splitforms.com/api/submit, Method = POST, add a hidden field for access_key: /forms/webflow
WordPress
No plugin needed. Drop the HTML into a Custom HTML block: /forms/wordpress
Plain HTML / static site
Just the snippet from Step 2 above. Works on Carrd, GitHub Pages, Netlify, Cloudflare Pages, anywhere static.
Optional: customize in 30 more seconds
- Redirect to a thank-you page after submit: add
<input type="hidden" name="redirect" value="https://yoursite.com/thanks" /> - Custom email subject: add
<input type="hidden" name="subject" value="New lead from website" /> - Set Reply-To header: add
<input type="hidden" name="replyto" value="your@email.com" /> - Restrict to your domain: in dashboard → Settings → Allowed domains, add
yoursite.com— submissions from anywhere else will be rejected.
Tech support / troubleshooting
If something does not work in those 60 seconds, it is almost always one of these:
- No email arrived after 30 seconds. Check your spam folder for splitforms.com, then mark as Not Spam. Then check the dashboard's Submissions tab — if the row is there, the issue is on the email leg, not the form leg. See contact form not working for the eight common causes.
- 401 Unauthorized in the network tab. Your
access_keyis wrong, missing, or still set toYOUR_ACCESS_KEY. Re-copy from the dashboard, watch out for leading whitespace. - CORS error in the browser console. You are using
fetch()from a different origin and the request URL is wrong — splitforms returns CORS headers fromsplitforms.com/api/submitonly. Double-check the URL. - Form submitted but the page reloads to a JSON blob. Add a hidden
redirectinput pointing at your thank-you page so the browser redirects instead of rendering the API response. - Bot submissions filling the dashboard. Make sure the honeypot input is present and named
botcheck. See honeypot vs reCAPTCHA for advanced layered protection.
Why this is faster than alternatives
- vs Google Forms: 60 seconds vs ~3 minutes (you have to build the form in Google's UI, then embed iframe). Plus it lives on docs.google.com instead of your domain.
- vs Typeform: 60 seconds vs ~5 minutes. Typeform's 10-response/month free tier means it stops working immediately for any real site.
- vs setting up your own backend: 60 seconds vs days. SMTP server, spam filtering, validation, storage, dashboard — all replaced with one POST endpoint.
- vs Mailto links: Mailto opens the user's mail client (which most don't even have configured). Conversion is roughly 0%. Real form submissions convert ~25%.
FAQ
Is 60 seconds realistic?
Yes — for someone who can copy-paste HTML, 60 seconds is the actual sign-up + paste + first-submission time. The bottleneck is usually waiting for your first email to arrive, which is typically 2–5 seconds after you submit.
Do I need a backend or server?
No. The whole point of a form backend service is to avoid running your own server. Your form's `action` attribute points at the service's URL, the service handles email delivery and storage, and your site stays static.
Will my form work without JavaScript?
Yes. The plain HTML approach (described in this guide) works with JavaScript completely disabled. The form does a regular browser POST and the service responds with a redirect to your thank-you page. JavaScript is only needed if you want inline success messages without page reload.
How do I add spam protection?
Add an invisible input named `botcheck` with `style="display:none"`. Bots fill every input they see and trip the honeypot; humans don't see it. Splitforms drops any submission with a non-empty `botcheck` automatically.
What about file uploads?
splitforms doesn't support file uploads yet (Q3 2026 roadmap). For uploads, Formspree's paid plan or self-hosted alternatives work. For most contact forms, file uploads are a security liability anyway — text + email is enough.
Will form submissions land in my spam folder?
splitforms sends from a warmed, SPF/DKIM/DMARC-aligned domain that we maintain ourselves. The first email may need a one-time 'Not spam' click in Gmail, after which every subsequent submission lands in the inbox. If you connect a custom sending domain (Pro), keep your SPF/DKIM records valid.
What if I need a multi-page or multi-step form?
Use the same access key across multiple pages — each step's form posts to splitforms with a hidden 'step' field that you can filter by in the dashboard. Or wire up a simple React state machine and only call splitforms on the final step. Either pattern works on the free plan.
Where do I get help if my form does not work?
Open the dashboard's Submissions tab to see whether the request reached splitforms. Read /faq for the eight most common failure modes, or browse /docs and /api-reference for the full endpoint contract. Email support@splitforms.com if you are still stuck — Pro plans get same-day replies.
Next steps and where to get help
- Browse the splitforms docs for the full request/response contract and webhook spec.
- Read the API reference if you are integrating from a server, mobile app, or AI agent.
- Check the FAQ for billing, deliverability, and security questions.
- Compare integrations: Next.js, React, Astro, Webflow, WordPress.
- Considering competitors? Read splitforms vs Formspree or splitforms vs Web3Forms.