OllieLeads Start free
Form troubleshooting · 7 min read

FormSubmit not working: the common causes and fixes

FormSubmit not working? Fix activation, "Unable to submit form", the method="POST" error, AJAX and spam problems, and get back the submissions you missed.

a close up of a computer screen with a sign on it - computer screen showing form validation error message
Photo: Nong on STOCK_UNSPLASH
On this page
  1. Key takeaways
  2. Quick checklist
  3. No emails at all: activate the form
  4. "Unable to submit form"
  5. "Make sure your form has the method="POST" attribute"
  6. Blank emails or missing fields
  7. Emails stopped arriving
  8. JavaScript (AJAX) submissions fail
  9. reCAPTCHA, auto-replies and file uploads
  10. FormSubmit hidden fields reference
  11. Get back submissions you missed
  12. How OllieLeads handles these failures, and how to move
  13. FAQ

When FormSubmit isn't working, the cause is usually one of four things: the form hasn't been activated, the page was opened as a local file, a field has no name, or _next isn't a full URL. Check those first; FormSubmit's own help pages cover each one. If you simply hadn't activated yet, your leads aren't lost: FormSubmit holds submissions until you confirm the form and keeps them for 30 days (FormSubmit help, checked October 2026).

Key takeaways

  • FormSubmit forwards nothing until you click the activation link it emails to the address in your action; until then, every submission sends another activation email.
  • "Unable to submit form" means the page was opened as a file: serve it from a local web server, or add a hidden _url field with the page's address.
  • "Make sure your form has the method="POST" attribute" usually means _next isn't a full URL starting with https://.
  • For JavaScript submissions, post JSON to https://formsubmit.co/ajax/ followed by your address; the normal URL answers with an HTML page, not JSON.
  • FormSubmit keeps submissions for 30 days, and you can fetch them through its API with a key it emails you.

Quick checklist

  1. Find the activation email from FormSubmit (check spam) and click the link.
  2. Read the action on your form: it should be https://formsubmit.co/ followed by the exact address you check, or the random string FormSubmit sent you after activation.
  3. Check that the form has method="POST".
  4. Give every field a name.
  5. Make _next, if you use it, a full URL with https://.
  6. Open the page through a web server, not as a file.
  7. Leave the _honey field empty and hidden.
  8. For JavaScript submissions, use the /ajax/ endpoint with JSON headers.
  9. Open your browser's developer tools, go to the Network tab, submit, and read what came back from formsubmit.co.

No emails at all: activate the form

The first time a form posts to https://formsubmit.co/your@email.com, FormSubmit emails that address asking you to confirm. Until you click the link, it holds submissions and sends a new activation email with each one. Once you confirm, the held submissions are delivered, as long as they are less than 30 days old.

If the activation email never comes, FormSubmit's help says to check that your mail server receives email from other addresses, check spam, then submit the form again. A one-letter typo in the address in action sends the activation somewhere you will never see it. If you change the address later, you have to activate the form again with the new one.

After you confirm, FormSubmit sends you a random string. Use it in action instead of your address, so bots and visitors can't read your email from the page (FormSubmit documentation).

"Unable to submit form"

FormSubmit doesn't work on a page you opened directly as an HTML file, the kind whose address starts with file://. Serve the folder with any local web server instead:

npx serve .
# or
python3 -m http.server 8080

Then open the address it prints (for the Python one, http://localhost:8080). The other fix from FormSubmit's help is a hidden field with the page's real address:

<input type="hidden" name="_url" value="https://example.com/contact">

"Make sure your form has the method="POST" attribute"

First check the form tag says method="POST". If it does, FormSubmit's help says the usual cause is a _next value that isn't a full URL with its protocol, such as /thanks or example.com/thanks. Write it out in full:

<input type="hidden" name="_next" value="https://example.com/thanks">

You can add query parameters to that URL if your thank-you page needs them.

Blank emails or missing fields

FormSubmit only sends fields that have a name. An input written as <input type="email"> arrives empty; <input type="email" name="email"> arrives. Reserved names such as _next, _subject and _cc are settings, so don't use them for your own fields.

Emails stopped arriving

Look in spam first. FormSubmit's help notes its emails can land there, especially when you get a lot of them; mark them as not spam if your provider lets you. Then check two fields that drop submissions without an error:

  • _honey is a honeypot. If it has any value, FormSubmit silently ignores the submission, so hide it with CSS and give it no value.
  • _blacklist filters out submissions that contain any of its phrases. A phrase that is too broad also blocks real messages. FormSubmit suggests 20 phrases at most.

If FormSubmit's emails arrive but your own mail setup is the problem, our guide to a contact form not sending email covers the wider causes.

JavaScript (AJAX) submissions fail

The most common mistake is posting with fetch to the normal URL. That one answers with a web page meant for the browser, so response.json() throws an error like "Unexpected token '<'". FormSubmit's AJAX documentation uses a separate endpoint with JSON headers (FormSubmit AJAX documentation). Here is its example, wired to a form:

const form = document.querySelector('#contact');

form.addEventListener('submit', async (event) => {
  event.preventDefault();
  const res = await fetch('https://formsubmit.co/ajax/your@email.com', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Accept': 'application/json'
    },
    body: JSON.stringify(Object.fromEntries(new FormData(form)))
  });
  console.log(await res.json());
});

