splitforms.com
← Back to the journal

Netlify Form Not Working? 7 Fixes for Missing Submissions

Netlify form not showing submissions or returning 404? Check the 7 causes, from missing data-netlify and form-name to JS frameworks and spam filtering.

Start free — 500 submissionsSee pricing →No card, no time limit. Pro is $5 per month.
Short answer
Netlify Forms are detected at deploy time by parsing your static HTML. If the form is rendered by JavaScript, or the data-netlify attribute or hidden form-name input is missing, Netlify never registers it and submissions vanish or 404. Run the checklist below, then apply the seven fixes in order.
Try it on your own form

Point any HTML form at one endpoint. 500 free submissions — no card, no time limit — and unlimited forms.

Create free account

Why Netlify Forms break

Netlify Forms are not a runtime service that watches your page. At deploy time, Netlify parses the static HTML of every page and looks for a <form data-netlify="true"> tag (or the older netlify attribute). Each form it finds is registered, and Netlify expects a hidden form-name input inside it so submissions can be routed.

That single design decision explains almost every "Netlify form not working" report:

  • If the form is rendered client-side by React, Next.js, Vue, or any JS framework, the deploy-time parser sees an empty shell and the form is never registered.
  • If the data-netlify attribute is missing, the parser skips the form even though the HTML is static.
  • If form detection is switched off in Site configuration, Netlify stops parsing new forms entirely.
  • If you pass the free plan's 100 submissions per month, extra entries are dropped silently.

The form usually "works" in your local preview because your browser runs the JavaScript. The deploy-time parser does not, which is why the preview-versus-live gap is the most common Netlify Forms failure.

Quick checklist

  1. The form tag has data-netlify="true" (or the legacy netlify attribute).
  2. The form contains a hidden <input type="hidden" name="form-name" value="..."> in the static HTML.
  3. Form detection is on under Site configuration → Forms.
  4. The form appears in the Netlify dashboard after a fresh deploy.
  5. You are under the free plan's 100 submissions per month limit.
  6. Submissions are checked in both the All and the Spam tabs.

Seven fixes, in order

1. Add the data-netlify attribute (or the legacy netlify attribute)

Without this attribute, Netlify's deploy-time parser ignores the form completely, even if the HTML is fully static. Add it to the form tag:

<form name="contact" data-netlify="true">
  <input type="hidden" name="form-name" value="contact" />
  <input name="name" type="text" />
  <input name="email" type="email" />
  <button type="submit">Send</button>
</form>

The netlify attribute (no value) is the older spelling and still works; data-netlify="true" is the current one. Use one, not both.

2. Add a static HTML copy of JavaScript-rendered forms

In React, Next.js, Vue, and similar frameworks the whole form is often rendered in the browser, so the hidden form-name input never exists in the static HTML Netlify parses at deploy time. The fix is to render a static copy of the form (server-side rendering or static generation) that includes the hidden input:

<input type="hidden" name="form-name" value="contact" />

If your framework cannot emit the form server-side, write a plain HTML version of the same form and ship that. The HTML form not submitting guide covers the markup-level checks that apply to the static copy.

3. Turn form detection back on in Site configuration → Forms

Site configuration → Forms has a form-detection toggle. If it is off, Netlify stops parsing new forms from your deploy, and any form added after the switch was flipped is invisible. Turn it back on, then redeploy so the parser runs again over your current HTML.

4. Make AJAX submissions POST url-encoded data to /

If you submit the form with fetch instead of a native form post, Netlify only accepts url-encoded data, and the request must go to the root path / of your site and include the form-name field:

fetch("/", {
  method: "POST",
  headers: { "Content-Type": "application/x-www-form-urlencoded" },
  body: new URLSearchParams({
    "form-name": "contact",
    name: "Ada",
    email: "ada@example.com",
  }).toString(),
});

Posting JSON, or posting to a sub-path, is rejected. If you later point the form at an external endpoint on a different origin, the endpoint must allow your origin in its CORS headers — the CORS form submission fix walks through that case.

5. Fix a 404 after submit or a wrong action path

A 404 after submit means the form was never registered, or its action points at a path that does not exist. Leave the action empty (or set it to /) so the form posts to the current page, and confirm the form is registered in the Netlify dashboard after a fresh deploy. The contact form not working guide covers the same 404 diagnosis for any host.

6. Check the Spam tab, the honeypot, and reCAPTCHA

