splitforms.com
All articles/ TUTORIALS7 MIN READPublished May 15, 2026

Netlify Contact Form Without Netlify Forms or Functions (2026)

Add a contact form to a Netlify-hosted site without using Netlify Forms (capped at 100/mo free) or Netlify Functions (paid plan after 125k requests). Free 1,000/mo via splitforms.

✶ Written by
splitforms.com / blog

Founder of splitforms — the form backend API for developers. Writes about form UX, anti-spam, and shipping web apps without backend code.

Why not just use Netlify Forms?

Netlify Forms ships with every Netlify-hosted site. Add data-netlify="true"to a form, deploy, and Netlify intercepts the POST during build to wire it through their backend. Zero configuration, zero JavaScript. For a personal site getting ten contact-form submissions a month, that's a legitimate solution.

The trade-offs start when the site actually gets traffic:

  • 100 submissions/month free. Above that, you pay $19/month per 1,000 submissions, billed separately from your Netlify plan. splitforms is 1,000 free, then $5/month for 5,000.
  • Host lock-in. Your forms only work while the site is on Netlify. Moving to Vercel, Cloudflare Pages, or your own infra means rewriting form handling.
  • Thin spam tooling.Akismet runs server-side; recognized spam goes to a folder you can't train or query. splitforms's AI classifier gives you per-submission spam scores and a separate searchable spam folder.
  • No submission re-delivery. If a webhook fails or you miss an email, the submission is gone from your workflow. splitforms ships signed webhooks with retries and a dead-letter view in the dashboard so you can replay any submission.
  • No HMAC-signed payloads. Webhook signature verification is on you. splitforms signs every webhook with HMAC-SHA256 so you can verify authenticity in 5 lines of server code.

For a production contact form — especially on a small-business or SaaS site where missing a lead has real cost — the external backend wins on every dimension except "tied to Netlify", which isn't a feature.

The complete migration, in one snippet

Open your existing Netlify Forms-wired contact form. It probably looks like this:

<!-- BEFORE — Netlify Forms wiring -->
<form name="contact" method="POST" data-netlify="true" netlify-honeypot="bot-field">
  <input type="hidden" name="form-name" value="contact" />
  <p hidden><label>Don't fill: <input name="bot-field" /></label></p>
  <p><label>Name <input name="name" required /></label></p>
  <p><label>Email <input name="email" type="email" required /></label></p>
  <p><label>Message <textarea name="message" required></textarea></label></p>
  <p><button type="submit">Send</button></p>
</form>

Replace it with the splitforms version:

<!-- AFTER — splitforms wiring -->
<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://yoursite.netlify.app/thanks" />

  <label>Name<input name="name" required /></label>
  <label>Email<input name="email" type="email" required /></label>
  <label>Message<textarea name="message" required></textarea></label>

  <!-- Honeypot — splitforms recognizes 'botcheck' as a spam trap -->
  <input type="checkbox" name="botcheck" style="display:none" tabindex="-1" />

  <button type="submit">Send</button>
</form>

