Create a free access key
Sign up and create a form in the splitforms dashboard — no credit card required. Every form gets its own access_key on the embed tab.
Contact form backend
Point your form at one endpoint and every submission is filtered for spam, stored, and emailed to you — no PHP, SMTP, or server route.

No PHP, SMTP, or server route — the hosted endpoint is your contact form backend.
A honeypot, time-trap, and rate limits screen bots before they reach your inbox.
Every submission is stored in your dashboard and emailed to you within seconds.
Quick start
Drop this into any page, point the action at the endpoint, and add your access key. That's the whole integration — no server, no build step.
<form action="https://splitforms.com/api/submit" method="POST">
<input type="hidden" name="access_key" value="YOUR_ACCESS_KEY" />
<input type="hidden" name="redirect" value="https://example.com/thanks" />
<input name="name" autocomplete="name" required />
<input name="email" type="email" autocomplete="email" required />
<textarea name="message" required></textarea>
<input type="checkbox" name="botcheck" style="display:none" tabindex="-1" autocomplete="off" />
<input type="hidden" name="form_loaded_at" value="" />
<script>document.currentScript.previousElementSibling.value = Date.now();</script>
<button type="submit">Send message</button>
</form>Setup
No server, no SMTP setup — the same six steps whether you paste the contact form backend into raw HTML, a React component, or a Next.js app. Step six forwards every submission with an HMAC-SHA256 signed request — see the webhooks docs.
Sign up and create a form in the splitforms dashboard — no credit card required. Every form gets its own access_key on the embed tab.
Set the form action to https://splitforms.com/api/submit (or POST JSON from a fetch() call) and include access_key as a hidden field.
Add the botcheck honeypot input, left empty, and a form_loaded_at hidden field set to Date.now() on load. Bot and instant submissions get filtered before they reach you.
Add a redirect field with a thank-you page URL if you want a classic HTML post-submit redirect, or read the JSON response yourself from fetch().
Submit the form once and confirm the message shows up in your inbox and in the dashboard.
On paid plans, forward every submission to a signed webhook or a 1-click integration — Google Sheets, Notion, Airtable, Slack, Discord, Telegram, or Mailchimp.
Backend responsibilities
A contact form only looks simple. The backend behind it has to receive the request, filter spam, keep a copy, and get the message to a human — reliably, on every submission. Those are the same jobs a full form backend service handles for you.

No server needed
Build it yourself and you are writing a PHP mail() script or your own API route plus SMTP credentials, spam filtering, a database, and the server to run it all. A hosted backend replaces every one of those with a single endpoint — you can even run a contact form without a backend of your own.

Spam filtering
Yes — on every plan, including Free. A botcheck honeypot and a form_loaded_at time-trap reject the obvious bots, then server-side heuristics and IP rate limiting (6/min, 20 per 15 minutes) screen the rest before they reach your inbox. Read the full guide to stopping contact form spam.

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.
“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.”
FAQ
It is the 'send' half of your contact form. Your HTML collects the name, email, and message; the backend is what receives that POST, screens it for spam, saves a copy, and delivers it to your inbox. Traditionally you'd build that with PHP mail(), SMTP, or a custom API route. splitforms replaces all of it with one hosted endpoint — add your access_key and the plumbing is handled for you.
No. A hosted backend lets your form submit directly to an HTTPS endpoint. You do not need a PHP mail script, SMTP credentials in your app, or your own server route — the endpoint is the backend.
Yes. The same endpoint works from a native HTML form, a React or Next.js submit handler using fetch(), Webflow custom code, or any static site. See the framework-specific copy-paste examples for HTML, React, and Next.js.
Yes. Every plan, including Free, includes a botcheck honeypot field, a form_loaded_at time-trap that rejects instant bot submissions, server-side content heuristics, and IP rate limiting (6 submissions/min, 20 per 15 minutes). You can also restrict a form to allowed domains or add your own reCAPTCHA v2 key.
Yes. The Free plan includes unlimited forms, 500 submissions/month, owner email notifications, spam filtering, and dashboard storage — no card required. Paid plans start at $5/mo (Pro) for 5,000 submissions and add CSV/XML/PDF exports, webhooks, integrations, and an auto-responder.
Yes. The endpoint accepts an HTML form action, a fetch() call with a JSON body, or multipart/form-data for file uploads — same access_key, same response. See the contact form API page for request/response examples.
Yes. Three hidden fields change delivery behavior without any code: subject sets a custom email subject line, replyto sets the reply-to address to the sender's email, and redirect sends the visitor to a URL after a successful submit.
Two things happen at once. The visitor either lands on your redirect page (if you set a redirect field) or gets the endpoint's JSON success response to handle in your own UI. Behind the scenes, splitforms stores the submission in your dashboard and emails you on every plan — and on paid plans forwards it to an HMAC-SHA256 signed webhook (single attempt, no automatic retries) or a connected integration.
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