Submissions that look like bots land in the Spam tab of the Netlify dashboard, not the All tab. If you use a honeypot field (netlify-honeypot) or reCAPTCHA, a misconfigured field can block real visitors and route them to Spam. Open the Spam tab, read the entries, and review your spam-filtering settings before assuming the submissions were lost.

7. Pass the free plan's 100 submissions per month — use an external endpoint

The Netlify free plan includes 100 form submissions per month. Once you pass it, extra submissions are dropped. You can upgrade the Netlify plan, or point the form at an external form endpoint that works on any host. With splitforms, the form POSTs to https://splitforms.com/api/submit with a hidden access key: every accepted entry is stored in a searchable dashboard, spam is filtered automatically, and the owner notification email is sent from managed infrastructure. It is free for 500 submissions total. See adding a contact form to a Netlify site, the free contact form page, and the static site contact form guide for the snippet, and the Netlify Forms alternative page for a full comparison.

Other form problems and fixes

Still stuck? Test your endpoint with our free Form Action Tester or contact splitforms support.

FAQ

Why does my Netlify form work in preview but not after deploy?

Netlify detects forms at deploy time by parsing the static HTML it receives. If your form is rendered client-side by React, Next.js, Vue, or any other JS framework, the deploy-time parser sees an empty shell and never registers the form, so submissions have nowhere to go. Render a static HTML copy of the form that includes the hidden form-name input, redeploy, and confirm the form appears in the Netlify dashboard. See the preview-versus-live guide for the same failure pattern on other hosts.

Why do Netlify form submissions return a 404?

A 404 after submit means the form was never registered with Netlify, or its action points at a path that does not exist. The usual causes are a missing data-netlify attribute, form detection switched off in Site configuration, or a JavaScript-only render the deploy parser missed. Add the data-netlify attribute, leave the action empty so the form posts to the current page, turn form detection back on, and redeploy. The general contact-form-not-working guide covers the same diagnosis for any host.

Where are my Netlify form submissions?

Check both the All and the Spam tabs in the Netlify dashboard, not just All. A honeypot field or a reCAPTCHA setting can route real submissions into Spam, and the free plan's 100 submissions per month limit silently drops entries once you pass it. Open the dashboard, look at the Spam tab, review your spam filtering settings, and confirm you are under the monthly limit.

Can I use a Netlify form without the 100 submissions per month limit?

Yes. Point the form at an external form endpoint instead of Netlify's own. With splitforms, the form POSTs to https://splitforms.com/api/submit, every accepted entry is stored in a searchable dashboard, spam is filtered automatically, and the owner notification email is sent from managed infrastructure. It works on any host, including Netlify, and is free for 500 submissions total. See the Netlify forms alternative page and the free contact form page for the snippet.

Stop losing submissions to deploy-time parsing — point your form at https://splitforms.com/api/submit and every lead is stored, filtered, and emailed. Get a free access key.

Related: Netlify contact form without Netlify Forms or Functions, the Netlify contact form guide, and the free contact form.

Related articles

More practical guidance from guides.

Browse the journal →
Guides

WPForms Not Sending Email? 6 Fixes That Work (2026)

WPForms notifications not arriving? Find the wp_mail cause in 2 minutes, then fix it with si…

7 min readRead →
Guides

Ninja Forms Not Sending Email? 8 Fixes for WordPress

Ninja Forms notifications not arriving? Learn why wp_mail fails, how to check email actions…

7 min readRead →
Guides

Webflow Form Not Working? 8 Fixes That Actually Work

Webflow form not submitting or no email arriving? Work through 8 checks, from publishing and…

8 min readRead →

Explore this topic

Start with the overview, then move into focused guides.

OverviewWhat Is a Form Backend? (Complete Guide)Start here →GuideSelf-Hosted vs SaaS Form BackendRead →GuideForm Backend vs Form BuilderRead →GuideWhere Do Form Submissions Go?Read →ReferenceForm backend guideOpen →

Building forms with ChatGPT, Claude, Cursor, or v0? Connect the native MCP server and give your agent a production form backend.

Explore the MCP server →

Give your form a production backend.

One endpoint adds delivery, spam filtering, storage, and integrations. Start with 500 free submissions — no card, no time limit.

Create free accountRead the docs →
Secure checkoutSSL encryptionPrivacyProtected
VISAAMERICANEXPRESSstripe