Get your free splitforms access key
Sign up at splitforms.com, verify your email, and copy your access key from the dashboard. No credit card required.
Contact form · HTML
The simplest possible setup. Drop one <form> tag into your HTML and submissions land in your dashboard. Free includes inbox delivery. No JavaScript, no backend, no server to maintain. Works on GitHub Pages, S3, Cloudflare Pages, plain Apache — anywhere static HTML can be served.

No server, API route, or SDK. Your HTML form posts straight to one endpoint.
Every submission is emailed to you and saved to a searchable dashboard — spam filtered before it reaches you.
It's your own HTML markup and styles. Splitforms is only the backend, so nothing constrains how the form looks.
Copy-paste ready
Replace YOUR_ACCESS_KEY with the key from your dashboard — that's the whole integration. No SDK to install, no build step, just the html you already write.
<form action="https://splitforms.com/api/submit" method="POST">
<input type="hidden" name="access_key" value="YOUR_ACCESS_KEY" />
<input type="text" name="name" placeholder="Your name" required />
<input type="email" name="email" placeholder="you@example.com" required />
<textarea name="message" placeholder="What's up?" required></textarea>
<!-- Honeypot for spam — hidden from humans -->
<input type="checkbox" name="botcheck" style="display:none" tabindex="-1" />
<button type="submit">Send message</button>
</form>How to add it
To add a contact form to a HTML website you need three things: a free splitforms access key, the html snippet above, and your key pasted into it. No backend, server, or SDK — the form posts to one URL and every submission lands in your inbox and dashboard.
Sign up at splitforms.com, verify your email, and copy your access key from the dashboard. No credit card required.
Copy the HTML code example into your project and replace YOUR_ACCESS_KEY with the key from step 1.
Submissions arrive in the splitforms dashboard within seconds. Free includes inbox delivery; Pro adds Slack, Discord, Sheets, or any signed webhook URL.
Where submissions go
Every submission is emailed to you and saved to a searchable dashboard — spam filtered before it ever reaches you. Search, export to CSV, or forward it to a webhook or Slack on Pro.

No backend needed
Your HTML form posts standard FormData to one URL. Splitforms validates the access key, runs the spam classifier, and forwards it to your email — so there's no server, API route, or database for you to build or maintain.

Best practices
The difference between a form that works in the demo and one that survives launch traffic — the production-tested defaults, in priority order.

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.