Object.fromEntries keeps only the last value of a repeated name, so collect checkbox groups yourself if you have them. The address still needs activating. And _autoresponse doesn't work with AJAX submissions.

The same applies to React and Next.js: if your form library calls preventDefault(), the browser never posts the form, so send it with fetch as above.

reCAPTCHA, auto-replies and file uploads

  • reCAPTCHA is on for every form by default. <input type="hidden" name="_captcha" value="false"> turns it off, though FormSubmit recommends keeping it on.
  • Auto-replies (_autoresponse) need an input named email, and don't work with reCAPTCHA turned off or with AJAX.
  • File uploads need enctype="multipart/form-data" on the form, and all files together must stay under 10 MB. FormSubmit doesn't keep uploaded files.
  • The email shows the wrong page address. Stricter browser referrer policies hide the path; add the hidden _url field with the page's full address.

FormSubmit hidden fields reference

FieldWhat it doesGet it right
_nextYour own thank-you pageFull URL with https://
_subjectEmail subject linePlain text
_ccCopies to other addressesSeparate addresses with commas
_captchareCAPTCHA, on by defaultfalse turns it off
_honeyHoneypotHidden and empty; any value drops the submission
_templateEmail layoutbasic (default), table or box
_autoresponseCopy to the visitor with your messageNeeds a field named email; no AJAX
_blacklistDrops submissions with these phrasesComma-separated, 20 at most
_webhookCalls your URL on each submissionA URL you control
_urlThe form's page addressFull URL of the page

Source: FormSubmit documentation and email templates, checked October 2026. To rule fields out, remove them all, test with a bare form, then add them back one at a time.

Get back submissions you missed

FormSubmit keeps submissions for 30 days; uploaded files aren't kept. If you hadn't activated, confirm now and the held submissions are delivered. Otherwise use its API: request a key, which FormSubmit emails to you, then fetch your submissions with it (FormSubmit API documentation):

curl -X GET https://formsubmit.co/api/get-apikey/your@email.com
curl -X GET https://formsubmit.co/api/get-submissions/YOUR_API_KEY

FormSubmit's documentation limits API access to 5 times a day, so save what comes back.

How OllieLeads handles these failures, and how to move

If FormSubmit works for you now, keep it: it is free, with unlimited submissions from unlimited forms and file uploads up to 10 MB. If you'd rather keep a stored copy of every lead and skip these failure modes, here is how OllieLeads, the form backend we make, handles each one:

  • Activation: each form gets an ID (frm_...) from your account, so there is no activation email to miss.
  • Emails in spam: every lead is stored first, and alerts go by email, Slack or Discord within a minute. You can also read leads through the REST API, signed webhooks or the MCP server.
  • Testing locally: localhost on ports 3000, 5173, 4321 and 8080 is test-only automatically, so test leads never count.
  • _next: it redirects only to your own site; anything else is ignored instead of breaking the post.
  • JavaScript: post form data or JSON with Accept: application/json, and errors come back as JSON with the fix, with CORS headers on every reply.
  • Spam: a honeypot field (_hp), origin checks and rate limits; bursts go to "Possible spam" and never count.
  • People who don't finish: with the OllieLeads script, the contact fields of visitors who leave halfway are saved (how that works).

What it doesn't do: file uploads, which FormSubmit handles. Pricing: Free is 500 leads in total with no card; Pro is $29 a month for 1,000 leads a month (OllieLeads pricing, checked October 2026).

To move, change action, rename _honey to _hp, keep _next if it points at your own site, and delete the other FormSubmit fields:

<form method="POST" action="https://ollieleads.com/f/frm_xxxxxxxx">
  <input type="hidden" name="_next" value="https://example.com/thanks">
  <input type="text" name="_hp" style="display:none" tabindex="-1" autocomplete="off">
  <input type="text" name="name">
  <input type="email" name="email" required>
  <textarea name="message"></textarea>
  <button type="submit">Send</button>
</form>

Your site's domain must be in the brand's allowed sites, since browser posts are only accepted from there. Comparing other options? See our guide to form backends for static sites.

FAQ

Why am I not getting emails from FormSubmit?

Usually the form hasn't been activated: find FormSubmit's confirmation email, check spam, and click the link. If it was activated, check spam for the submissions themselves, confirm the address in action is spelled right, and make sure the _honey field is empty.

Why does FormSubmit say "Unable to submit form"?

The page was opened as a local file. Serve it from a web server, even a local one such as python3 -m http.server, or add a hidden _url field with the page's address.

Does FormSubmit work on localhost?

Yes, when a local web server serves the page and the address starts with http://localhost. It doesn't work on a page opened straight from your file system.

Is FormSubmit free?

Yes. Its site says setup is free, and its documentation says you can have unlimited submissions from unlimited forms. Submissions are kept for 30 days (checked October 2026).

How do I see FormSubmit submissions I missed?

If you never activated, confirm the form and held submissions from the last 30 days are delivered. Otherwise request an API key and call https://formsubmit.co/api/get-submissions/ with it; API access is limited to 5 times a day.

Published with SuperDuperSEO

This post as Markdown, for your coding agent or AI assistant.