The notable removals: data-netlify="true", netlify-honeypot="bot-field", and the hidden form-nameinput. Those are Netlify Forms-specific attributes; leaving them in while pointing at splitforms creates confusing double-handling at build time (Netlify still tries to register the form even though it'll never receive submissions).

Get your splitforms access key

Sign up at splitforms.com with your email. Your access key is created instantly and is visible in the dashboard. Paste it into the hidden access_key input on your contact form. The free tier covers 1,000 submissions per month, unlimited forms, no credit card.

Custom thank-you page

By default, splitforms shows a generic thank-you page after a successful submission. To send visitors to your own page, add a redirect hidden input:

<input type="hidden" name="redirect" value="https://yoursite.netlify.app/thanks" />

On a Netlify-hosted Astro / Eleventy / Hugo site, create the thanks.html (or thanks/index.html) page and Netlify serves it natively. No build-step changes needed.

Inline success without a page reload

The native form submission shows the thank-you page on a new navigation. For inline success states (no page reload), intercept the submit event with JavaScript:

<form id="contact">
  <input type="hidden" name="access_key" value="YOUR_ACCESS_KEY" />
  <input name="name" required />
  <input name="email" type="email" required />
  <textarea name="message" required></textarea>
  <input type="checkbox" name="botcheck" style="display:none" tabindex="-1" />
  <button type="submit">Send</button>
</form>
<p id="status"></p>

<script>
const form = document.getElementById("contact");
const status = document.getElementById("status");
form.addEventListener("submit", async (e) => {
  e.preventDefault();
  status.textContent = "Sending…";
  try {
    const res = await fetch("https://splitforms.com/api/submit", {
      method: "POST",
      body: new FormData(form),
    });
    const data = await res.json();
    status.textContent = data.success ? "Thanks!" : (data.message || "Error.");
    if (data.success) form.reset();
  } catch {
    status.textContent = "Network error.";
  }
});
</script>

Works in any Netlify-hosted site, no Functions, no SSR adapter. See the AJAX guide for the four-state UI version.

Testing on a Netlify deploy preview

Push the migration to a branch and let Netlify build the deploy preview. Submit a test entry from the preview URL — the email arrives in your inbox within seconds and the submission appears in the splitforms dashboard. If you see the submission, the wiring is correct.

If the form doesn't submit at all, the most common cause is stale Netlify Forms wiring (a hidden form-name input or data-netlify="true" still in the markup). Strip them all and redeploy.

When Netlify Forms is still the right call

Two cases. (1) Strictly personal sites where 100 submissions/month will always be enough and you're not migrating away from Netlify. (2) Compliance contexts where the data must stay inside Netlify's infrastructure for procurement or audit reasons. Outside those, splitforms is the better trade.

See also

FAQ

What's wrong with Netlify Forms?
Nothing inherently — it's a fine option for low-volume sites that stay on Netlify forever. The trade-offs are: (1) 100 submissions/month free cap (vs splitforms's 1,000), (2) tied to Netlify hosting (lock-in), (3) limited spam tooling — recognized spam goes into a 'spam' folder you can't train, (4) no submission re-delivery (if a webhook fails, you can't replay), (5) no signed webhooks (HMAC verification is on you). For most production sites, an external form backend is the better fit.
Do I need to remove data-netlify="true" to use splitforms?
Yes. The data-netlify="true" attribute (and the <input type="hidden" name="form-name"> companion) tell Netlify's build pipeline to route the form through Netlify Forms. If you leave them in while pointing the action at splitforms, you'll get confusing double-handling. Strip both, set action="https://splitforms.com/api/submit", add the splitforms access_key hidden input, and you're done.
Will my site still work if I switch from Netlify Forms to splitforms?
Yes. The form HTML is the same shape — name/email/message inputs, a submit button. Only the action URL and the access_key field change. Visitors won't notice; you'll get the submissions via email and the splitforms dashboard instead of the Netlify dashboard. Existing inbound links to your contact page keep working.
Can I keep using Netlify Forms for some forms and splitforms for others?
Yes, but it's confusing to maintain. Pick one backend per form and stick with it. The pragmatic move is to migrate every form to splitforms — same backend, same dashboard, same webhooks for all of them. The Netlify Forms free tier doesn't help you if you've split workload across services.
Does this require a Netlify Function?
No. The form POSTs directly from the static page to splitforms.com — no Netlify Function in between. You save your Netlify Functions quota (125k requests/month on free) for things that actually need server-side code.
What about Netlify's built-in spam filtering (Akismet)?
Netlify Forms routes submissions through Akismet. splitforms uses an AI spam classifier on top of honeypot detection — different approach, broadly similar accuracy, with the advantage that you can train the splitforms classifier on your own data over time. Both work well; the splitforms model has better visibility into why a submission was flagged.
About the author
✻ ✻ ✻

Get your free contact form API key in 60 seconds.

1,000 free form submissions per month. No credit card. No SDK, no PHP, no plugin. Drop one POST endpoint in your form and submissions land in your inbox.

Generate access key →Read the docs
v0.1 · founders pricing locked in · early access open