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

SettingWhat it doesWatch for
LabelThe field's label, tied to it by for and idRadio buttons and checkbox lists print it as a plain <div>, not a <label>; see the reference
NameThe answer's key in the request, the submission, exports and jobsLetters, digits and underscores; unique across the form, ignoring case. Leave it alone once the form is live (why)
PlaceholderHint text inside an empty field; on a single Select, the text of its empty first optionNot a label: it disappears as soon as the visitor types
HelpPrinted as the field's title attributeA 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 valueThe value the field starts withFor a Hidden input this is the value sent
RequiredAn answer must be givenInteracts with conditional logic; read Conditional requirements and validation before combining them
RegexA pattern the answer must matchWrite it without delimiters or flags (Validation)
Custom CSS classesAdded to the field's wrapper <div>The hook for one-off styling, without a template override

Choosing a type

To collectUseStored as
A short answerInput fieldThe text, trimmed
A long answerTextareaThe text, trimmed
An email addressEmailThe text. Add a regex to check the format on the server
A phone numberPhoneThe text, as typed
A numberNumeric, or Slider for a rough choice within a rangeA number
A from and to pair (a budget, an age band)RangeTwo numbers, lower first
One of a few optionsRadio for up to about six, all visible; Select for moreThe option's value
Several of a few optionsCheckbox with two or more options; Select with Allow multi select for a long listA list of values
Yes or no, or a consentCheckbox with exactly one optionThat option's value, or nothing
A date, a time, or bothDate/TimeThe browser's text, such as 2026-10-05
A document or imageFileThe uploaded files (File uploads)
A value the visitor does not typeHidden inputThe text
Proof of a humanCaptchaNothing

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.