Free tool
Check your HTML form for the things that silently break it
A form can be perfectly valid HTML and still deliver nothing. An input with no name is dropped without a word; a file input without the multipart encoding sends the filename and not the file; a placeholder action posts into the void. Paste your markup and see which of those is happening.
Runs entirely in your browser. Nothing is uploaded, logged or stored.
How it works
- Paste your form's HTML. Copy the <form> element from your page — or the whole page, it will find the form. Everything runs in your browser; the markup is never uploaded.
- Read the problems in order. Findings are grouped: what will break the submission outright, what is worth fixing, and what would simply be better. Each one names the line and the fix.
- Check what the server will actually receive. The summary lists the field names that get sent, where the form posts, and any control that is silently dropped because it has no name attribute.
- Fix and re-check. Paste the corrected markup back in. A form with nothing left to report is one that will deliver.
What it looks for
Every rule corresponds to a failure that is hard to spot by reading the page, because the form looks right and the browser reports nothing.
Breaks the submission
- A control with no
name— silently dropped. If none of them have one, the submission arrives empty. - A file input without
enctype="multipart/form-data". - A missing or
GETmethod, which puts the data in the URL. - An
actionthat is empty or still a placeholder. - Two controls sharing a name, so one overwrites the other.
- A control left outside the
<form>. - No submit button.
Worth fixing
- A control with no label, which a screen reader announces as unnamed.
- Placeholder text standing in for a label.
- A field named
emailorphonetyped astext, losing validation and the right mobile keyboard. - No honeypot field, the cheapest spam filter there is. See stopping spam without a CAPTCHA.
novalidate, which turns off browser validation entirely.
Could be better
- A missing
autocompletevalue on a name, email or phone field. - A
<button>with notype, which defaults to submitting. - A file input with no
acceptto narrow the picker.
What it cannot tell you
It reads markup, so it only knows what the markup says. It cannot send a test submission to your endpoint, see whether your backend is up, or know that a field is required by your business rules. It is not a full accessibility audit either — contrast, focus order and reading order all depend on the rendered page.
It also cannot see anything your JavaScript builds at runtime. If your form is a React or Vue component, copy the rendered HTML out of your browser's inspector rather than the component source.
Starting from scratch instead of fixing an existing form? The contact form generator emits markup that passes every rule here. For the background on what receives a submission, see what a form backend does.
Frequently asked questions
- Why does my HTML form submit but arrive empty?
- Almost always because the inputs have no name attribute. A browser only sends fields that have one, so a form can look complete, submit without error, and deliver nothing — the receiving end sees an empty submission. This checker lists every control missing a name, which is the first thing to rule out.
- Why does my form's file upload never arrive?
- Because the <form> tag is missing enctype="multipart/form-data". Without it the browser sends the file's name as a text value and never its contents. Nothing errors, so it looks like the upload worked. The checker flags any file input whose form lacks the encoding.
- Is my markup uploaded anywhere?
- No. The whole check runs in your browser — there is no request, nothing is logged and nothing is stored. We record only which rules fired, never your markup, so we can see which mistakes are most common.
- Does this check accessibility?
- In part. It flags controls with no label (counting <label for>, a wrapping label, aria-label and aria-labelledby), placeholder text used in place of a label, and inputs typed as text when a stronger type would give the right mobile keyboard. It is not a full WCAG audit: it says nothing about colour contrast, focus order or anything that depends on how the page is rendered.
- Will it tell me if my form endpoint is actually working?
- It can tell you the form has nowhere to post — no action, or a placeholder like YOUR_FORM_ID still in place, which is a common reason a finished-looking form delivers nothing. It cannot send a test submission to your endpoint, because that would mean posting to a third-party URL on your behalf. Use your backend's own test delivery for that.
- Does it work with React, Vue or Svelte components?
- Partly. It reads HTML attributes, so JSX usually parses well enough to catch missing names and a missing enctype, but className and expressions in braces are not understood, and anything built from a loop or a variable is invisible to it. For component code, check the rendered HTML from your browser's inspector instead.
- Is it free?
- Yes, and there is no signup. You only create a free ShipMyForm account if you want an endpoint for the form to post to — 250 submissions a month, no credit card.