Fieldtypes
Introduction
A fieldtype is the kind of field: a text box, a dropdown, a file upload, a signature pad. It decides what the field looks like, which settings it offers, and what happens to the answer.
Formidable ships 38 fieldtypes in four groups. They live in the Registry (Registry › Fieldtypes), so your site can rename them, change their defaults or add more. Pick one to read about it:
Inputs
Dates & Times
Options
Special
These are the fields inside a form. Formidable also adds one ExpressionEngine channel fieldtype, Formidable Form, which puts a whole form on an entry. Developers can register their own fieldtypes too. See Custom fieldtypes.
Inputs
One native control, one answer.
Text
A single line of text. Set a Maximum Length to add both maxlength on the input and a matching maxLength rule.
Textarea
Several lines of text, for messages and comments.
Email
An email address. New Email fields arrive with the email rule, which is what rejects an invalid address on the server; the input's type="email" is only a hint to the browser. Turn on Allow as Workflow Recipient to let a workflow email the address, for a "send me a copy" box.
Telephone
A phone number, with type="tel" so phones show their number pad. Formats vary too much around the world for Formidable to impose one; add a startsWith or pattern rule if yours needs it.
URL
A web address. Pair it with the url rule to require a valid one.
Password
Masks what's typed, but only on screen. Turn on Encrypt Stored Value (Advanced tab, when creating the field) when the answer is sensitive.
Number
A number, stored as a decimal so it sorts and compares as one. Set min, max and step on the field's input attributes.
Range
A slider, stored as a number. A browser's range runs from 0 to 100 unless you set min, max and step.
Color
A colour picker, stored as a hex value. The hexColor rule checks it.
Checkbox
A single tick box, such as "I agree to the terms". Its label follows the box.
Toggle
A single yes/no answer drawn as a switch. It works exactly like a Checkbox: the same Checkbox tab sets what is stored when it's on and when it's off, and leaving it off stores the "off" value. Screen readers announce it as a switch. Bootstrap draws it with its own form-switch; Default and Tailwind draw their own.
Consent
A tick box beside a statement, such as "I agree to the privacy policy", that keeps a record of the consent, not just a tick.
| Setting (Consent tab) | What it does |
|---|---|
| Statement | What the visitor agrees to, shown as the box's label. HTML is allowed, so it can link to your policy. Blank uses the field's name. |
| Agreed value, Not agreed value | What's stored when it's ticked and when it isn't: Agreed and Not agreed unless you change them. |
| Record IP address | Also keep the visitor's IP address with the record. Off by default, because an IP address is personal data. |
When the box is ticked, Formidable keeps the statement as it read at that moment, with a fingerprint of it and the time. Changing the wording later never changes what earlier visitors agreed to. The submission's page in the control panel shows the record under the answer.
A consent field is never pre-ticked, because a box someone else ticked isn't consent. Mark it Required to insist on it, or leave it optional for something like a newsletter opt-in. Conditions, filters and exports read its answer like any checkbox's.
Name
First and last name, each in its own box, labelled and filled in by the browser's autocomplete. A field's Name tab can also show Title, Middle name and Suffix, relabel any part, and choose its Required parts: which boxes must be filled in when the field is Required. First and last name unless you change it.
The answer is the name as it reads, such as Ada Lovelace, so listings, exports and conditions treat it like any text. Each part is also kept:
- In an email,
{field:HANDLE:first},{field:HANDLE:last}and so on. - In a connection's mapping, each part is a choice of its own, so first name can go to
FNAMEand last name toLNAME. - On the submission's page in the control panel, under the answer.
- Reopening a draft or a submission fills each box again.
Address
A postal address in parts: Street address, Address line 2, City, State / Province, Postal code and Country, each autocompleted by the browser. The Address tab chooses which to show, relabels them, and sets Required parts: street, city and postal code unless you change it, so a second address line can stay optional.
The answer is the address on one line, such as 1 Main St, Springfield, IL 62701, United States. Its parts are kept as a Name's are: {field:HANDLE:city} in an email, a mapping choice each, and shown in the control panel.
Neither can go in a repeating section. Each theme draws the boxes its own way, so they match the rest of the form, and classes you give the field's label and input reach every part. A required part's label is marked as a required field's is. In your own theme, the control-name and control-address parts loop over {field_parts}, with {part_label}, {part_id}, {part_name}, {part_value}, {part_autocomplete}, {if part_required} and the part's width as {part_span} (quarters of the row) or {part_columns} (twelfths).
Datalist
A text box with suggestions. The suggestions come from an option list, but the visitor can type anything, and what they type is stored.
Hidden
A value the visitor doesn't see, such as a campaign code or a value from the URL ({segment_3} as its default). It renders no label or instructions.
It's an ordinary input in the page, and anyone can change it before submitting. Never use one for anything a visitor mustn't be able to alter.
File
An upload. Its File tab chooses the ExpressionEngine upload destination, an optional subfolder, and whether several files are allowed. Any upload destination works, including destinations on cloud storage through an ExpressionEngine file adapter.
- Allowed types and sizes come from the upload destination (Files › Upload Directories), so they're set once, where ExpressionEngine already enforces them.
- Uploads become ordinary files in ExpressionEngine's file manager, and the submission stores a reference to them.
- A failed submission keeps its uploads for up to 15 minutes, so the visitor doesn't have to choose them again.
- Editing a submission on the front end lists the files it holds, each with a box to keep it. See Front-end editing.
- Workflows can attach them to the emails they send.
Dates and times
One fieldtype per kind of value, each using the matching native input, and each comparing its own kind of value in conditions and the submissions filter. Date operators work by the day, so "on or after the 3rd" includes 3 pm on the 3rd. Default any of them to now with {current_time}.
Date
A calendar date: 2026-10-12.
Date & Time
A date and a time together: 2026-10-12T14:30.
Time
A time of day: 14:30.
Month
A month of a year: 2026-10.
Week
A week of a year, numbered as ISO 8601 numbers them: 2026-W42.
Options
Select, Multi-select, Checkboxes, Radio Buttons, Rating, Scale, Image Choice and Image Choices share one Options tab, so moving a question from a dropdown to radio buttons keeps its choices.
Select
One choice from a dropdown.
Multi-select
Several choices from a list. Always stores a list, even when only one was chosen.
Checkboxes
A tick box per choice; visitors tick as many as apply. Stores a list.
Radio Buttons
Every choice visible, exactly one chosen.
Rating
Stars to click, such as "How was your stay?". It's one choice from a Number Range, 1 to 5 unless you change it on the Options tab. Each star keeps its number for screen readers. The answer is filtered as a number, so a condition or a filter can ask for 4 or more. Restyle the stars with the --formidable-rating-on and --formidable-rating-off CSS properties. A chosen star is filled and an unchosen one an outline, so the difference isn't colour alone; keep your colours at 3:1 against the background.
Scale
A row of numbered buttons, starting at 0 to 10: a Net Promoter Score ("How likely are you to recommend us?"), or any agree-disagree scale. Like Rating, it's one choice from a number range, filtered as a number. Say what the ends mean in the field's instructions. --formidable-scale-accent sets the colour of the chosen button.
Image Choice
One choice from picture cards: a room, a product, a style. A new Image Choice field opens its Options tab on Manual choices. Type each choice's value and label, then use Choose image in its Image column to pick the picture from the file manager, or upload one there. The thumbnail appears straight away, and the builder shows the cards. Pictures come only with Manual choices. A choice without a picture shows its label alone. --formidable-image-choice-accent colours the chosen card, --formidable-control-line an unchosen card's edge, and --formidable-image-choice-size sets the cards' width. In your own markup, each option's {image} is its picture's address. On a submission's page in the control panel, the answer is the same cards, with a No answer card to clear it.
Image Choices
Image Choice with as many picks as apply, like Checkboxes. It stores a list.
Matrix
Several statements answered on the same scale, a Likert grid: "The staff were friendly", "The room was clean", each from Strongly disagree to Strongly agree. Its Matrix tab takes the Statements and the Choices, one per line. The choices start as that five-point scale.
Each answer is stored as Statement: Choice, so the field's answer is a list such as Staff: Agree; Room: Neutral. Exports, conditions and filters read it like a Checkboxes answer, and a condition can ask for Matrix is any of "Room: Strongly disagree". Required means every statement has to be answered. Turn on Offer "no answer" to add a last column, set apart from the scale, for a statement the visitor would rather not rate. Its label is yours to change (No answer unless you do). It's stored like any choice, such as Staff: No answer, and it counts as answered when the field is required. On a phone, each statement stacks with its choices under it. On a submission's page in the control panel, the answer is the same table, with an Unanswered column to clear a statement. A matrix can't go in a repeating section.
Where choices come from
| Source | Choices are |
|---|---|
| Manual | Typed on the field, each with a value and a label. |
| Number Range | A run of numbers. |
| Built-in list | Countries, languages, U.S. states, Canadian provinces and territories, states and provinces of the U.S., Canada and Australia together, days of the week, weeks of the year or months, shipped with Formidable. Choose what's stored and what visitors see: a country's ISO code or its name, a state's two-letter abbreviation or its name, a month's number or name. |
| Your lists | A list you made under Registry › Lists, shared between forms. |
| Entries, Categories, Members, Roles | Built from content already on your site, so they stay current. |
| Recipients | Labels the visitor picks from, each with email addresses that stay on the server. See Let visitors choose the recipient. |
To preselect choices, tick them in the Default column of the Options tab. Choice fields have no separate default value box.
Manual, Recipients, built-in and number-range choices are checked on submit: a value that isn't one of them, or one you excluded, fails validation, so a tampered form can't send an answer you never offered.
Choices that depend on another field
Two separate fields can work as a pair: pick a country, and a second dropdown offers only that country's states. Set Depends On on the second field's Options tab to the first field. Then:
- With Manual choices, fill in each choice's Parent column with the value of the other field it belongs to. Separate several with commas. A choice with no parent is always offered.
- With the States & Provinces built-in list, nothing to fill in: each state already knows its country, by ISO code (
CA) and by name (Canada), so the country field can store either.
While the visitor fills in the form, the choices that don't fit are hidden, and a choice that stops fitting is cleared. Until the first field is answered, only the choices with no parent are offered. On submit, a value that doesn't belong to the other field's answer fails validation.
The two fields stay ordinary fields: each has its own label, required setting, conditions and column in exports. A field can depend on one that itself depends on a third, such as region → country → state.
Special
HTML
A block of content in the middle of the form: a heading, a paragraph, a link to your privacy policy. Nothing is collected. The content is output exactly as written, scripts included, so give this field only to people you'd trust to edit a template.
Captcha
ExpressionEngine's own CAPTCHA, following Settings › CAPTCHA, including its option to exempt logged-in members. Nothing is stored.
Turnstile
Cloudflare Turnstile, using the site and secret keys saved as a connection. Create the connection first: the builder offers Turnstile only once an enabled Turnstile connection exists, and a field with no connection selected rejects every submission. Different forms can use different connections, such as separate staging and production keys. Nothing is stored.
hCaptcha
hCaptcha, set up the same way as Turnstile, with its keys saved as a connection. The builder offers it once an enabled hCaptcha connection exists. Nothing is stored.
Attribution
Records where the visitor came from, without asking them: the page they landed on, the site that sent them, and the link's UTM tags (utm_source, utm_medium, utm_campaign, utm_term and utm_content). Add it once to a form. Visitors never see it.
- The answer is a short line you can filter, export and use in conditions:
google / cpc / spring_salefrom the UTM tags, otherwise the site that sent them, such asnews.ycombinator.com, otherwise(direct). It's blank if JavaScript didn't run. - The full record is kept beside the answer and shown on the submission's page in the control panel.
- It's the first page of the visit. Formidable's script remembers the first page it sees in the visitor's session, in the browser's session storage rather than a cookie, and only for that visit. Load the script on every page of your site and that's the true landing page. Otherwise it's the first page with a form. A referrer from your own site is just a click between pages, so it's ignored.
To load the script on every page, add it to your site's main layout:
<script src="{theme_folder_url}user/formidable/js/formidable.js" defer></script>
On those pages, add include_js="no" to the form tag so Formidable doesn't add the script again. If it's added twice anyway, the second copy does nothing. The record comes from the visitor's browser, so Formidable keeps only those keys, as short plain text, and only http and https addresses.
Signature
A pad signed with a mouse, trackpad or finger, for consent forms, waivers and sign-offs.
- The pad: its size, pen width and colours.
- Where it goes: stored inside the submission as an image, or written to an upload destination as a file.
- Without JavaScript, visitors see a short message instead of the pad, because signing needs a script.
Computed
A value worked out from other fields and never typed: a full name, a total, an age. It updates as the visitor types, and the server works it out again on submit, whatever the browser sent. See Computed fields.
At a glance
How each fieldtype stores its answer, as the installer creates it. "Rules added to new fields" are pre-filled on a new field's Validation tab and can be removed.
| Fieldtype | Handle | Group | Stored as | Can be encrypted | Rules added to new fields |
|---|---|---|---|---|---|
| Text | text | Inputs | text | Yes | – |
| Datalist | datalist | Inputs | text | Yes | – |
| Checkbox | checkbox | Inputs | text | No | – |
| Toggle | toggle | Inputs | text | No | – |
| Consent | consent | Inputs | text | No | – |
| Name | name | Inputs | text | No | – |
| Address | address | Inputs | text | No | – |
email | Inputs | text | Yes | email | |
| Number | number | Inputs | decimal number | No | numeric |
| Telephone | tel | Inputs | text | Yes | – |
| URL | url | Inputs | text | No | url |
| Password | password | Inputs | text | Yes | – |
| Date | date | Dates & Times | text | No | – |
| Date & Time | datetime | Dates & Times | text | No | – |
| Time | time | Dates & Times | text | No | – |
| Month | month | Dates & Times | text | No | – |
| Week | week | Dates & Times | text | No | – |
| Color | color | Inputs | text | No | – |
| Range | range | Inputs | decimal number | No | numeric |
| Hidden | hidden | Inputs | text | No | – |
| Textarea | textarea | Inputs | text | Yes | – |
| File | file | Inputs | file reference | No | – |
| Select | select | Options | text | No | – |
| Multi-select | multiselect | Options | list | No | – |
| Checkboxes | checkboxes | Options | list | No | – |
| Radio Buttons | radio | Options | text | No | – |
| Rating | rating | Options | text | No | – |
| Scale | scale | Options | text | No | – |
| Image Choice | image_choice | Options | text | No | – |
| Image Choices | image_choices | Options | list | No | – |
| Matrix | matrix | Options | list | No | – |
| HTML | html | Special | nothing | – | – |
| Captcha | captcha | Special | nothing | – | – |
| Turnstile | turnstile | Special | nothing | – | – |
| hCaptcha | hcaptcha | Special | nothing | – | – |
| Attribution | attribution | Special | text | No | – |
| Signature | signature | Special | image or file | No | – |
| Computed | computed | Special | text | No | – |
Which fields can be encrypted
The Can be encrypted column above lists them. Encryption is chosen when a field is created and can't be turned on later: existing answers would already be stored in the clear, and switching it on afterwards would suggest otherwise.