Skip to main content

Changelog

Every release and every change a site might notice, newest first. Formidable follows semantic versioning:

  • Patch releases (1.0.x) fix things.
  • Minor releases (1.x.0) add things without breaking anything.
  • Nothing breaking ships before 2.0.0, so any 1.x update is a matter of copying the files and running ExpressionEngine's update. See the upgrade guide.

1.1.0 — 18 October 2026​

Adds capture-tag success messages and forms kept in code, and fixes the command line on ExpressionEngine 7.5. Copy the new files over the old ones and run ExpressionEngine's update. Nothing in your templates needs to change.

Added​

  • Capture tag: the same success variables as the form tag, {form_success}, {form_success_message} and the rest, so a hand-written form can show its thank-you message. See Saying thank you.
  • Keeping forms in code: formidable:form:import --update updates an existing form from its document instead of making a new one, keeping its submissions. Removed fields are kept unless you ask, a field with answers is never removed, a changed fieldtype is refused, and anything changed in the control panel since the last update is refused rather than silently replaced. See Keeping forms in code.
  • Blueprints: a connection workflow (Mailchimp, HubSpot and the rest) now travels with its connection, list and field mapping, and arrives switched on when the site has a connection of that name.

Fixed​

  • Condition builder: in a condition on a field with several options (checkboxes or a multi-select), the options list had no space between each checkbox and its label. The same list in the Submissions columns picker is fixed too.
  • Command line: every formidable:* command, and php eecli.php list itself, stopped with a fatal error on ExpressionEngine 7.5.
  • Hand-written markup: {value:HANDLE} and {error:HANDLE} printed as literal text until a submission failed. They're now empty on a first visit, in the capture tag and the form tag.
  • Capture tag: markup with ExpressionEngine conditionals inside an input's tag (required{if "{error:name}" != ""} aria-invalid="true"{/if}) was misread, so the field lost "required" and the form was reported as changed on every visit. A Turnstile or hCaptcha field is no longer reported as removed from the markup, a form already captured is read again after updating, and a form rendered with sync="off" is no longer shown as changed from an old capture.
  • Control panel: conditions saved from a field, workflow or action editor were stored as text instead of the list the builder stores. Both still work; new saves store the list.
  • return=: a full URL such as {page_url} was doubled into https://host/https://host/…, and hosts listed in formidable_return_hosts could never be reached. A full URL on the site or an allowed host is now used as written.
  • Capture tag: with the form's JavaScript honeypot on, every submission was counted as spam and nothing was stored or sent, while the visitor still saw the success page. The tag now loads formidable.js. include_js="no" leaves it out, as on the form tag.

Documentation​

  • {if error:email} never matches, because ExpressionEngine reads the part after the colon as a modifier. The examples now use the quoted form, {if "{error:email}" != ""}, which works.

1.0.0 — 14 October 2026​

The first public release. Needs ExpressionEngine 7.5 or later and PHP 8.2 or later; the installer refuses anything older. If you ran a pre-release build, read the upgrade guide. See Installation.

Building forms​

  • A visual builder with pages, sections and a twelve-column grid, keyboard equivalents for every drag, and an Overview that reads the form's conditions as sentences. See Forms.
  • 38 fieldtypes, among them names and addresses in parts, consent, ratings, scales, image choices, a Likert matrix, file uploads, signatures, computed values, CAPTCHA, Turnstile and hCaptcha. See Fieldtypes.
  • Conditions that show, hide or require fields, skip pages and hide sections, in the browser and on the server. See Conditions.
  • Repeating sections with conditions inside and across rows, and sum(), count() and average(). See Repeating sections.
  • Computed fields, worked out as the visitor types and again on the server. See Computed fields.
  • Default values with variables (the member, the page, today, your Template Variables), built-in option lists, a Field Library, Duplicate, and limits (a closing date, a maximum number of submissions, members only). See Fields.
  • The Formidable Form channel field, including inside Grid, Fluid, Bloqs and Pro Variables.

Displaying forms​

  • One tag, {exp:formidable:form}, with every layer replaceable by your own markup. See Rendering a form.
  • Default, Tailwind and Bootstrap 5 themes, plus an Email theme, each copyable and changeable part by part. See Themes.
  • Regions: classes and attributes for every part of a form. See Regions and attributes.
  • Capture a form from hand-written markup with {exp:formidable:capture}. See Capturing forms.
  • Accessible by default: instructions and errors linked with aria-describedby, and aria-invalid on fields with errors.

Submissions​

  • A submissions listing with filters, columns, saved views, statuses, editing and bulk deletion. See Managing submissions.
  • Exports to CSV, JSON, XML and plain text, and encryption at rest per field.
  • Save and resume, with autosave, resume links and reminders. See Save and resume.
  • Front-end editing with submission_handle=. See Front-end editing.

Automation​

  • Workflows that email, call a signed webhook or push to a connection, each with its own conditions, on create, update, status change and drafts. See Workflows.
  • Connections for Mailchimp, Campaign Monitor, Constant Contact, Dotdigital, HubSpot, Salesforce and Mailjet. See Connections.
  • A queue with retries (using BoldMinded's Queue when installed), and a workflow log, encrypted at rest, with Run again. See The workflow log and queue.
  • Dynamic recipients whose addresses never reach the page.

The control panel​

  • A dashboard with forms, recent submissions, a fourteen-day chart and what needs attention. See Dashboard.
  • Health checks, each with its fix, on Configuration and the dashboard. See Configuration.
  • Utilities for API keys and running commands, eight permissions, and Jump Menu commands. See Utilities and Permissions.

For developers​

  • A JSON API with keyless access from your own pages and scoped, hashed keys. See JSON API.
  • Forms as JSON with output="json". See Form JSON.
  • 20 extension hooks, plus your own fieldtypes and connection providers. See Extension hooks.
  • Fifteen commands, also runnable from Utilities. See Command line.

Security​

Signed and encrypted form meta, CSRF protection (AJAX included), two honeypots, a per-IP rate limit, duplicate detection, a return-URL allow list, and escaped output throughout. See Spam and security.

Known limitations​

  • Multi-page forms submit once. Pages step in the browser and the whole form is submitted at the end. With page=, each page renders in its own request as its own submission.
  • One level of repeating. A repeating section can't contain another, and can't span pages.