Fields
Choose your questions in the Builder, and the rest of the form follows. A new form already has Name, Email, Message, and Company fields, so a contact form is nearly done.
Create a form
Open Forms and create one. Choose a workspace and a name. Formerie turns the name into the handle in your public link,
such as contact. New forms start with spam checks turned on, and nothing is public until you publish.
Add your fields
Open the Builder tab to add, reorder, and edit fields. Every change stays in your draft until you publish, so your live form doesn’t move while you work. Save draft keeps your place.
| Group | Fields |
|---|---|
| Text | Short and long text, password, URL, email, and phone |
| Choices | Checkbox, consent, checkbox group, radio, dropdown, and multi-select |
| Location | Address, street, city, region, province, postal code, country, and coordinates |
| Numbers | Number, integer, decimal, currency, number range, rating, and slider |
| Date and time | Date, time, date and time, date range, and duration |
| Advanced | Hidden field, separator, and content block |
There are no file upload or signature fields.
Go further with the other tabs
| Tab | What you do there |
|---|---|
| Flow | Split the form into steps, with a summary for each |
| Conditions | Show a question only when an earlier answer calls for it |
| Validations | Add checks and your own error messages |
| Processing | Clean up answers, such as trimming spaces |
| Preview | Try the form, and fill in sample answers for your test |
| Settings | Name, handle, description, form language, submit label, success message, logo, colours, font, density, corners, width, light or dark theme, spam checks and limits, archive, trash, and restore |
Going further
a form as JSON
The builder writes a form definition for you, and the server enforces it on every submission. This is part of one. For every field type and option, see the form definition reference.
{
"allowedOrigins": ["https://example.com"],
"verification": {
"provider": "turnstile",
"mode": "managed",
"required": true
},
"fields": {
"contact": {
"type": "object",
"fields": {
"name": {
"type": "string",
"required": true,
"max": 120,
"trim": true
},
"email": {
"type": "email",
"required": true,
"max": 254,
"trim": true,
"normalizeEmail": true
}
}
},
"message": {
"type": "textarea",
"required": true,
"max": 5000,
"trim": true
}
}
}Your own code can read the safe part of a definition from the public schema.