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 owner email notification attempts. 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="[email protected]" 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 owner email notification attempts; 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 its spam checks, 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
splitforms receives the submission, filters spam, saves it to your dashboard and emails you — then, on paid plans, sends it on to your webhooks and integrations. No backend infrastructure to build.

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
On paid plans, submissions can also go to Slack, Discord, Google Sheets, Notion, Airtable, Zapier or any signed webhook — and splitforms works on the platforms you build on, from WordPress and Shopify to Next.js. With Stripe connected, your forms can take payments too.

Questions
Paste the snippet above into your HTML file. Replace YOUR_ACCESS_KEY with the key from your splitforms dashboard. Accepted submissions are saved to the dashboard before owner notification email is attempted; delivery time and inbox placement depend on provider and recipient settings. No JavaScript, build step, or 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.
Add <input type="hidden" name="redirect" value="/thanks.html"> to the form — splitforms sends the browser there after a successful native submission, on every plan including Free. Prefer one fixed destination instead? Set the URL in Dashboard → Form settings → After submit, which also works on every plan; the hidden field wins when both are present. Either way, the /thanks.html page is yours — build it however you like.
Yes. The hidden honeypot field catches naive bots; a rule-based filter scores everything else (links, spam phrases, disposable emails, gibberish) and quarantines anything that looks automated to a Spam tab you can review. There's no CAPTCHA by default, so visitors never solve a puzzle. If you ever need stricter protection, add Cloudflare Turnstile or reCAPTCHA v2 and save its secret key in the form's settings — splitforms verifies the token server-side on every plan.
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' rule-based content filter catches much of 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
Free gives you 500 submissions for $0 — no card, no time limit. Pro is $5/month for 5,000 submissions a month, and Annual is $49/year for 15,000 a month with every Pro feature.
For side projects and indie devs.
Every paid feature, for agencies and growing products.
Every Pro feature with triple the volume — $0.27 per 1,000 at full use.
No credit card required on Free • Cancel anytime • Full pricing and FAQ