# Fields and validation

How Nisuform checks each submission against your form's fields, what every field type accepts, and what happens to answers that don't match.

When a form has fields in the [form builder](/docs/forms/builder), every submission is checked against them. Templates come with fields. Forms created as **Blank form** or **Endpoint only** have none until you add them.

## Nothing is ever lost

Validation never rejects a submission. A submission that fails a check is stored like any other, so you never lose a lead, and the inbox marks it with **Some answers didn't pass validation** and shows the problem next to each answer, like "not a valid email" or "missing".

Your own markup should still validate in the browser, with `required`, `type="email"` and similar attributes, so visitors can fix mistakes before they send. The styled embed does this for you.

Fields that your form sends but the builder doesn't list are kept as they are, so a hand-written form with extra inputs works fine.

## What each type accepts

| Type            | HTML `name` gets              | Checked                                                                                                       |
| --------------- | ----------------------------- | ------------------------------------------------------------------------------------------------------------- |
| Short text      | Any text                      | Longer than the **Character limit**: cut to the limit and marked too long.                                    |
| Email           | An email address              | Must look like `name@example.com`.                                                                            |
| Long text       | Any text                      | Longer than the **Character limit**: cut to the limit and marked too long.                                    |
| Number          | A number                      | Must be a number, and within **Minimum** and **Maximum** when set. Saved in plain form, so `007` becomes `7`. |
| Date            | A date                        | Must be a readable date, like `2026-09-24` from `<input type="date">`.                                        |
| Dropdown        | One option                    | Must match one of the options exactly, including capitals.                                                    |
| Multiple choice | One option                    | Must match one of the options exactly, including capitals.                                                    |
| Checkbox        | `yes` when checked            | Any value counts as checked.                                                                                  |
| Star rating     | `1` up to the number of stars | Must be a whole number from 1 to the number of stars.                                                         |
| Phone           | A phone number                | Digits, spaces and `+ ( ) . - /`, with at least 3 digits.                                                     |
| Website         | A URL                         | Must be a full `http://` or `https://` URL. `example.com` alone is not accepted.                              |
| File upload     | A file                        | Only checked for **Required**. See [File uploads](/docs/connect/file-uploads).                                |

An empty answer to an optional field passes. An empty answer to a **Required** field is marked missing.

## Checkboxes

A **Checkbox** field is a single box, like "I agree to the terms". Give the input `value="yes"` so answers read clearly in your inbox and count as checked in [analytics](/docs/submissions/analytics). The embed does this for you.

```html
<label>
  <input type="checkbox" name="terms" value="yes" required>
  I agree to the terms
</label>
```

The builder has no field type for picking several options. To let people pick more than one, use a group of checkboxes that share a name in your own markup, and don't add a builder field with that name. The choices are saved as one comma-separated answer. See [Multiple values](/docs/connect/html#multiple-values).

## Field names

Answers are saved under the field's **Field name**, which is also the `name` attribute in your HTML.

* Must start with a letter and use only letters, digits, `-` and `_`.
* Up to 64 characters, and each name only once per form.
* Can't be `cf-turnstile-response`, `g-recaptcha-response` or `h-captcha-response`.

Renaming a field doesn't move old answers. Earlier submissions keep the old name, and new ones use the new name.

## Labels

The inbox, notification emails and integrations show each field's **Label** instead of its name, like "Your rating" instead of `rating`. Fields the builder doesn't list are shown by their name.
