# FormSubmit not working: the common causes and fixes

_By Luka Brzin, Senior Product Marketing Manager_

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](https://formsubmit.co/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](https://formsubmit.co/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](/blog/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](https://formsubmit.co/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

Field

What it does

Get it right

`_next`

Your own thank-you page

Full URL with `https://`

`_subject`

Email subject line

Plain text

`_cc`

Copies to other addresses

Separate addresses with commas

`_captcha`

reCAPTCHA, on by default

`false` turns it off

`_honey`

Honeypot

Hidden and empty; any value drops the submission

`_template`

Email layout

`basic` (default), `table` or `box`

`_autoresponse`

Copy to the visitor with your message

Needs a field named `email`; no AJAX

`_blacklist`

Drops submissions with these phrases

Comma-separated, 20 at most

`_webhook`

Calls your URL on each submission

A URL you control

`_url`

The form's page address

Full URL of the page

Source: [FormSubmit documentation](https://formsubmit.co/documentation) and [email templates](https://formsubmit.co/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](https://formsubmit.co/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](/features/partial-submissions)).

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](/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](/guides/form-backend-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](https://superduperseo.com/published-by)