Trusted by indie teams and agencies shipping forms worldwide
Testimonials
40 quotes on record — from indie hacks to agency migrations.
“I replaced a Lambda + DynamoDB + SES contact form with six lines of HTML. It took eleven minutes, and the dashboard is better than what I was going to build.”
“We migrated 14 client sites off Formspree in a single weekend. The price is a third of what we paid, the API is more honest, and the spam filter actually works.”
“The webhook payload is signed, idempotent, and well-shaped. It reads like code from a competent team, not a CRUD app held together with duct tape.”
“I stopped reaching for Typeform on small marketing sites. splitforms covers 90% of the use case at none of the bloat.”
“I onboarded our whole agency in an afternoon. The MCP integration meant Cursor literally dropped the form straight into our client repos for us.”
“The free plan gave me 500 submissions before I paid a cent, and Pro is five dollars a month. I've spent more on coffee deciding which backend to use.”
“Spam went from forty junk entries a day to zero, with no reCAPTCHA puzzle ruining the form. The honeypot and time-trap just quietly do their job.”
“Point the form action at one endpoint and you're done. No SDK, no client library, no build step. This is how a form backend should feel.”
“Leads land in Slack the second someone submits, and a copy goes to Google Sheets for the sales team. I wired both up in under ten minutes.”
“I run a static Hugo site on a five-dollar VPS. splitforms gave it a real contact form without me standing up a single server.”
Questions
Paste the snippet above into your HTML file. Replace YOUR_ACCESS_KEY with the key from your splitforms dashboard. Submissions go to your inbox immediately. No JavaScript, no build step, no install.
Yes — every static host. The form posts to splitforms.com from the browser, so the host only serves the HTML. Lock the access key to your custom domain (or *.github.io / *.pages.dev) in the splitforms dashboard.
Splitforms returns a default error page on failures (invalid key, spam, rate-limit). You can customize that page in the splitforms dashboard → Settings → Error Page. For inline error handling, you'd need a small JS snippet — see the AJAX page.
Yes. Add enctype="multipart/form-data" to the form and use a normal <input type="file">. File uploads work after the account connects the Storage integration; the current limit is 5 files per submission at 5 MB each.
Set the URL in Dashboard → Form settings → Redirect. After a successful native form submission, splitforms sends the browser there. A redirect field submitted with the form is ignored to prevent open redirects. The /thanks.html page is yours — build it however you like.
Yes. The hidden honeypot field catches naive bots; a tuned classifier scores everything else and quarantines anything that looks automated. CAPTCHA hurts conversion (5-15% drop, depending on study) so we don't use one. If you ever need stricter protection, the Pro plan adds custom rules.
If you forget method="POST" (or omit it — GET is the HTML default), the browser appends form fields to the URL: ?name=Maya&email=…. Splitforms's endpoint returns 405 Method Not Allowed because it only accepts POST. Always specify the method explicitly.
If you accidentally name two fields email, FormData posts both — but the splitforms dashboard shows the last one. For checkbox groups, use name="interests[]" or unique names per checkbox.
Standard forms submit as application/x-www-form-urlencoded, which can't carry binary file data. If you add <input type="file">, also add enctype="multipart/form-data" to the form tag — otherwise the file silently doesn't upload.
style="display:none" is what splitforms uses, but some sophisticated bots ignore display:none. Stack defenses: display:none + tabindex="-1" + aria-hidden="true" + an off-screen label. Splitforms's classifier catches the rest.
Mixed-content errors: if your GitHub Pages site is served over HTTP (rare but possible on custom domains without HTTPS toggled), the browser blocks the POST to https://splitforms.com. Enforce HTTPS in your custom domain settings.
Browsers only treat a button as a submit trigger when it's a descendant of the form element. If your CSS layout requires the submit button to live outside the <form> (e.g. a sticky bar at the page bottom), the form will never submit on click — Enter inside an input still works. Fix it by adding form="contact-form" on the button, matching an id="contact-form" on the form. The HTML5 form-attribute association is widely supported but easy to forget.
Plain HTML has no built-in way to deliver a form submission anywhere — the spec only covers serializing fields and either GETting or POSTing them to whatever URL you put in action. Without a backend, the historical fallback is mailto: links (broken on Gmail, Outlook web, and most mobile devices) or PHP on shared hosts (extinct on S3, GitHub Pages, Cloudflare Pages, Netlify-static). That's the gap splitforms fills: you keep using the same <form action method=POST> HTML you already wrote, and the action points at our endpoint instead of a server you'd otherwise have to operate.
Plain HTML deploys to anywhere that serves files: GitHub Pages, S3 + CloudFront, Cloudflare Pages, Netlify, Vercel, plain Apache/nginx, even Dropbox public folders (RIP). The form posts cross-origin from the browser to splitforms.com, so the host is irrelevant to delivery — but enforce HTTPS on your domain, otherwise the browser blocks the mixed-content POST. On GitHub Pages, toggle 'Enforce HTTPS' under Settings → Pages. On S3, terminate TLS at CloudFront. Lock the splitforms access key to your custom domain in the dashboard so a leaked key from View Source is inert elsewhere.
Simple pricing
Choose a plan that fits your workflow — from a free form endpoint to full automations, exports, and higher submission limits.
Free forever
For side projects and indie devs.
For agencies and growing products.
Pay $59. 3 years sorted.
No credit card required on Free • Cancel anytime