> For the complete documentation index, see [llms.txt](https://docs.informationhub.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.informationhub.io/project/forms/question-types.md).

# Question Types

Each question on a form corresponds to a column in the linked table. When someone submits the form, their answer is stored in that column. The available question types cover the most common data formats used in field research and data collection.

## Text types

### Short (single-line text)

A single-line text input. Use this for short answers such as names, codes, or brief notes. You can set minimum and maximum character counts, and minimum and maximum word counts, in the question's expanded configuration panel.

#### Text subtypes

Short text questions can enforce a specific input format using the **Subtype** setting in the question options panel:

| Subtype      | What it accepts                                            |
| ------------ | ---------------------------------------------------------- |
| Email        | A valid email address (e.g. `researcher@example.com`)      |
| Phone number | Digits, spaces, and a leading `+` (e.g. `+27 82 123 4567`) |
| Numeric      | Digits only                                                |
| Alphanumeric | Letters and digits only, no spaces or symbols              |

Leave the subtype unset to accept any text. An empty answer is always valid regardless of subtype - use the **Required** toggle to enforce a value.

### Paragraph (multi-line text)

A multi-line text area for longer responses - notes, descriptions, or observations that need more space than a single line. You can set a maximum character count.

### JSON

A structured sub-form for collecting a list of multi-part entries inside a single question - for example, a list of "specimen, quantity, collected on" records within one form. Instead of a single input, the respondent fills in one or more entries, each made up of the sub-fields you define.

**Setting it up (form builder):**

1. Click **Add Sub-field** to add a field to each entry. Give it a **Field key** and, optionally, a **Display label**.
2. Choose the sub-field's **Field type**: Text, Number, Date, Yes/No, or Dropdown.
3. Toggle **Required** if the sub-field must be filled in on every entry.
4. For a Dropdown sub-field, add the option list and, if you toggle **Allow custom values**, respondents can add their own value with the **+** button next to the dropdown.
5. Number sub-fields can have a **Min value** and **Max value**. Text sub-fields can have a **Min length** / **Max length** and **Min words** / **Max words** - the same limits available on standalone Number and Short-text questions.
6. Under the cog/settings icon, set an optional **Minimum items** and **Maximum items** to control how many entries the respondent must or can add.

**Filling it in (respondent view):** Each entry appears as its own card, labelled "Entry 1", "Entry 2", and so on, with an input for each sub-field. Click **Add Entry** to add another entry, or the trash icon on a card to remove it. If a maximum item count is set, a counter (e.g. "2 / 5 items") shows how many entries have been added.

## Numeric types

### Number

A numeric input field. Accepts integers or decimal values. You can set minimum and maximum values in the question properties to restrict the range of accepted answers.

## Choice types

### Dropdown

A selection field where the person picks one option from a predefined list. Options are managed in the form builder.

By default, respondents can only choose from the predefined list. To let them submit a value that is not in the list, click the **cog icon** to open the question's Advanced section and set **Save typed values to list**:

| Mode                       | What happens                                                                                                                                                                                        |
| -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Disabled                   | Respondents can only pick from the predefined options. No text input is shown.                                                                                                                      |
| Never save (don't prompt)  | A "type a new option" input is shown, but a new value is used only for that submission - it is never added to the list, and the respondent is not asked.                                            |
| Ask before saving          | A "type a new option" input is shown. When the respondent types a value that is not already in the list, a **Save to list?** confirmation appears, asking whether to add it for future submissions. |
| Always save (don't prompt) | A "type a new option" input is shown. New values are added to the list automatically, with no confirmation prompt.                                                                                  |

{% hint style="info" %}
Forms created before this setting existed keep working the same way: a dropdown that previously had "Allow new items" turned on behaves like **Ask before saving**; one that had it turned off behaves like **Disabled**.
{% endhint %}

### Multi-Radio

A radio button list where the respondent chooses exactly one option. Use this when you want the choices to be visible all at once rather than hidden in a dropdown.

### Multi-Checkbox

A checkbox list where the respondent can select any number of options. Use this for "select all that apply" questions.

### Yes / No

A simple boolean toggle. Use this for true/false or yes/no questions - for example, "Was the specimen collected?"

## Date and time types

### Date

A date picker. The respondent selects a date from a calendar. Useful for recording observation dates, collection dates, or deadlines.

Date questions support a **Format** field that specifies the expected input pattern (e.g. `YYYY-MM-DD`, `DD/MM/YYYY`). The format string is shown as a placeholder in the input field, guiding respondents on how to enter the date.

### Time

A time picker. The respondent selects a time of day. Useful when you need to record when an event occurred.

## Location type

### Location

Captures GPS coordinates (latitude and longitude). When filling in a Location question:

* An **interactive map** is displayed - tap or click anywhere on the map to place a marker. The latitude and longitude fields update automatically.
* Click **Use Current Position** to use the device's GPS to place the marker at your current location.
* Toggle **Edit coordinates** to switch to manual entry mode, where you can type the latitude and longitude values directly.

On mobile, Location questions can also be presented as an icon button that opens a full-screen location modal. Click **Done** to confirm the coordinates, or **Close** to cancel.

A Location question links to a single column in the table. The stored value is a comma-separated `latitude,longitude` string (e.g. `62.0355,129.6753`). To store latitude and longitude separately, use two **Number** questions instead.

## Media and file types

### File Upload

A file upload field. Respondents can attach images, videos, audio recordings, or general files. Uploaded files are stored in your project's **Storage** - make sure your project has storage configured before using this question type.

When filling in a File Upload question, the following buttons appear:

| Button      | What it does                                             |
| ----------- | -------------------------------------------------------- |
| File icon   | Opens the device's native file picker to select any file |
| Camera icon | Opens the device camera to take a photo                  |
| Video icon  | Opens a video recording modal                            |
| Mic icon    | Records an audio clip using the device microphone        |
| "more"      | Opens the general upload modal with all options          |

After a file is uploaded:

* Each uploaded file appears in the list with a clickable link or thumbnail. Clicking it opens the file in a new tab.
* An **external link** icon opens the file in a new tab when you are online.
* A **trash** icon removes that specific file from the upload.
* The **Clear** button (danger) removes all uploaded files for the question at once.

In the form builder, a File Upload question controls where its files are saved in your project's Storage. By default you pick a fixed folder with **Select Storage** in the **Save File Path** field. Turn on **Use Dynamic Path Template** instead to type an **Upload Path Template** that builds the folder path from the row's values (for example `/{$site}/{date}`), so uploads sort themselves automatically. For the full list of tokens and an important note about keeping referenced fields filled in, see [Dynamic file upload paths](/project/tables/create-table.md#dynamic-file-upload-paths).

### QR Code

Opens the device camera to scan a QR code or barcode. The scanned value is stored as text in the linked column. The camera preview opens automatically and reads codes without requiring a button press.

QR Code questions are useful for:

* Tracking plant or sample specimens tagged with QR code labels
* Scanning equipment serial numbers
* Recording batch or lot codes in field data collection

{% hint style="info" %}
QR Code questions require camera permission on the device. The code is read automatically when the camera detects it - no shutter button is needed.
{% endhint %}

## Auto-filled types

### User Info

Automatically fills in details about the logged-in user (such as their name or user ID). Respondents cannot edit this field - it is filled in by the platform. Use it to record who submitted each response.

### Device Info

Automatically fills in metadata about the device being used (such as device type or browser). Respondents cannot edit this field. Useful for audit trails and diagnosing submission issues.

## Display types

### Markdown

A display-only content block - not a question and not stored in the table. Use it to add instructions, headings, or formatted text between questions. Supports standard Markdown formatting.

## Lookup type

### Lookup

Lets the respondent search for and select a record from another table in your project. There are two modes:

* **Search mode** - a type-ahead search field opens. The respondent starts typing and matching records from the linked table appear. Click a result to select it.
* **Direct entry mode** - the respondent types the exact primary key value of the record they want to link.

When setting up a Lookup question in the form builder, you choose which table to look up from, which column holds the stored value (the key), and which column is displayed to the respondent.

## Structured data types

### Tabular

Presents the respondent with a fixed grid - like a small spreadsheet within the form - where both the rows and the columns are defined in advance by the form creator, and the respondent fills in the cells.

**Setting it up (form builder):**

1. Under **Rows**, click **Add Row** for each row you want. Give it a **Row key** and, optionally, a **Display label**, and toggle **Required** if the row must be filled in.
2. Under **Columns**, click **Add Column** for each column you want. Give it a **Column key**, an optional **Display label**, and choose the column's type: Text, Number, Date, Yes/No, or Dropdown.
3. For a Dropdown column, add the option list and, if you toggle **Allow custom values**, respondents can add their own value with the **+** button next to the dropdown cell.
4. Number columns can have a **Min value** and **Max value**. Text columns can have a **Min length** / **Max length** and **Min words** / **Max words** - the same limits available on standalone Number and Short-text questions.

**Filling it in (respondent view):** The question renders as a table with one row per configured row and one column per configured column. The respondent fills in each cell using the input appropriate to that column's type (text box, number field, date picker, Yes/No toggle, or dropdown).

***

## Question properties

Every question has a set of properties that control how it behaves. These are set in the form builder when editing a question.

### Required

Makes the question mandatory. The form cannot be submitted without a valid answer to a required question. Required fields are marked with a visual indicator when the form is filled in.

### Hidden

Hides the question from the person filling in the form. The question is not visible, but it is still part of the form and its value is still submitted. Use Hidden questions for:

* **Metadata fields** you want to collect automatically without prompting the respondent - for example, a default value set to today's date, or a fixed site identifier.
* **URL-prefilled values** - combine Hidden with a **URL Query Param Key** so the field is silently populated from the link the respondent opened (e.g. `?site=plot-42`).
* **Locked auto-values** - combine Hidden with **Locked** and a **Default value** to create a fully automated field the respondent never sees or changes.

{% hint style="warning" %}
Hidden fields are hidden in the form UI, but their values are still part of every submission. Do not use Hidden to store sensitive information you do not want in your table.
{% endhint %}

### Locked

Prevents respondents from changing the pre-filled value. A locked question is visible but not editable. Use it when you want to display a value (such as the observer's name) without letting the respondent modify it.

### Expanded configuration panel

Click the **cog icon** on a question card to open its expanded configuration panel:

* **URL Query Param Key** - if you enter a key here, the field is pre-filled automatically when the form URL includes a matching query parameter. For example, if you set the key to `site`, then opening the form at `.../form/abc?site=Site+Alpha` will pre-fill this question with `Site Alpha`. Works with both visible and Hidden questions.
* **Default value** - a value pre-filled when the form loads. The respondent can change it unless the question is also Locked.
* **Icon Type** / **Icon Text** - only relevant when using the Icons and Text form layout.
