Who this is for. The site builder and the editor who build forms in the admin, and the developer who reviews them. Afterwards you can choose the right element for each question, configure it, and know what it stores.
The form builder offers fifteen inputs (Input field, Textarea, Numeric, Email, Phone, Select, Checkbox, Radio, Date/Time, File, Slider, Range, Hidden input, Captcha and Submit button), an element group, two static elements (Richtext and HTML snippet), and a Payment element covered on Taking payments. This page is about choosing between them and the settings they share. Each type's markup, stored value and server checks are in the Form input reference.
Settings every input has
| Setting | What it does | Watch for |
|---|---|---|
| Label | The field's label, tied to it by for and id | Radio buttons and checkbox lists print it as a plain <div>, not a <label>; see the reference |
| Name | The answer's key in the request, the submission, exports and jobs | Letters, digits and underscores; unique across the form, ignoring case. Leave it alone once the form is live (why) |
| Placeholder | Hint text inside an empty field; on a single Select, the text of its empty first option | Not a label: it disappears as soon as the visitor types |
| Help | Printed as the field's title attribute | A tooltip only: invisible on touch screens and unreliable with screen readers. Put help a visitor must see in a Richtext element above the field |
| Default value | The value the field starts with | For a Hidden input this is the value sent |
| Required | An answer must be given | Interacts with conditional logic; read Conditional requirements and validation before combining them |
| Regex | A pattern the answer must match | Write it without delimiters or flags (Validation) |
| Custom CSS classes | Added to the field's wrapper <div> | The hook for one-off styling, without a template override |
Choosing a type
| To collect | Use | Stored as |
|---|---|---|
| A short answer | Input field | The text, trimmed |
| A long answer | Textarea | The text, trimmed |
| An email address | The text. Add a regex to check the format on the server | |
| A phone number | Phone | The text, as typed |
| A number | Numeric, or Slider for a rough choice within a range | A number |
| A from and to pair (a budget, an age band) | Range | Two numbers, lower first |
| One of a few options | Radio for up to about six, all visible; Select for more | The option's value |
| Several of a few options | Checkbox with two or more options; Select with Allow multi select for a long list | A list of values |
| Yes or no, or a consent | Checkbox with exactly one option | That option's value, or nothing |
| A date, a time, or both | Date/Time | The browser's text, such as 2026-10-05 |
| A document or image | File | The uploaded files (File uploads) |
| A value the visitor does not type | Hidden input | The text |
| Proof of a human | Captcha | Nothing |
Three pairs are easy to confuse:
- Slider and Range. Slider is a single number on an
<input type="range">. Range collects two numbers, a from and a to, as two number boxes. The names are the reverse of what HTML suggests. - Checkbox with one option or several. One option is a single on/off box and stores one value. Two or more options become a list, and the field stores a list. The behaviour changes as soon as a second option is added, which matters to anything reading the answers.
- Select and Radio. Both store the option's value, not its title. An option shown as "New South Wales" might be stored as
nsw. Conditions, exports and jobs all see the value, so choose values that will still make sense in a spreadsheet.
An option with an empty value cannot be chosen: a radio button or a single checkbox with no value is printed disabled, and a select's empty option becomes its prompt. Give every option a value.
Element groups
A group renders as a <fieldset class="element-block element-group-block">, with its title in a <legend>. Use one wherever fields only make sense together: a postal address, a name in two parts, the questions about one ticket holder. Grouping serves two purposes:
- Accessibility. A screen reader announces the legend with each field in the group, so "Street" is read as part of "Postal address".
- Conditional logic. A whole group can be shown or hidden with one rule, which is far easier to maintain than one rule per field. On the server, hiding a group also lifts the requirement on every field in it (Conditional logic).
A group's fields appear both inside the group and in the step's element list. A layout prints only the top-level elements and lets each group print its own children (the minimal layout).
Static elements
Static elements put content between fields. They collect nothing and are not stored.
- Richtext prints the editor's HTML inside
<div class="element-block static-element-block"><div class="element-text">. Use it for instructions before a group, a heading that starts a section of a long step, help a visitor must see, a consent statement with a link to the privacy policy, and the message on a result step. - HTML snippet prints its content exactly as entered, with no wrapper.
An HTML snippet's scripts run. The platform gives every <script> tag in a snippet the page's nonce, the value the site's Content Security Policy uses to tell the site's own scripts from others, so a script in a snippet runs on every page that shows the form, with the same standing as the theme's code. Treat permission to edit forms as permission to add script to the site: give it only to people trusted with that, keep behaviour in the theme's JavaScript, and use the snippet for markup the rich-text editor cannot produce. Neither static element is a place for content a visitor supplies.
Hidden inputs are not secret
A Hidden input is an <input type="hidden"> in the page source, and a visitor can change its value before submitting. Use it to carry context the visitor would not think to type, such as the page or campaign a form was sent from, filled by a client-side helper or a Field Modification action. Never use it for a price, a discount or an access decision, and treat its value in a job as something the visitor typed.