Added
- Add Form Statuses to label form lifecycle states in the control panel (active, draft, archived), with form builder assignment, index status menu filtering, bulk actions, and project config support. Rename existing submission workflow labels to Submission Statuses, with backward-compatible class aliases. (#1471)
- Add existing and synced fields to Group fields from the form builder, so reusable field definitions can be placed inside independent group wrappers with namespaced handles. (#2069)
- Show field handles in the form builder when the Craft user preference Show field handles in edit forms is enabled (admin users only), with a copy-to-clipboard control on hover. (#2279)
- Show an Encrypted padlock badge on fields in the form builder when Enable Content Encryption is turned on. (#2332)
- Add an optional Other choice for Radio fields, with a configurable label and free-text input on the front-end. (#1875)
- Add
csrfInputrender option to control Craft CSRF hidden input output (truedefault,falseto omit, or an options array such as{ async: true }for statically cached pages). (#2121) - Add Enable Multi-Page Forms plugin setting to disable multi-page forms in the form builder. When disabled, authors cannot add pages and existing multi-page forms cannot be saved until reduced to a single page. (#2483)
- Add password validation settings to the Password field: minimum length, and requirements for uppercase, lowercase, and special characters. (#1880)
- Add a Unique User Email setting to Email Address fields, to reject email addresses already associated with a Craft user account. (#1151)
- Add registered Custom Provider option sources for Dropdown, Radio, Checkboxes, and Recipients fields. Modules can register lightweight
OptionSourceProviderInterfaceclasses viaOptionSources::EVENT_REGISTER_OPTION_SOURCE_PROVIDERSfor local Craft data without building a full integration. See Custom option source providers. (#1421) - Add dynamic Brevo list assignment via field mapping. Map a form field to the Brevo List integration field to subscribe contacts to a submission-specific list, with fallback to the form’s configured list. (#2849)
- Add Merge Multi-Option Fields setting to the Pipedrive integration. When updating an existing person (matched by email), mapped multi-option field values such as labels can be appended to existing values instead of replacing them.
- Add global Allowed domains email rules under Settings → Spam Protection → Email Rules. Allowlisted domains or full email addresses skip global blocked-domain and free-provider checks only; other spam screening still applies. (#2335)
- Add a Last Edited By column to submission sources, tracking the Craft user who last saved a submission in the control panel. (#1403)
- Add
craft.formie.ref()andcraft.formie.refField()for building variable-picker-compatible reference tokens from Twig when overriding settings such assubmitActionMessage. See Reference tokens. (#2838) - Add a persisted
metadataJSON column on submissions for submit-time request context (referrer, user agent, tracking cookies) and developer-defined custom data viaform.setSubmissionMetadata(). Reference tokens such as{metadata:custom.campaignId}and{metadata:request.referrer}are supported in notifications, integrations, and PDFs. (#1379) - Add
formie_field_site_overridesstorage for per-site field definition overrides keyed byfieldId, separate from form-levelformie_form_site_overridespayloads.
Changed
- Freeform 4/5 plugin migrations now process submissions in batches (default 100) to avoid memory exhaustion on large forms. Use
php craft formie/migrate/freeform4(orfreeform5) with--batch-size,--submission-offset,--submission-limit,--submissions-only, and--skip-submissionsfor large migrations. (#2513) - Rework multi-site propagation and translation to use each form’s source site (where it was created) instead of Craft’s global primary site. “Same language” and “Same site group” propagation modes now filter from the source site. Forms store a persisted
sourceSiteId. (#84) - Rename the submission statuses database table from
formie_statusestoformie_submission_statuses, aligning withformie_form_statuses. TheTable::FORMIE_STATUSESconstant remains as a deprecated alias. - Stop routing user-authored form content (labels, placeholders, messages, options) through the
formietranslation category. Form copy is output from the database after site overrides are merged;formie.phpis for Formie-owned UI strings only (#2907). - Remove front-end
sourceLanguagemutation in the plugin constructor that existed to work around the above behaviour. - Improve multi-site submission and notification handling by loading forms with site translation overrides applied for the submission’s site.
- Store field translation overrides in
formie_field_site_overridesinstead of nestedfieldsentries in form site override JSON. - Include multi-site translation overrides in form import/export (
siteOverrides,fieldSiteOverrides, andsourceSiteHandle), keyed by site handle and field reference for portability across environments. Form exports now use export versionv4.
Fixed
- Fix form import with Update existing form not removing notifications deleted before export. Empty
notificationsarrays in the import payload now replace the form’s notifications instead of being ignored. (#1941) - Fix plugin uninstall via
project-config/applyfailing when Formie stencil project config is removed after theformie_stencilstable has already been dropped. (#1710) - Fix queued integrations losing submit-time context (referrer, IP address, HubSpot/Pardot tracking cookies) by persisting request metadata on the submission at submit time and hydrating integration context from it in queue workers. (#1379)
- Fix plugin migrations failing on production when
allowAdminChangesis disabled because migrations attempted to write plugin settings to project config. (#2615) - Fix phone country dropdown flags not appearing on Craft Cloud. Flag sprites are inlined in the front-end bundle instead of loading from relative CSS asset paths. (#2529)
- Fix date dropdown fields rejecting year-only values with “Year cannot be blank” when other date parts are disabled. Partial date parts are stored via
DateFieldValuewithout requiring a full calendar date. (#2261) - Fix Stripe payments failing with “Invalid email address” when Payment Receipt is enabled but the mapped receipt email resolves empty (for example legacy
{field.email}tokens or User Email while logged out). (#2262) - Fix Google Maps API script conflicts when Address field autocomplete and the Google Maps Craft plugin are used on the same page. Formie reuses an existing
window.googleinstance instead of injecting a second Maps script. (#2041) - Fix captcha provider credentials saved in the control panel being wiped when project config syncs on deploy. Site-scoped captcha settings are now preserved across deployments. (#2407)
- Fix notification email preview and send failing when both From Name and From Email are set. (#2698)
- Fix Phone field country selector labels not respecting the field’s Country Language setting. (#2042)