Skip to content

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.

GroupFields
TextShort and long text, password, URL, email, and phone
ChoicesCheckbox, consent, checkbox group, radio, dropdown, and multi-select
LocationAddress, street, city, region, province, postal code, country, and coordinates
NumbersNumber, integer, decimal, currency, number range, rating, and slider
Date and timeDate, time, date and time, date range, and duration
AdvancedHidden field, separator, and content block

There are no file upload or signature fields.

Go further with the other tabs

TabWhat you do there
FlowSplit the form into steps, with a summary for each
ConditionsShow a question only when an earlier answer calls for it
ValidationsAdd checks and your own error messages
ProcessingClean up answers, such as trimming spaces
PreviewTry the form, and fill in sample answers for your test
SettingsName, 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.

JSON
{
  "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.