Forms

Forms that react to their own answers.

Conditional logic decides what a field does. Triggers decide what the form does. Both are authored side by side, and both are re-enforced on the server.

Built inTriggersWizards

A browser-only rule is a suggestion. Everything a trigger decides about submission is re-enforced in the submit route, from the same engine. Re-enable the button in developer tools and a blocked form stays blocked.

The form builder with ACME Ltd's Trade account application open: a list of field cards on the left - page breaks, text, dropdown, radio buttons, with required and logic markers - and on the right a live preview showing step 1 of 2 of the wizard

Fields on the left, the real form on the right. The preview is the public renderer, logic, triggers and wizard steps included, and it updates as you edit.

One answer. The whole form responds.

A trigger hangs off a field and fires when the answers meet a condition you set.

Raise a banner, or fire a toast
Hide, disable or require other fields
Refuse the submit, with a reason
Jump to a step of a wizard
Celebrate, or redirect
Run a CMS Action

State reverts. Events fire once.

State actions apply while the condition holds and are undone when it stops. Hide a field because the answer was "no", and changing the answer to "yes" brings it back. You never have to write the inverse rule.

Event actions fire once, on the transition into a branch, and never on the first render. So a toast greets a change of mind instead of ambushing someone who has not typed anything yet.

Because the matching branch and its alternative are separate, an answer swinging back re-fires cleanly.

A trigger on the Expected monthly spend field: when it equals over-2000, show a warning banner below the field that names the contact, and notify the admins when the form is submitted; the Otherwise branch is empty

The trigger: when spend is over £2,000, show a banner while it is true and tell the admins when the form is sent.

Step 2 of the wizard in the preview: Over £2,000 is chosen, a banner reads Over £2,000 a month? Dan Mercer, we need two trade references before we can open the account, and the Two trade references field has appeared as required

What the visitor sees. The banner fills in their name from the form, and the references field slides in, now required.

Some answers mean there is nothing more to ask.

An end-form trigger masks the rest of the form, says why, and turns the button into Finish. You choose whether the answers so far are kept, and the stored entry records how the form ended.

ACME only opens trade accounts for businesses trading six months or more. Pick "Less than 6 months" and the application stops there, politely, with the details kept for later.

The preview with Less than 6 months selected: the rest of the step is replaced by a message saying ACME opens trade accounts once a business has traded for six months, and the Next button has become Finish

Each field knows when it is needed.

Open a field and its logic sits underneath: when it shows (with a fade, slide or scale), when it becomes required, and what counts as a valid answer.

ACME's "Two trade references" is hidden until the spend is over £2,000, required only then, and has to include an email address or phone number. Conditions can test any answer, including ones from an earlier step.

The Conditional Logic panel of a field: visibility hidden by default with a slide transition, shown when Expected monthly spend equals over-2000; required when the same answer is given; and a custom regex validation with its own error message

Everything else you would have built by hand.

Conditional logic

Show, hide or require a field based on answers already given, including answers from an earlier page of a wizard. Dependent dropdowns and cross-field validation included.

Multi-step wizards

Page breaks and progress. Validation that names what is missing rather than refusing silently. Files and logic survive every step change.

Anti-spam

A honeypot pair and configurable rate limiting on every form, with none of it visible to a real visitor.

A real grid

Forms lay out on a proper responsive grid and collapse correctly on narrow screens. The column control only offers what the renderer can actually produce.

Notifications and webhooks

Email on submission, a webhook to anywhere, or a hook your own Tool listens for. Recipients and webhook URLs never reach the browser.

Rich field types

Text, select, checkbox, date and file, plus icon and image pickers, so a form can capture a choice that is visual rather than typed.

The form's Actions tab: send an email on submit to trade@acme.example with a subject prefix, an optional webhook with URL and method, a CMS Action to run after the entry is stored, and spam protection with a honeypot and a rate limit

What happens on submit: store, email, webhook, a CMS Action, or all four. If one fails the entry is still kept, and the admins are told.

One shortcode, anywhere.

[form name="contact" /]

Drop it in a page, a card, a slideover or a tab. The submit route resolves the form's actions server side, so the page never carries them.

Everything lands in the admin.

Submissions are stored, searchable and exportable as CSV or JSON, with filters for new entries and spam. They live in a collection, so they can also be shown on a page like any other.

How collection displays work →

The submissions screen for the Trade account application: Inbox, New this week and Spam filters, a search box, a date range, and eight applications named after the business, each with its answers summarised and a New marker

Each application is named after the sender. Filter, search and pick a date range, open one to read it all, or right-click to copy, email the sender or mark it as spam.