Releases: verbb/formie
Releases · verbb/formie
3.1.29
Changed
- Bump
verbb/auth.
Fixed
- Fix Group/Repeater email templates not respecting “Include in Email Notifications” for nested fields.
- Fix CP submission saves failing when a form has schedule dates enabled.
- Fix open redirect in multi-page form navigation by validating referrer URLs against same-site allowlist.
- Fixed bug preventing payload send when content not multipart.
- Fix Repeater conditional fields rendering the wrong row's value in email notifications.
4.0.0-beta.7
Added
- Add form group policies for allowed submission statuses, optional per-group field palettes, and new-form default profiles (stencil, templates, form defaults). Group policies inherit from global settings; allowed submission statuses are enforced at the group level. (#2717, #2209, #863)
- Add
FormGroupPolicyservice as the single entry point for global → group → form policy resolution. - Add custom variable sources via
Variables::EVENT_REGISTER_VARIABLES, exposing registered tokens in the variable picker and resolving them server-side when references are parsed. (#898) - Add group-scoped form and submission permissions using stable form group handles, with optional per-form dedicated permissions via a new Use Dedicated Permissions form setting. (#1426, #1356, #2489, Discussion #1696)
- Add
formie-importFormsandformie-exportFormspermissions, replacing the temporary admin-only import/export gate. - Add
formie-accessIntegrationspermission for the top-level Integrations control panel section, separate from Access settings. - Add nested settings page permissions under Access settings, with CP navigation and controller enforcement per page.
- Add
formie_captcha_providerstable and migrate captcha provider credentials out of plugin settings, with site/project scope support and project config export for project-scoped providers. - Add
formie_spam_settingstable and migrate spam handling settings out of plugin settings, with site/project scope support and project config export for project-scoped defaults. - Add built-in submission guards (honeypot, minimum submit time, replay protection) via a
RunSubmissionGuardsTaskscreen-stage workflow task and Settings → Spam Protection controls. - Add global email rules (blocked domains, block free providers), form submit expiration guard, and align
RunSpamChecksTaskwithSpamHelperfor documented keyword and IP matching. - Add suspicious text detection, maximum links screening, global submission throttling, and per-IP submission throttling under Settings → Spam Protection. (#1332, #1154, #1099)
- Add a suspicious text detector focused on keyboard spam, low-quality filler text, and configurable allowed terms.
- Add a
Permissionsservice as the single ACL entry point for forms, submissions, sent notifications, and import/export checks. - Add Field Error Announcement plugin setting (Settings → Forms) to control how front-end validation and submit errors are announced to screen readers (
polite,assertive, oroff). Live validation while typing always uses polite announcements. (#2505) - Add optional per-form reCAPTCHA Action and Minimum Score settings for score-based modes, inheriting global Spam Protection defaults when left blank. (#2167, #2804)
- Add scoped Submission Limits per form: cap all submissions for a form (closes the form when reached), submissions per IP address, or submissions per logged-in user, over configurable periods. Discussion #1939
- Add Reports control panel section for saved analytical views over submissions: filters, summary counts, charts, column configuration, and on-demand export (CSV, Excel, JSON, XML, text) with configurable filename tokens. (#647)
- Add Scheduled Reports to email a summary and export attachment from a saved report on daily or weekly schedules, with configurable file type, optional email template, recipients, and user group delivery. (#692, #2184)
- Add
formie-accessReports,formie-manageReports, andformie-manageScheduledReportspermissions. - Add
craft formie/reports/run-scheduledconsole command for cron-driven scheduled report delivery. - Add Report Async Export Row Threshold setting (Settings → Submissions) to queue large report exports in the background (default 1000 rows). (#2259)
- Add queued report exports with CP polling, email notification, and signed download links for interactive exports.
- Add
formie_report_exportstable,craft formie/gc/prune-report-exportsconsole command, and automatic expiry during Craft garbage collection. - Add report export download settings: interactive/scheduled link expiry (hours), and single-use download links (default on).
Changed
- Apply single-use report export download limits to signed email links only; authenticated control panel downloads remain available until expiry.
- Improve queued report export feedback in the control panel with a dismissible inline notice when the queue starts, instead of a delayed Craft toast about email delivery.
- Improve report viewer load performance by skipping redundant overview refreshes on initial page load and aggregating summary counts in a single query per report instead of three counts per form.
- Improve Submission Limits form settings UX (Apply Limit To, consolidated messaging) and clarify the distinction from global Submission Throttling abuse controls. Add Submission Limits author documentation. Discussion #1939
- Remove built-in CSV export actions from the submissions element index; use Reports for export and scheduled delivery instead.
- Align
FormelementcanView(),canSave(),canDuplicate(), and delete behaviour with controller permissions instead of broad allow-all checks. - Auto-grant creators scoped group (or dedicated per-form) manage permissions when they can create forms but lack broader access.
- Filter CP form and submission element sources and indexes to forms the current user can view or manage.
- Filter the settings sidebar and default settings landing page to the first settings page a user can access.
- Unify Settings → Spam Protection as the single CP page for spam handling, keyword rules, and captcha provider credentials. Legacy
spamandcaptchasroutes redirect to the new page. - Deprecate captcha and spam keys in
plugins.formie.settings; legacy plugin settings values are stripped on save and seeded into runtime stores via the compatibility layer. - Removed chart on Submissions element index in favour of dedicated Reports charting.
- Stream CSV/text report exports row-by-row to disk for memory-safe large datasets (#2497).
- Scheduled reports attach exports when under the email attachment limit; otherwise include a signed download link in the summary email instead of silently omitting the file.
- Store report export download tokens as SHA-256 hashes; scheduled export links default to 48-hour expiry.
Fixed
- Fix report export email links returning “Export not found” after a control panel auto-download by serving CP polling downloads from an authenticated route that does not consume single-use signed links.
- Fix report export downloads failing with Craft’s “Invalid token” error by using a
downloadTokenquery param instead oftoken, which Craft 5.9+ reserves for route tokens. - Hash legacy report export download tokens in PHP during migration for MySQL/MariaDB/PostgreSQL compatibility instead of MySQL-only
SHA2(). - Kick Craft’s queue when polling queued report exports in the control panel, so large async exports progress instead of staying
pendingindefinitely on single-page report views. - Align spam keyword screening in
RunSpamChecksTaskwithSpamHelper, restoring[match:]/[ip:]rule support and field/global reference resolution in the submission workflow. - Skip client-side validation for fields disabled by conditional logic, and disable conditionally hidden submit buttons so Enter no longer triggers hidden submit/next actions. (#2727, #1136, Discussion #1628)
- Apply spam behaviour (success/message) without attempting to persist discarded spam submissions when Save spam submissions is disabled, avoiding failed saves under bot load. (#2818)
- Bound spam keyword scanning and spam log payloads so very large field values cannot stall PHP workers during spam handling. (#2065)
- Initialise captcha placeholders immediately when multipage forms change page via tabs or Ajax Next, so Friendly Captcha and other providers mount on the visible page before submit. (#1893)
- Tear down Cloudflare Turnstile widgets with
remove()during remounts and apply CSP nonces to dynamically loaded captcha scripts where available, reducing console noise on strict CSP hosts. (#2535) - Wait for reCAPTCHA Enterprise readiness before executing score/policy challenges on multipage navigation. (#2224)
4.0.0-beta.6
Added
- Add top-level Integrations control panel navigation for managing CRM, email marketing, element, and other payload integrations outside Settings.
- Add site-scoped integrations that can be created and edited on production environments (
allowAdminChanges = false). Existing integrations remain project-scoped and deploy via project config. - Add Display Type settings to File Upload fields: File Input (Simple) keeps the native browser input and uploads files on form submit; Upload Manager (Advanced) adds a drag-and-drop zone with async staged uploads, progress, remove, and reorder controls via Formie’s upload endpoints. Existing forms default to File Input (Simple). (#133, #2385, Discussion #1692)
- Expose
displayTypeon File Upload GraphQL field settings. - Add per-field Asset Data Retention settings to File Upload fields, allowing uploaded assets to be deleted after a configured duration while the submission record is kept. (#1715)
- Add File Upload asset retention and stale pending upload cleanup through Craft garbage collection and dedicated console commands.
- Add When integrations re-run settings (Integrations → Settings) with per-integration policies: once on submit (default), also when submission is edited, or custom trigger events. Integration conditions still apply. (#1429, #1724, #2591, #1970)
- Dispatch integrations on control panel submission saves when the re-run policy includes Control panel save, including bulk status changes and other direct element saves. CP submission edit saves continue to use the submission workflow without double-triggering. (Discussion #2253)
- Add
IntegrationTriggersservice as the single coordinator for workflow, control panel element saves, spam unmark actions, and manual integration runs. - Add
IntegrationExecutorservice to unify legacy and orchestrated integration step execution, including batched queue jobs. - Add
NotificationTriggersservice to coordinate status-change email notifications when submission statuses are updated. - Add Use Submission User as Author to Entry element integrations, assigning the collected submission user as the entry author when Collect User is enabled on the form. (#1363)
- HubSpot Map to Form integrations now resolve custom object
objectTypeIdvalues when submitting to HubSpot forms, including portal-specific custom objects (Enterprise). Refresh HubSpot forms after creating custom objects. (#2649) - Add Enable Conditions to form integration settings, allowing integrations to be triggered only when submission field and status rules match. (#447)
- Add Integration Dispatch form settings (Integrations → Settings) to run payload integrations sequentially, choose immediate vs queued execution per integration, control notification timing relative to integrations, and expose dispatch results via
{dispatch:handle:property}variables (for example{dispatch:user:url}). Dispatch variables appear in variable pickers when integration dispatch is enabled. (#2635, #1152, #2810) - Add per-notification Dispatch Timing (Advanced) to override the form’s integration dispatch notification timing.
- Add configurable Integration API Error Handling for Mailchimp and Campaign Monitor, classifying rate-limited and rejected payloads separately from operational failures. (#2172, #1990)
- Add
Integrations::EVENT_AFTER_TRIGGER_INTEGRATION_FAILEDfor handling integration failures outside the queue, and Send Email Alert for Failed Integration settings mirroring failed notification alerts. (Discussion #2579)
Changed
- Apply control panel submission sidebar fields (title, status, spam, mark as complete) during managed CP submission saves.
- Route all integration trigger entry points through
IntegrationTriggersinstead ofSubmission::afterSavehooks. - Consolidate legacy and orchestrated integration dispatch behind
IntegrationExecutor, using batchedTriggerIntegrationqueue jobs for queued steps. - Route status-change email notifications through
NotificationTriggersinstead of inline logic inSubmission::afterSave. - Deprecate Formie 3
Submissionsintegration and notification dispatch helpers when compatibility mode is enabled. UseNotifications,Integrations, andIntegrationTriggersinstead. - Remove unused
Integration::shouldTriggerOnSubmissionEdit()API (superseded by re-run policies). - Update phone number values sent to integrations to use
E164format instead of international formatting. (Discussion #2731) - Improve integration queue job descriptions and debug output with form context (
formId,formHandle,formTitle). (#2172) - Reorganise plugin settings: move integration behaviour settings to Settings → Behavior → Integrations, and move Use Queue for Notifications to Email Notifications.
- OAuth integration redirect URIs now default to a Craft action URL instead of a site URL. Add an optional OAuth Redirect URI Override plugin setting. (#1333)
Fixed
- Fix Opayo, Stripe, Paddle, and GoCardless payment integrations not resolving Billing Details field mappings from the form builder static table, so Name and Address fields are included in payment payloads again. (#2617)
- Fix Salesforce integrations failing after Craft 5 / Formie 3 upgrades when OAuth tokens were migrated without
instance_url, by falling back to stored integration settings and backfilling token values. (#2492) - Fix Salesforce integration refresh failing when an enabled object such as Opportunity or Case is unavailable in the connected org. (#1551)
- Fix Marketo OAuth connect failing when an empty
scopeparameter is sent with the client-credentials grant, and normalize API domains that include a trailing/restsegment. (#2718) - Fix Mailchimp integrations not exposing or formatting Address merge fields, which prevented mapping Formie Address fields to Mailchimp audiences that require
ADDRESSdata. (#2387) - Improve Pardot integration errors when an account does not support API v4 (legacy Pardot Classic). (#2642)
- Fix file upload assets being deleted when trashing a submission with File Uploads → Delete files enabled, so restored submissions keep their uploaded files. (#1258)
- Fix new File Upload fields defaulting to an empty Email Field Summary Value setting.
- Fix Signature fields intermittently showing a misleading “browser does not support” message on multi-page forms, conditional fields, and late layout by retrying canvas sizing, watching visibility changes, and showing accurate status copy when initialization fails. (#2708)
4.0.0-beta.5
Added
- Add a Template default value source for Hidden fields using sandboxed Craft object templates. Resolved server-side on render and submit; posted values are ignored. Custom Value behaviour is unchanged. (#2605)
- Add rich text editing for field Instructions, including Craft entry links with
target="_blank", configurable viarich-text.jsonunderfields.instructions. Legacy plain-text and markdown instructions are normalized automatically without migration. (#724) - Add Craft-style attribute maps and merge helpers for
setFieldSettings()field overrides, includingmergeInputAttributesandmergeContainerAttributes. (#2510) - Add a Note builder field for form-builder guidance with Tip, Warning, Info, and Error styles. (#2498)
- Add a Rich Text cosmetic field for WYSIWYG content in the form builder, configurable via
rich-text.jsonunderfields.content. (#1028, #1709, Discussion #2070, Discussion #772) - Add a syntax-highlighted HTML code editor for HTML cosmetic fields in the form builder, with project config via
html.json. (#2181) - Add an Allow Twig setting to HTML fields, controlling whether Twig is parsed when rendering field content. Twig runs in Formie’s sandboxed template environment, not Craft’s full CP template stack.
- Add a Custom Field form-builder field backed by opt-in Craft field adapters. (#2208)
- Add a Google Maps plugin support for Custom Field field. (#625)
- Add a Maps plugin field support for Custom Field field. (#626)
- Add Craft Link field support for Custom Field field, covering URL, email, phone and SMS link values. (#718)
- Add dynamic Option Source settings for Dropdown, Radio and Checkboxes, allowing options to be populated from predefined option sets and other structured sources. (#2684)
- Add integration option sources, allowing integrations to opt in and expose selectable remote option lists to Dropdown, Radio and Checkboxes fields. (#512)
- Add Mailchimp option sources for Interest Categories and Tags, using cached integration form settings and manual refresh actions from the field settings UI. (#512)
- Add CRM integration option sources for HubSpot (forms and CRM properties), Salesforce, Zoho, and Microsoft Dynamics 365 picklists. (#512)
- Add Template option source mode for developer-owned option lists supplied at render time without persisting or strictly validating an authoritative option list.
- Add a Use Searchable Dropdown setting for Dropdown fields, element relation fields when Display type is Dropdown, and Recipients when shown as a dropdown. The front end loads Formie’s
comboboxbrowser module so users can filter predefined options. (#960) - Add support for changing compatible field types in the form builder, initially limited to simple string-like fields such as Single-Line Text and Email Address. Existing submissions are not rewritten. (Discussion #2110)
- Add Settings → Fields → Field Builder policy settings for Allow Multi-Select Dropdowns and Allow Phone Country Selector. When disabled, the corresponding field settings are hidden in the form builder and forced off on existing fields. (Discussion #2484, Discussion #2485)
- Expose the Allow Public Asset Volumes plugin setting in Settings → Fields, controlling whether File Upload fields can use public asset volumes and whether Public URL is available as an email summary value.
- Add Date Range collection to Date/Time fields when Display Type is Calendar (Advanced), using Flatpickr range mode to collect a start and end date/time. (#2011)
- Add an
includeFlatpickrCssplugin setting to disable Formie’s bundled Flatpickr stylesheet when your project already provides its own. (#2341) - Add notification variable selectors for date ranges, including Start Date/Time, End Date/Time, Start Date, Start Time, End Date, and End Time.
- Add GraphQL content types for date range submissions with
startandenddatetime values. - Add calendar date validation for Date/Time Text Inputs and Dropdowns, rejecting impossible dates (for example February 31), enforcing configured Min Date / Max Date settings on those display types, and surfacing validation errors on the offending sub-field. (#1458)
- Add smart State / Province behaviour for Address fields, with Text or Dropdown when available input modes, country-dependent subdivision loading, dynamic labels (State, Province, Prefecture, and so on), optional hiding when unused, searchable dropdowns, and datalist suggestions for text fallback. (#1416)
- Add a subdivisions endpoint (
formie/address/subdivisions) andModifyAddressSubdivisionsEventfor country-dependent state/province option data. - Add an
address-statebrowser module with lazy subdivision loading, loading UX (country spinner and state skeleton), and password-manager/browser autofill reconciliation via a persistentaddress-level1anchor input. - Add Allowed Countries and Preselect Country from IP settings to Address fields, mirroring Phone field country restrictions and using a shared
formie/address/country-from-ipendpoint (CDN geo headers such asCF-IPCountry). - Add Preselect Country from IP to Phone fields when the country selector is enabled, wiring
intl-tel-inputgeo lookup through the shared country-from-ip endpoint. - Add table column reference support for Calculations fields with explicit row scope (
first,last,index,all,count, custom row expressions). Table columns now appear in the Calculations variable picker, with row targeting configured in the variable settings popover. (#1284) - Add Settings → Synced Fields as a read-only audit page listing shared field definitions and the forms they appear on, with a View usage link from synced fields in the form builder. (#2377)
Changed
- Refactor predefined options to align with the new option sources system.
- Improve HTML and Rich Text cosmetic field builder previews and control panel submission views to show rendered output instead of raw source where appropriate. (#2182)
- Render HTML field builder previews inside a sandboxed iframe so control panel styles do not bleed into preview content.
- Render HTML field Twig through Formie’s sandboxed template service instead of Craft’s unrestricted
renderString(), and default Allow Twig to off for new HTML fields. - Respect Include in Email Field Summaries for cosmetic fields in
{allFields},{allContentFields}, and{allVisibleFields}instead of always excluding them. - Update
@verbb/plugin-kit-reactto 1.0.4 for the CodeMirror-based HTML editor,codeEditorSchemaForm field registration, and live Rich Text preview rendering viaTiptapContent. - Normalise Address sub-field browser selectors to the
data-formie-address-*namespace, with legacy short-selector fallbacks for older saved forms and address provider modules. - Default new Address field layouts to place Country before State / Province so dependent subdivision loading works out of the box.
- Map Freeform Rich Text fields to Formie Rich Text rather than HTML during migration.
- Replace the Dropdown, Radio and Checkboxes option-table Disabled column with a row-menu Visible / Hidden / Disabled availability control (#1816). Hidden removes an option from the front-end form while preserving stored submission values and labels; Disabled renders the option with HTML
disabledso it stays visible but cannot be selected. Legacydisabled: trueoption rows are treated as hidden. Non-default states are indicated in the options table with row background tints. - Centralise front-end option filtering in
OptionsField::getFieldOptions()so hidden options are excluded consistently (including Dropdown placeholders). - Format Date/Time values consistently for notifications, summaries, exports, and string output using the field's Date Format and Time Format settings. Casting a normalized date value object to string now matches
getFieldValueAsString(). - Update integration field mapping to accept Date/Time reference values with
text,date, andnumbertypes. - Move Agree field checked/unchecked display labels to the Settings tab and clarify that submissions store a boolean; use
getFieldValueAsString()for Yes/No-style output. (#2288) - Normalise submission values by trimming leading and trailing whitespace during field normalization for single-line text, ema...
4.0.0-beta.4
Added
- Add conditional submission status rules in the form builder Settings → Submissions tab, evaluated on the front end during submission processing. (#508)
- Add repeater sub-field reference support with explicit row scope (
first,last,index,all,count, custom row expressions) for variable tokens, notifications, conditions, and integrations. Repeater nested fields now appear once in the variable picker, with row targeting configured in the variable settings popover. (#1728, #1255, #2099, #1888, #2338) - Add conditional redirect rules under Behaviour → After Submit, with an optional Enable Redirect Rules toggle that overrides the default submit action when conditions match. (#830)
- Add failed notification alert recipients by Craft user group and additional email addresses. (#2226)
- Add per-rule validation message overrides via a Validation form builder tab and the
validationMessagesfield setting, with legacyerrorMessagevalues migrated tovalidationMessages.required. (#1269) - Add plugin-wide default validation message templates under Settings → Defaults → Field Defaults.
- Add
ValidationMessagesHelperand clientdata-formie-validation-{key}-messageattributes for overridden validation copy on the front end. - Add unique-value, match-field, text-limit, number-limit, email-format, blocked-domain, options-limit, and file-upload validation message overrides on supported field types. (#1475)
Changed
- Move field validation settings from the Settings tab into the Validation tab across all field types.
- Standardize validation message placeholders to
{label}across PHP validators, front-end validators, and translations (legacy{name}/{attribute}aliases remain at runtime). - Replace text-limit counter
{startTag}{num}{endTag}translation strings with Craft plural syntax and wire translated counter copy on the front end. (#2526) - Show context-aware text-limit counter copy for empty (allowed), under-limit (left), and over-limit states on the front end and in control panel submissions.
- Add per-field validation error position on the Appearance tab, with form- and plugin-level defaults (
Above Input/Below Input). - Resolve nested Date/Name/Address sub-field validation messages from their parent field; stop copying legacy
errorMessageonto Date sub-fields. - Wire client-side validation message overrides for file-upload and checkbox/radio options-limit rules via
data-formie-validation-*-messageattributes. - Extend front-end
t()to resolve Craft-style{param, plural, …}and{param, number}message syntax.
Fixed
- Fix option field values appearing empty in notification “All Form Fields” summaries when options were overridden via Twig
setFieldSettings(), by applying persisted submission snapshots when loading forms for email/export and falling back to stored option values when labels cannot be resolved. (#2350) - Fix submission status filters in the control panel returning no results when submissions were saved without a persisted
statusId, and resolve status queries by display name as well as handle. (#2687) - Sanitize notification queue job debug data to valid UTF-8 before re-serializing failed jobs, preventing queue rows from becoming unreadable when submission content contains invalid byte sequences. (#2344)
- Improve notification mailer failure logging when Craft returns no transport error message, including CLI/queue context to help diagnose cron-only send failures. (#2610)
4.0.0-beta.3
Added
- Add a configurable field palette for the form builder, with drag-and-drop group and field organisation, per-field enable/disable, and optional palette label overrides. Replaces the legacy Disabled Field Types settings checkboxes. (#2209)
- Add a stock Form Preview slide-out in the form builder, rendering the current form with Formie’s default templates, CSS, and JavaScript. (#370)
- Add synced-field support for stencils, preserving shared definition links when creating new forms from a stencil. (#1677, #1734)
- Add stencil scopes so developers can ship starter forms in project config while content editors can create and manage their own stencils in the control panel. (#2814)
- Add project stencils (stored in
formie.stencilsproject config) alongside regular database-backed stencils, with handles unique across both scopes. - Add the
formie-accessStencilspermission for managing stencils in the control panel. - Add read-only viewing of project stencils when admin changes are disabled, with Save a copy to create an editable stencil.
- Add a Type column to the stencils index, showing Project for project stencils only.
- Add Form Groups for control panel organisation. (#1039, #662)
- Add a dedicated Settings → Defaults control panel page for form, field, and notification defaults. (#863)
- Add structured
formDefaults,fieldDefaults, andnotificationDefaultsplugin settings, applied when new forms, fields, and notifications are created. - Add
supportedDefaults()and schema extraction for field-type defaults, with Date, File Upload, Phone, Agree, Single-Line Text, Multi-Line Text, Email, Number, Hidden, Radio, Checkboxes, and element fields (Entries, Categories, Users, Tags, Products, Variants) as supported field types. - Add Field Defaults developer documentation for third-party field authors.
- Add schema-driven form and notification defaults extracted from the form builder and notification schemas, including a PDF template default for new notifications.
- Add captcha integration defaults for new forms and stencils via
integrationDefaults. - Add a migration to move legacy
defaultFileUploadVolume,defaultDateDisplayType,defaultDateValueOption, anddefaultDateTimesettings intofieldDefaults. - Track and display who created and last updated a form in the form builder Settings tab footer and as optional forms index columns. (Discussion #2342)
- Add submission UID to the control panel submission sidebar and as an optional submissions index column. (#2404)
- Add an Autocomplete setting to single-line and multi-line text fields in the form builder Settings tab, with a searchable list of HTML autocomplete tokens. (Discussion #2764)
- Document using
{env:FORMIE_*}environment variable tokens in notification recipient fields. (#2676) - Add an opt-in setting to disable the submit button until the current page passes validation. (#1514)
- Add a page setting to place the submit button at the end of the last field row. (#2542)
- Add regression tests for required File Upload fields submitted via GraphQL with base64 file data. (#1130)
- Add control panel submission field condition behaviour with plugin and per-form settings to follow, collapse, or ignore front-end field and page conditions when editing submissions. (#2435)
Changed
- Replace Settings → Fields disabled-field checkboxes with the new field palette editor.
- Move stencil management from Settings to Formie → Stencils, including create, edit, and index routes under
formie/stencils/*. Legacyformie/settings/stencils/*URLs redirect to the new paths. - Change Save as stencil from the form builder to always create an editable, database-backed stencil.
Fixed
- Fix legacy upgrade migrations failing on fresh Craft 5 installs that never had Craft’s
contentorformie_tokenstables. - Fix form usage counts and the form builder Usage tab omitting entries on disabled Craft sites. (#2612)
- Fix the form builder Usage tab not listing elements that reference a form on non-primary sites, including when Craft stores a relation without a specific
sourceSiteId. (#2695) - Prompt for confirmation when closing a field settings overlay with Escape (or backdrop/header close) only when the field has unsaved changes. Untouched new fields close immediately. (#2219)
- Fix dropdown field options not saving in the form builder when no default option is selected. (#2795)
- Validate literal email addresses in notification recipient settings so invalid addresses are caught when saving notifications. (#2712)
- Skip notification email attachments when the asset file cannot be read, instead of failing the entire send. (#2626)
- Fix replacing a deleted field with a new field using the same handle requiring a two-step save in the form builder. (#1854)
- Fix submit button conditions not applying on the front end. (#2568)
- Fix checkbox fields saving their default option values when explicitly unchecked on submit. (#2457)
- Fix missing page-list validation indicators in the form builder when a form has no pages. (#2786)
- Add a default country setting for Google Places address auto-complete fields. (#2721)
- Fix email notification preview failing when a recipient setting references a non-email field. (#2537)
- Add a configurable maximum email attachment size, and validate notification attach assets in the form builder. (#2697)
- Fix file upload validation allowing extensions such as
.jfifthat Craft cannot save as assets. (#2716) - Fix the Dutch translation mapping
AutotoAutomatisch, which incorrectly changed checkbox labels and values meaning “car”. (#2636) - Generate translatable date picker placeholders from the configured date and time formats when no custom placeholder is set. (#2464)
- Fix File Upload fields failing on submit when no upload location is set, by requiring the setting in the form builder and falling back to the plugin default volume when configured. (#2597)
- Fix Ajax and multi-page File Upload fields losing their uploaded-file summary after step navigation or when editing existing submissions. (#2742, #1856, #1910)
- Fix File Upload fields inside Repeater or Group fields not initializing upload persistence for nested inputs. (#1448)
3.1.28
Added
- Add support for siteId for Solspace Calendar integration mapping.
Changed
- Formie Settings now enforce an “Access Settings” user permission.
- Update EmailOctopus API handling.
Fixed
- Fix Stripe payment errors so short messages are shown instead of an empty string.
- Fix integration connection handling and showing the “Connected”/“Not connected” text.
- Fix Date field input min and max attributes.
- Fix Group/Repeater fields and their condition evaluation handling for email templates.
- Fix success message at “Bottom of Form” behaviour.
- Fix Hidden field variable processing.
- Fix Safari-visible Formie init event handling.
4.0.0-beta.2
Fixed
- Fix front-end JS/CSS build issues.
- Fix
ModifyFrontendJsTranslationsEventnaming.
4.0.0-beta.1
Added
- Add a Formie 3 to Formie 4 migration path for existing Craft 5 projects.
- Add direct Formie 2 to Formie 4 migration support, allowing Craft 4 projects to move to Craft 5 without upgrading through Formie 3 first.
- Add Formie 4 Compatibility Mode, enabled by default, to bridge selected Formie 3 class aliases, event owners, custom field schema methods, field config keys, theme config keys, and legacy front-end event listeners during upgrades.
- Add the new React-powered form builder foundation.
- Add schema-driven integration settings for the form builder via
Integration::defineFormSettingsSchema(),Integration::getFormSettingsSchema(),Integration::EVENT_MODIFY_INTEGRATION_FORM_SETTINGS_SCHEMA, andModifyIntegrationFormSettingsSchemaEvent. - Add
Notifications::EVENT_MODIFY_NOTIFICATION_SCHEMAfor modifying notification schemas. - Add a new staged submission workflow service (
SubmissionWorkflow) withprepare,normalize,validate,screen,authorize,save,dispatch, andfinalizestages. - Add submission workflow process modes for normal submits, existing-submission edits, save-draft requests, and payment replays.
- Add submission workflow extension events:
EVENT_REGISTER_WORKFLOW_STAGES,EVENT_REGISTER_STAGE_TASKS,EVENT_BEFORE_STAGE,EVENT_AFTER_STAGE,EVENT_BEFORE_TASK, andEVENT_AFTER_TASK. - Add
SubmissionRequestEvent,SubmissionWorkflowStageEvent,SubmissionWorkflowTaskEvent,RegisterWorkflowStagesEvent, andRegisterStageTasksEvent. - Add workflow enums for stage and task names, including tasks such as
screen.runCaptchaChecks,save.processPayments,dispatch.sendNotifications, anddispatch.triggerIntegrations. - Add database-backed temporary submission state, incomplete submission state, saved drafts, and resume-token handling.
- Add save-and-resume retention settings including
submissionStateRetentionDays,saveResumeTokenTtlDays, andmaxSavedDraftsPerSession. - Add anonymous client bootstrap and refresh rate-limit settings:
anonymousClientBootstrapRateLimit,anonymousClientRefreshRateLimit, andanonymousClientRateWindowSeconds. - Add static-cache token refresh handling with
staticCacheRefreshOnLoad. - Add
setOnlyCurrentPagePayloadfor limiting submitted multi-page payload handling to the current page. - Add
plainTextHtmlSanitizationModefor controlling plain-text HTML sanitization behavior. - Add
useCssLayersfor optionally outputting Formie CSS with CSS layers. - Add a Formie-native submission content manager, normalizer, serializer, and accessor layer.
- Add field definition metadata APIs and traits for Formie-owned field definitions.
- Add
Field::getDescription()description sections for field value, structure, component, behavior, references, and conditions metadata. - Add
Field::themeConfigKey()for resolving canonical theme config field keys. - Add
Field::defineValueForReference(),Field::getValueForReference(),Field::defineValueForReferenceBlock(), andField::getValueForReferenceBlock()as the canonical field reference value APIs. - Add
Field::defineValueForCondition()andSubmission::getFieldValueForCondition()for condition-specific value projection. - Add
Field::getCpEditHtml()as the canonical CP submission edit rendering contract. - Add
Field::defineFieldSlotTag()andSlotTagfor field slot tag customization. - Add
Form::EVENT_MODIFY_SLOT_TAG,Field::EVENT_MODIFY_SLOT_TAG, andIntegration::EVENT_MODIFY_SLOT_TAG. - Add
ModifyFormSlotTagEvent,ModifyFieldSlotTagEvent, andModifyIntegrationSlotTagEvent. - Add
Field::EVENT_MODIFY_VALUE_FOR_REFERENCEandField::EVENT_MODIFY_VALUE_FOR_REFERENCE_BLOCK. - Add
ValueContext::array(),ValueContext::reference(), andValueContext::referenceBlock(). - Add
craft.formie.parseValue()andcraft.formie.parseContent()for parsing field-reference values in Twig. - Add
craft.formie.formAssets()for form-scoped asset output. - Add
craft.formie.frontendAssets()for shared front-end asset output. - Add new
FormTemplateoutput locations:PAGE_HEADER,PAGE_FOOTER,INSIDE_FORM, andMANUAL. - Add
initJsanduseObserverrendering options for controlling Formie front-end initialization. - Add client/server rendering services for Formie-managed HTML and client-rendered consumers, including
ClientSessionService,FormBootstrapBuilder,FormDefinitionBuilder,ClientModuleManifestBuilder, andServerRenderPayloadBuilder. - Add client request/response models including
FormSession,LoadContext,FormDefinition,FormBootstrap,SubmitRequest,PageTransitionRequest,SessionRefreshRequest, andSubmitResult. - Add client controllers for loading forms, changing pages, refreshing sessions, and submitting client-rendered forms.
- Add
FrontendAssetsas the canonical shared front-end asset service. - Add
ClientModule,ClientModuleContext, andRenderFramemodels. - Add
IntegrationInterface::getClientModule()for front-end module registration by integrations, captchas, address providers, and payments. - Add
ClientModulemanifests with render-target metadata for front-end module hydration. - Add
hydrateFormieModules()support for hydrating individual Formie modules without mounting a full form client. - Add the
@verbb/formie-corepackage for framework-agnostic form definitions, transports, field helpers, conditions, calculations, and client-rendered form state. - Add the
@verbb/formie-browserpackage as Formie’s canonical browser runtime for server-rendered forms. - Add the
@verbb/formie-reactpackage withFormieForm,FormieClientForm,useFormieHtml(),useFormieClient(),useFormie(),useFormieField(),useFormiePage(),useFormieInstance(), anduseFormieSlot(). - Add the
@verbb/formie-vuepackage with matching server-rendered and client-rendered Vue APIs. - Add the
@verbb/formie-web-componentspackage withformie-form,formie-core-form,registerFormieWebComponents(),FormieRegistry, andcreateFormieRegistry(). - Add REST and GraphQL transports for client-rendered forms.
- Add
createFormieClient(),formie(),FormieValidator,ModuleRegistry,defineCaptchaModule(),definePassiveCaptchaModule(),definePaymentModule(), anddefineAddressModule()to the browser package. - Add browser CSS exports for Formie’s base, theme, and combined CSS.
- Add canonical
formie:*browser events for mount, unmount, validation, submit, page navigation, token refresh, state reset, field modules, address modules, payment modules, and submission workflow stages. - Add the canonical
formie:client:readyevent. - Add page-level client analytics output via
data-formie-client-event. - Add GraphQL
formieHtmlFormfor server-rendered HTML form payloads. - Add GraphQL
formieClientFormfor client-rendered form definitions and sessions. - Add GraphQL mutations for client-rendered form submit, page changes, and session refresh.
- Add GraphQL
runtimePayload/client payload support built from the shared front-end payload builder. - Add GraphQL schema scope enforcement for handle-based client form reads and lifecycle mutations.
- Add support for nested GraphQL field builders to read stored row configs for Group, Repeater, and Table-style fields.
- Add request-local caches for form lookups, field metadata, field config settings, client module manifests, integration lists, submission status handles, and GraphQL field metadata.
- Add synced-field storage split between shared field definitions and per-form field placements.
- Add migration support for synced-field definitions and placements.
- Add blocking validation for synced-field handle collisions instead of silently renaming handles.
- Add support for detaching synced fields.
- Add field-reference preservation for unresolved historical submission content when fields are removed or layouts change.
- Add support for preserving Name field multi-part layout values when field modes change.
- Add
SubmissionQuery::invalidateStaticCaches()for long-running workers after form/field mutations. - Add
Formie::$plugin->getFactories()for programmatic form and submission builders. - Add security regression guard tests.
- Add a performance harness for submission query and field-graph scenarios.
- Add integration field-mapping regression coverage across complex and nested field values.
- Add Formie 4 plugin docs, migration docs, developer docs, and front-end package docs.
- Add React, Vue, Web Components, Next.js, and Nuxt starter projects for the new front-end package stack.
- Add Craft-rendered starter examples for Barba.js, Sprig, and Datastar.
- Add
@verbb/plugin-kitand@verbb/plugin-kit-reactas the shared control panel UI foundation used by Formie’s React builder.
Changed
- Require Craft CMS 5 and PHP 8.2+.
- Rework Formie’s form builder around React, schema-driven settings, and shared Plugin Kit React components.
- Rework Formie’s front-end JavaScript from the old bundled theme/runtime model to package-based browser and framework runtimes.
- Split Formie’s front-end rendering model into server-rendered forms and client-rendered forms.
- Move Formie browser JavaScript and CSS into
@verbb/formie-browser. - Rename
@verbb/formie-domto@verbb/formie-browser. - Replace old Formie JavaScript callback names and validator events with canonical
formie:*DOM events. - Move the public ready event from
formie:runtime:readytoformie:client:ready. - Move runtime/client PHP namespaces toward
clientnaming, while keeping selectedruntimeclass aliases in Compatibility Mode. - Rename runtime JS translation hooks to frontend JS translation hooks:
Rendering::EVENT_MODIFY_FRONTEND_JS_TRANSLATIONS,ModifyFrontendJsTranslationsEvent, andRendering::getFrontendJsTranslations(). - Replace
RuntimeModuleandRuntimeModuleContextterminolog...
3.1.27
Added
- Add extra logging to GoCardless.
- Add submission user details to automation payloads when available.
- Add
formie/repair/emoji-shortcodesconsole command. - Add french translations.
Fixed
- Fix Stripe ACH payments stuck in processing state.
- Fix Eway payment front-end rendering.
- Fix GoCardless payment creation for accounts without custom references.
- Fix Hidden field Twig evaluation for request-derived defaults.
- Fix Mollie and GoCardless front-end handling, producing unload warnings.
- Fix Craft 5 migration table-prefix handling for legacy Formie content tables.
- Fix bulk deletion for spam and incomplete submissions.
- Fix Recruitee integration not correctly mapping file fields.
- Fix an issue when using element index actions to change submission status.
- Fix Craft 5 migration for emoji’s.
- Fix some fields handling in the Twig sandbox evaluation.