splitforms.com

Contact form · HTML

Contact form for any HTML website

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.

  • 500 free total
  • One endpoint
  • No backend code
HTML contact form — copy-paste code for splitforms

No backend code

No server, API route, or SDK. Your HTML form posts straight to one endpoint.

Straight to your inbox

Every submission is emailed to you and saved to a searchable dashboard — spam filtered before it reaches you.

Design without limits

It's your own HTML markup and styles. Splitforms is only the backend, so nothing constrains how the form looks.

Copy-paste ready

Your HTML contact form, ready to paste.

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.

Generate access key
contact.html
<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

How to add a contact form to a HTML website.

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.

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.

Drop the HTML snippet into your project

Copy the HTML code example into your project and replace YOUR_ACCESS_KEY with the key from step 1.

Receive submissions in your dashboard

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

Where do your HTML form 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.

  • 500 submissions total, free to start
  • Honeypot + automatic spam scoring on every plan
  • Signed webhooks to Slack, Discord, your server
HTML contact form submissions in the splitforms dashboard

No backend needed

Do you need a backend for a HTML form? No.

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.

  • Zero JavaScript required — pure HTML form
  • Built-in honeypot spam protection
  • Dashboard-configured redirect to a thank-you page
How splitforms processes a HTML form submission

Best practices

What a production-ready HTML form needs.

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

  • Always set method="POST" explicitly. The HTML default is GET, which won't work with splitforms.
  • Configure a /thanks.html redirect in Dashboard → Form settings so users without JavaScript still get a branded confirmation page.
  • Lock the access key to your domain in the splitforms dashboard. The key lives in your HTML source — anyone can copy it, but domain locking makes it inert elsewhere.
Production-ready HTML contact form best practices

How SplitForms works

What happens after someone submits your form?

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.

A SplitForms contact form submission launching straight to your inbox

Add your endpoint

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

HTML form pointing at a SplitForms submit endpoint

Receive submissions

We instantly capture and organize every submission in your inbox.

Submissions inbox with searchable leads and status pills

Route anywhere

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

Generic integration tiles for email, sheets, chat, CRM, automate, and webhook

No credit card required. Set up in under 60 seconds.

Connect & automate

Where can submissions go besides email?

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.

Connect your SplitForms form to Slack, Google Sheets, Mailchimp, Zapier and more
NewTake payments on your formsDeposits, bookings, order forms — submitters check out through Stripe and the money goes straight to your Stripe account. Included on every paid plan.See plans →

Setup guides for the stacks you use

Questions

HTML contact form questions.

View all FAQs
How do I add a contact form to a plain HTML website?

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.

Does splitforms work with GitHub Pages, S3, Cloudflare Pages, and other static hosts?

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.

How do I handle form errors with pure HTML (no JavaScript)?

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.

Can I use splitforms with HTML forms that have file uploads?

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.

How do I customize the success / redirect behavior?

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.

Is the form really spam-protected without a CAPTCHA?

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.

method="GET" turns your form into a URL query string

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.

Multiple inputs with the same `name` only send the last value

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.

File inputs require enctype="multipart/form-data"

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.

Hidden honeypot field needs to be invisible to bots' DOM parsers

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.

GitHub Pages can't post to https without HTTPS on your domain

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.

<button> outside the <form> tag does nothing on submit

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.

How does HTML handle forms without splitforms?

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.

Any deployment notes for shipping HTML to production?

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

How much does splitforms cost?

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.

Free

$0— 500 submissions
 

No card, no time limit

Best for testing

For side projects and indie devs.

  • 500 free submissions
  • Unlimited forms
  • Email notifications included
  • Smart spam filtering
  • Submissions dashboard
  • Redirect after submit
  • MCP server included

Annual

$49/ year
About $4.08/mo, billed yearly
Best value

Every Pro feature with triple the volume — $0.27 per 1,000 at full use.

  • 15,000 submissions / mo
  • Unlimited forms
  • Everything in Pro
  • File uploads with 5 GB storage
  • 3 team seats
  • Priority email support

No credit card required on Free • Cancel anytime • Full pricing and FAQ