Building forms

Field types

Every field Gatherino ships with. All fields support required/optional, conditional logic, custom error messages, and inspection in exports.

Basic inputs

Short text

Single-line input. Supports min/max length, placeholder, pattern regex, and autocomplete hints.

Long text

Multi-line textarea with an optional character counter. Great for feedback or descriptions.

Email

Validated against RFC 5322. Used as the default reply-to for confirmation emails if enabled.

Phone

International phone input with country picker and E.164 normalisation on submit.

Number

Integer or decimal with min/max, step, and locale-aware formatting.

URL

Validated URL field, auto-adds `https://` if missing.

Choice fields

Dropdown

Single-select with search. Supports option groups and an optional "Other" write-in.

Radio

Single-select rendered inline. Best for 2–5 options.

Checkboxes

Multi-select. Enforce min/max number of selections if needed.

Rating

Classic 1–5 or 1–10 star rating with a hover preview.

NPS

Net Promoter Score — 0–10 with detractor/passive/promoter colouring.

Advanced fields

Date

Calendar picker with min/max date, disabled weekdays, and optional time slot picker.

Time

Time-only picker with 12h/24h formats and custom step (e.g. 15-minute slots).

File upload

Up to 50 MB per file. MIME-type allowlist (images, PDFs, docs). Files are virus-scanned on upload.

Signature

Draw with a finger/stylus/mouse, or type a name rendered in one of four signature fonts. Signatures are stored as PNG.

Address

Structured address with optional Google Places autocomplete. Breaks out street, city, postal code, country.

Currency

Number input with a currency prefix. Pick EUR, USD, CZK, GBP, or any custom ISO code.

Markdown block

Not an input — a static block for instructions, legal text, or section headings rendered in the form.

Field IDs in exports & the API

Every field gets a stable machine-readable ID when it's first added (something like field_1712345678901_a8fgh). Renaming a field's label does not change its ID, so your integrations and exports keep working.

In exports you can choose between human labels and raw IDs. When using the REST API, submissions are returned keyed by field ID.