a:2:{i:0;a:2:{s:3:"cms";a:4:{s:6:"status";s:8:"eligible";s:8:"releases";a:5:{i:0;a:4:{s:7:"version";s:8:"5.12.0.1";s:8:"critical";b:0;s:5:"notes";s:81:"
- Fixed a bug where icon pickers were showing duplicate icons.
";s:4:"date";s:19:"2026-11-03T00:00:00";}i:1;a:4:{s:7:"version";s:6:"5.12.0";s:8:"critical";b:0;s:5:"notes";s:40166:"MCP and OAuth
- Added an authenticated HTTP MCP server, which MCP clients can connect to after a user signs in and authorizes them via OAuth. Clients act as that user, within their permissions and the access level they grant (read only, read and write, or full access for admins). (#20145, #20189)
- The authenticated MCP server’s endpoints default to
/{cpTrigger}/mcp and /{cpTrigger}/mcp/auth, or /mcp and /mcp/auth when public registration is enabled. Endpoints within the control panel can only be used by users with control panel access. (#20189)
- Added a public HTTP MCP server, which exposes only the capabilities and content approved from Settings → MCP, without signing in. Its endpoint defaults to
/mcp. (#20145, #20189)
- The HTTP MCP servers are discoverable via
/.well-known/ai-catalog.json and a Server Card at <endpoint>/server-card, per SEP-2127. Servers on control panel URLs are never advertised, and the authenticated server is only advertised when public registration is enabled. (#20283)
- Added the
mcp/serve command, which runs a stdio MCP server acting as a given user. (#20145)
- Added Settings → MCP, where administrators can enable the authenticated and public MCP servers, set their endpoints, and approve the capabilities and content that the public server exposes. (#20145, #20189)
- Added support for
config/mcp.php and config/oauth.php config files. (#20145)
- Added the
oauth/generate-keys command, which generates the keys used to sign OAuth access tokens. (#20145)
- Added an OAuth authorization server, with discovery metadata, dynamic client registration, PKCE, and refresh token rotation, which the MCP servers and GraphQL API use. (#20145)
- Dynamic OAuth client registration is limited to 10 clients per IP address per hour by default, via the new
registrationRateLimit and registrationRateLimitDuration OAuth config settings. (#20303)
- Garbage collection now deletes expired and revoked OAuth authorization codes and tokens, and registered OAuth clients that were revoked or never authorized. (#20303)
- Plugins can register MCP capabilities via
craft\services\Mcp::EVENT_REGISTER_CAPABILITY_TYPES, OAuth resources via craft\services\OAuth::EVENT_REGISTER_RESOURCES, and personal access token scopes via craft\services\PersonalAccessTokens::registerScopeGroup(). (#20145, #20147)
- Added
craft\base\ApplicationTrait::getOAuth(). (#20145)
- Added
craft\base\InputSchemaFieldInterface. (#20145)
- Added
craft\config\McpConfig. (#20145)
- Added
craft\config\OAuthConfig. (#20145)
- Added
craft\events\RegisterOAuthResourcesEvent. (#20145)
- Added
craft\gql\GqlInputSchema. (#20145)
- Added the
craft\mcp and craft\oauth namespaces. (#20145, #20147)
- Added
craft\services\Config::CATEGORY_MCP. (#20145)
- Added
craft\services\Config::CATEGORY_OAUTH. (#20145)
- Added
craft\services\Config::getMcp(). (#20145)
- Added
craft\services\Config::getOAuth(). (#20145)
- Added
craft\services\Mcp. (#20145)
- Added
craft\services\OAuth. (#20145)
- Added
craft\utilities\ClearCaches::clear(). (#20145)
- Plain Text, Email, Link, Number, Money, Lightswitch, Date, Time, Color, Country, Table, and option fields now implement
craft\base\InputSchemaFieldInterface. (#20145)
Personal Access Tokens
- Added the My Account → Tokens screen, where users can create personal access tokens for the APIs that offer them (such as the GraphQL API), rename them, and revoke tokens and the apps they’ve authorized. (#20147)
- MCP clients that users have authorized are listed on their My Account → Tokens screen, where they can be revoked. (#20291)
- Added
craft\base\ApplicationTrait::getPersonalAccessTokens(). (#20147)
- Added
craft\services\PersonalAccessTokens. (#20147)
GraphQL
- GraphQL API requests can now be authenticated with OAuth access tokens, granting access to the content the authorizing user has permission to access. (#20147)
- GraphQL schema components can now support authenticated requests via an
authenticated key on their config. (#20147)
- Added the
currentUser GraphQL query, which returns the user that authenticated the request. (#20147)
- GraphQL schemas can now include read-only components for sites, sections, entry types, volumes, user groups, category groups, and tag groups. (#20055)
- Added the
sites, site, sections, section, entryTypes, entryType, volumes, volume, userGroups, userGroup, categoryGroups, categoryGroup, tagGroups, and tagGroup GraphQL queries, which are available when the schema includes the corresponding components. (#20055)
- Elements now have
site fields in GraphQL, when the schema includes the “Query for sites” component. (#20055)
- Entries now have
section and type fields in GraphQL, when the schema includes the “Query for sections” and “Query for entry types” components. (#20055)
- Assets now have
volume fields in GraphQL, when the schema includes the “Query for volumes” component. (#20055)
- Users now have
groups fields in GraphQL, when the schema includes the “Query for user groups” component. (#20055)
- Categories and tags now have
group fields in GraphQL, when the schema includes the “Query for category groups” and “Query for tag groups” components. (#20055)
- Added
craft\elements\db\EagerLoadPlan::$configureQuery. (#20147)
- Added
craft\gql\base\ElementMutationResolver::requireUserAuthorization(). (#20147)
- Added
craft\gql\queries\Settings. (#20055)
- Added
craft\gql\types\CategoryGroup. (#20055)
- Added
craft\gql\types\EntryType. (#20055)
- Added
craft\gql\types\Section. (#20055)
- Added
craft\gql\types\Site. (#20055)
- Added
craft\gql\types\TagGroup. (#20055)
- Added
craft\gql\types\UserGroup. (#20055)
- Added
craft\gql\types\Volume. (#20055)
- Added
craft\helpers\Gql::getSchemaUser(). (#20147)
- Added
craft\models\GqlSchema::$user. (#20147)
- Added
craft\services\Gql::getOAuthResource(). (#20147)
- Added
craft\services\Gql::getSchemaForUser(). (#20147)
- Added
craft\services\Gql::SCOPE_READ. (#20147)
- Added
craft\services\Gql::SCOPE_WRITE. (#20147)
Multi-Site Editing
- Element edit pages now have a “Sites” pane in their sidebars on multi-site installs, in place of the “Status” pane, which lists the sites the element is saved to (that the user can edit), with status toggles and links to the element in each site, and lets authors add the element to other sites. (#20061)
- Element editor slideouts can now be switched to other sites, by clicking on a site name within the “Sites” pane. (#20061)
- Sites that are added to elements within the “Sites” pane can now be removed again. (#20061)
- Element edit pages’ sidebar pane headings now line up with the labels within the panes. (#20061)
- Deleting an element for the only site it exists in now soft-deletes it, unless it’s a draft or nested element. (#20060)
- Added
craft\base\Element::showSitesField(). (#20061)
- Added
craft\base\Element::sitesFieldHtml(). (#20061)
elements/save-draft action responses now include a canDeleteForSite key. (#20061)
Assets
- Assets are now initially saved to the site they were uploaded from. (#20060)
- Volumes now have a “Propagation Method” setting, which can be set to “Let each asset choose which sites it should be saved to”. New volumes default to this, as do existing volumes on single-site installs. Existing volumes on multi-site installs continue to save assets to all sites. (#20060)
- Assets in volumes set to let each asset choose which sites it should be saved to now have a “Sites” pane in their edit pages’ sidebars. (#20060)
- Assets in volumes set to let each asset choose which sites it should be saved to can now be deleted for individual sites, as long as they exist in another site. (#20060)
- Files can now be uploaded to Assets fields by pasting them from the clipboard while the field has focus. (#20183, #20212)
- Added support for JPEG XL (
.jxl) images, when ImageMagick supports it. JPEG XL images can now be uploaded, transformed, and set as a transform’s output format.
- BMP images can now be transformed and edited in the Image Editor.
- Craft can now determine the dimensions of BMP and JPEG XL images on remote volumes without downloading them.
- Added the “Markdown” file kind, and
md and markdown are now included in the default allowedFileExtensions config setting value. Markdown files can be previewed with syntax highlighting. (#20089)
- Added
craft\elements\Asset::KIND_MARKDOWN. (#20089)
- Added
craft\models\Volume::$propagationMethod. (#20060)
- Added
craft\services\Images::getSupportsBmp().
- Added
craft\services\Images::getSupportsJxl().
- Added
Craft.BaseUploader::addFiles(). (#20183, #20212)
Craft.BaseUploader now supports a pasteZone setting. Files pasted while focus is within it are passed to addFiles(), which custom uploader classes must implement to support pasted files. (#20183, #20212)
craft\services\Assets::getAssetById() now returns the asset in another site if it doesn’t exist in the current site, when no site ID is passed. (#20060)
Addresses
- Addresses within Addresses fields can now be edited from drafts of their owner elements, by users who can save the drafts but not the canonical owner elements. (#19881)
- Addresses now support drafts.
Color Fields
- Color fields now support translucent colors. Authors can choose translucent palette colors, and set custom colors’ opacity when the field allows it, via the color picker in browsers that support it or by entering an 8-digit hex value. (#8983, #20274)
- Color fields’ palette colors can now have an alpha channel, by entering an 8-digit hex value or via the color picker in browsers that support it. (#8983, #20274)
- Color fields now have an “Allow opacity for custom colors” setting. (#8983, #20274)
- Color fields now have a “GraphQL Mode” setting, which can be set to “Full data” or “Hex only”. New Color fields default to “Full data”, and existing Color fields default to “Hex only”. (#8983, #20274)
- Color field values’
hex properties and GraphQL values now include an alpha channel (e.g. #0000ff80) when the color isn’t fully opaque. Fully-opaque colors are still output as 6-digit hex values. (#8983, #20274)
- Color field values now have
alpha, rgba, hsla, rgbChannels, oklch, and contrastColor properties, and a contrastRatio() method. (#8983, #20274)
- Color fields set to the “Full data” GraphQL mode now return objects with
hex, label, red, green, blue, alpha, hue, saturation, lightness, luma, rgb, rgba, rgbChannels, hsl, hsla, oklch, contrastColor, and contrastRatio fields. (#8983, #20274)
- Added
craft\fields\Color::$allowCustomAlpha. (#8983, #20274)
- Added
craft\fields\Color::$fullGraphqlData. (#8983, #20274)
- Added
craft\fields\data\ColorData::getAlpha(). (#8983, #20274)
- Added
craft\fields\data\ColorData::getContrastColor(). (#8983, #20274)
- Added
craft\fields\data\ColorData::getContrastRatio(). (#8983, #20274)
- Added
craft\fields\data\ColorData::getHsla(). (#8983, #20274)
- Added
craft\fields\data\ColorData::getOklch(). (#8983, #20274)
- Added
craft\fields\data\ColorData::getRgbChannels(). (#8983, #20274)
- Added
craft\fields\data\ColorData::getRgba(). (#8983, #20274)
- Added
craft\gql\types\ColorData. (#8983, #20274)
- Added
craft\gql\types\generators\ColorDataType. (#8983, #20274)
- Added
craft\validators\ColorValidator::$allowAlpha. (#8983, #20274)
craft\fields\data\ColorData::getHex() now has a $withAlpha argument, which defaults to true. (#8983, #20274)
craft\validators\ColorValidator::normalizeColor() now expands 4-digit hex values to 8 digits, and removes fully-opaque alpha channels from 8-digit hex values. (#8983, #20274)
Icon Fields
- Icon pickers can now include icons from custom icon sets. (#17101, #20277)
- Icon fields now have an “Icon Sets” setting, when any custom icon sets are registered, which determines which icon sets are selectable and in what order. (#17101, #20277)
- Added the
customIconPath config setting, which registers a “Custom” icon set made up of the SVG files within a directory, such as @config/icons. (#17101, #20277)
- Icon field values now have a
set property, set to the handle of the custom icon set the icon was selected from (or null for Font Awesome icons). (#17101, #20277)
- Icons selected from custom icon sets are stored as
set-handle:icon-name. (#17101, #20277)
IconData GraphQL objects now have set, svg, and keywords fields. (#17101, #20277)
- Icon field values now have
getSvg() and getKeywords() methods. (#17101, #20277)
- Plugins can register custom icon sets via
craft\services\Icons::EVENT_REGISTER_ICON_SETS. (#17101, #20277)
- Added
craft\base\ApplicationTrait::getIcons(). (#17101, #20277)
- Added
craft\events\RegisterIconSetsEvent. (#17101, #20277)
- Added
craft\fields\data\IconData::$set. (#17101, #20277)
- Added
craft\fields\data\IconData::getKeywords(). (#17101, #20277)
- Added
craft\fields\data\IconData::getSvg(). (#17101, #20277)
- Added
craft\fields\Icon::$iconSets. (#17101, #20277)
- Added
craft\icons\DirectoryIconSet. (#17101, #20277)
- Added
craft\icons\IconSet. (#17101, #20277)
- Added
craft\services\Icons. (#17101, #20277)
craft\helpers\Cp::iconSvg() now supports set-handle:icon-name values. (#17101, #20277)
Craft.IconPicker now supports a sets setting, which can be set to an array of icon set handles (fontawesome for Font Awesome), or '*' for all icon sets. (#17101, #20277)
Custom Fields
- Custom fields now have “Default Tip” and “Default Warning” settings. (#19976)
- Added
craft\base\FieldTrait::$tip.
- Added
craft\base\FieldTrait::$warning.
- Added
craft\fieldlayoutelements\BaseField::defaultTip().
- Added
craft\fieldlayoutelements\BaseField::defaultWarning().
Templating
- Added the
{% render %} Twig tag. (#19988)
{% render %} tags and render() methods are allowed within the Twig sandbox. (#19988)
- The
capitalize, lower, title, and upper Twig filters now have language arguments, which default to the current application language. (#19558)
- Added
craft\base\Renderable. (#19988)
- Added
craft\helpers\Template::render(). (#19988)
- Added
craft\i18n\Locale::languageId().
Illuminate\Support\Collection now has a render() macro, which replaces craft\elements\ElementCollection::render(). (#19988)
craft\helpers\ElementHelper::normalizeSlug() now has a $language argument, which defaults to the current application language. (#19558)
craft\helpers\StringHelper::toLowerCase(), ::toTitleCase(), and ::toUpperCase() now have $language arguments, which default to the current application language. (#19558)
- Deprecated
craft\helpers\ElementHelper::renderElements(). craft\helpers\Template::render() should be used instead. (#19988)
Control Panel
- The global Settings page now has an “Extend” section, which contains Plugins and MCP.
- Assets settings are now in the “Content” section of the global Settings page, and the “Media” section has been removed.
- Filesystem settings are now within Assets settings, at Settings → Assets → Filesystems.
- Queue jobs’ Job Data is now syntax-highlighted in the Queue Manager utility.
- The Project Config utility’s “Loaded Project Config Data” is now syntax-highlighted.
- Asset previews and the Project Config utility now use TanStack Highlight for syntax highlighting, rather than Prism. (#20088)
- Added
craft\web\assets\highlight\HighlightAsset. (#20088)
- Deprecated
craft\web\assets\prismjs\PrismJsAsset. craft\web\assets\highlight\HighlightAsset should be used instead. PrismJsAsset now registers a Prism shim backed by TanStack Highlight, which supports Prism’s commonly-used APIs, but not grammar customization, hooks, or plugins. (#20088)
Security
- A rate limit is now enforced for
users/login, auth/verify-totp, and auth/verify-recovery-code requests. (#20054)
- Added the
defaultRateLimit and defaultRateLimitDuration config settings, which configure the rate limits for users/login, users/send-password-reset-email, auth/verify-totp, and auth/verify-recovery-code requests. (#20054)
- Removed support for the non-standard
ED256 passkey algorithm. (#19701)
- Uploaded file names and search keywords no longer retain bidirectional override characters and other invisible characters.
- Added
craft\helpers\StringHelper::areConfusable().
- Added
craft\helpers\StringHelper::stripPrivateAndUnassignedChars().
craft\helpers\StringHelper::invisibleCharsRegex() now also matches bidirectional embedding, override, and isolate characters; non-whitespace control characters; the word joiner, function application, combining grapheme joiner, and Mongolian vowel separator characters; and blank Hangul filler and braille characters.
- Fixed a moderate-severity information disclosure vulnerability. (GHSA-hgwm-4xxx-w8jq)
- Fixed a moderate-severity authorization bypass vulnerability. (GHSA-vvm6-wrc8-5fgh)
Performance
- Saving nested elements on multi-site installs now executes fewer database queries. (#20090)
- Search indexing now executes fewer database queries. (#20090)
- User permission checks are now faster for users with many permissions. (#20149)
Other Changes
- Added the
project-config/check command, which checks project config schema compatibility without applying changes.
- MySQL database backups and restores now carry over SSL/TLS settings from the system’s MySQL option files (e.g.
ssl-ca or disable-ssl-verify-server-cert), if the database connection doesn’t have any PDO::MYSQL_ATTR_SSL_* attributes set. (#19366)
- MySQL database backups and restores now respect the
PDO::MYSQL_ATTR_SSL_CAPATH and PDO::MYSQL_ATTR_SSL_CIPHER database connection attributes. (#19366)
- Element fixtures no longer create revisions by default. Set their
createRevisions property to true to retain the previous behavior. (#19626)
- Added
craft\test\ElementFixtureTrait. (#19626)
- Added
craft\base\NestedElementTrait::$touchOwnersOnSave.
- Added
craft\elements\db\NestedElementQueryTrait::mustHaveField().
- Added
craft\elements\db\NestedElementQueryTrait::mustHaveOwner().
- Added
craft\helpers\Db::isSafeOrderBy(). (#19994)
Dependencies
- Craft now requires
league/oauth2-server, mcp/sdk, and symfony/finder. (#20145)
- Updated Axios to 1.20.0.
- Updated Twig to 3.30.
- Updated Fabric.js to v7. (#19628)
Bug Fixes
- Fixed a bug where entry and address indexes weren’t showing any results if they had a “Field” condition rule set to “is empty”.
- Fixed a bug where
craft\services\Elements::deleteElementsForSite() would remove elements’ site rows without deleting the elements, on single-site installs. (#20060)
- Fixed a bug where saving a deeply-nested element on its own wouldn’t update its owners’
dateUpdated timestamps, which could cause new revisions to reuse stale nested content. (#19594)
- Fixed a bug where deleting an element for a site while editing a provisional draft would delete the provisional draft for all sites. (#20061)
- Fixed a bug where DSNs set via database config arrays weren’t getting parsed, so MySQL’s
utf8 charset wasn’t getting normalized to utf8mb4. (#20248)
- Fixed a bug where
craft\i18n\Locale::getOrientation() was returning ltr for some right-to-left locales, such as Central Kurdish (ckb) and Punjabi in Arabic script (pa-Arab). (#20301)
- Fixed a bug where batched queue jobs weren’t splitting into additional batches before reaching their time limits. (#20304)
- Fixed an error that occurred when passing
withProvisionalDrafts to a Matrix field via GraphQL. (#20308)
- Fixed a bug where users who logged into the control panel with “Remember me” checked could get logged out after an hour of inactivity.
- Fixed a bug where default titles of assets with long filenames were taken from the end of the filename. (#20112)
- Fixed a bug where characters were stripped from text that wasn’t UTF-8 when it was converted to UTF-8, such as alt text read from images’ IPTC captions. (#20111)
- Fixed a bug where the
fields/merge and fields/auto-merge commands weren’t updating field condition rules that referenced the merged fields. (#19901)
- Fixed a bug where the
fields/merge and fields/auto-merge commands weren’t updating Content Block fields’ layouts. (#19901)
- Fixed a bug where curly quotes were allowed within asset folder and filenames. (#19904)
- Fixed a bug where the “Instructions” setting’s placeholder text wasn’t getting updated when changing a field layout element’s selected field.
- Fixed a bug where renaming an asset without including its file extension resulted in a validation error. (#19950)
- Fixed a bug where the Image Editor’s crop box couldn’t be resized in some cases. (#19980)
- Fixed an error that occurred when opening element selector modals on element edit pages with a
returnUrl param. (#19983)
- Fixed a bug where
orderBy criteria wasn’t getting applied to eager-loaded elements. (#19994)
- Fixed a bug where
orderBy, offset, and limit params weren’t getting applied to element queries executed via eagerly(). (#19994)
- Fixed a bug where eager-loaded elements were getting reversed twice when both
orderBy and inReverse criteria were set. (#19994)
- Fixed a bug where skipped revisions were getting reported as root element lookup errors when resaving elements. (#20026)
- Fixed a bug where pruning revisions could delete nested element revisions in other sites that newer revisions still referenced. (#20042)
- Fixed a bug where “Save as a new draft” didn’t carry nested entries over to the new draft. (#20226)
- Fixed an error that occurred when logging in with a passkey that was registered with an older version of Craft. (#20052)
- Fixed a bug where closing an element selector modal while it was loading caused it to keep loading all of the source’s elements in the background. (#20100)
- Fixed a bug where moving assets and replacing existing files with the same name could fail. (#20128)
- Fixed a bug where nested entries added via drafts on multi-site installs could get an incomplete first revision, causing their nested content to be deleted when reverting to it. (#20151)
- Fixed a bug where nested entries owned by drafts could get their own revisions, which could cause a foreign key error when applying the draft on PostgreSQL. (#20151)
";s:4:"date";s:19:"2026-11-03T00:00:00";}i:2;a:4:{s:7:"version";s:8:"5.11.5.1";s:8:"critical";b:0;s:5:"notes";s:169:"
- Fixed a bug that prevented third party nested element types from being editable. (#19898)
";s:4:"date";s:19:"2026-10-08T00:00:00";}i:3;a:4:{s:7:"version";s:6:"5.11.5";s:8:"critical";b:0;s:5:"notes";s:1443:"
- Fixed a bug where saving an image as a new asset from the Image Editor didn’t always replace the original asset within the Assets field it was selected in. (#19791)
- Fixed a bug where queries executed within
craft\db\Connection::cache() could cause infinite recursion when craft\cache\DbCache was used as the cache component. (#19877)
- Fixed a bug where license records weren’t being updated with the newly-installed versions after running the
update command. (#19878)
- Fixed a bug where addresses could present as editable even if the user didn’t have permission to save their parent element. (#19881)
- Fixed a high-severity SQL injection vulnerability. (GHSA-cphx-cx67-jcqj)
- Fixed a moderate-severity authorization bypass vulnerability. (GHSA-4rg3-m2h8-grqw)
";s:4:"date";s:19:"2026-10-07T00:00:00";}i:4;a:4:{s:7:"version";s:6:"5.11.4";s:8:"critical";b:0;s:5:"notes";s:3609:"
- Added
craft\services\Users::destroyOtherSessions().
- Setting up a two-step verification method now destroys the user’s other sessions.
- Deleting a passkey now requires an elevated session.
- Fixed a bug where an uninformative error message could be shown when saving a draft that no longer passed validation. (#19674)
- Fixed a bug where the Assets index page could display the wrong assets and subfolders after reloading the browser tab. (#19689)
- Fixed a bug where Matrix fields set to the “Cards”, “Card grid”, or “Index” view modes weren’t respecting
craft\fields\Matrix::EVENT_DEFINE_ENTRY_TYPES. (#19685)
- Fixed a bug where the
attribute() Twig function was allowed within sandboxed Twig environments, even if it wasn’t listed in allowedFunctions.
- Fixed a bug where Twig array access with a
false key could return the wrong value when Dev Mode was disabled.
- Fixed an error that could occur when adding a new site to a draft, if it contained multiple levels of nested content. (#18281)
- Fixed a bug where dragged items weren’t getting dropped where expected, if their container had scrolled during the drag operation. (#19721)
- Fixed a bug where publicly-registered users weren’t getting activated and logged in immediately, if email verification wasn’t required but the password was deferred. (#19610)
- Fixed a bug where changing an entry’s type could cause values for fields shared by both entry types to be lost. (#19737)
- Fixed an error that could occur when running the
setup/php-session-table and setup/db-cache-table commands. (#19742)
- Fixed an infinite loop that could occur when editing nested Matrix entries in Blocks view. (#19756)
- Fixed a bug where filtering elements by textual params or conditions could only work if the param/condition value was all-lowercase. (#19781)
- Fixed a high-severity RCE vulnerability. (GHSA-hq78-cm2m-h24h)
- Fixed a low-severity RCE vulnerability. (GHSA-6m9q-c5q4-3732)
- Fixed a low-severity authorization bypass vulnerability. (GHSA-j2r3-x468-c6j5)
- Fixed a low-severity XSS vulnerability. (GHSA-q2rx-mr36-8rh5)
";s:4:"date";s:19:"2026-10-01T00:00:00";}}s:13:"phpConstraint";s:4:"^8.2";s:11:"packageName";s:12:"craftcms/cms";}s:7:"plugins";a:9:{s:9:"admin-bar";a:3:{s:6:"status";s:8:"eligible";s:8:"releases";a:0:{}s:11:"packageName";s:23:"wbrowar/craft-admin-bar";}s:8:"announce";a:3:{s:6:"status";s:8:"eligible";s:8:"releases";a:0:{}s:11:"packageName";s:27:"honchoagency/craft-announce";}s:8:"calendar";a:4:{s:6:"status";s:8:"eligible";s:8:"releases";a:2:{i:0;a:4:{s:7:"version";s:6:"5.0.33";s:8:"critical";b:0;s:5:"notes";s:1196:"Added
- Added a
--calendar option to calendar/events/resave to resave events from a single calendar by handle or ID.
Fixed
- Fixed Select Dates events imported through Feed Me losing their selected dates or failing to update.
- Fixed recurrence rules carrying over between events imported through Feed Me.
- Fixed outdated recurrence settings being retained when updating an event through Feed Me with a new recurrence rule.
- Fixed recurring event dates being overwritten by multi-site saves through the events service outside the control panel.
- Fixed duplicate occurrences when an event's start date was also selected under Select Dates.
- Fixed an event's start time being changed when retrieving Select Dates occurrences.
Security
- Updated vulnerable JavaScript dependencies and replaced Lerna with npm workspaces for development builds, which now require Node.js 20.19+ and npm 10+.
- Updated the minimum supported Carbon versions to 2.72.6 and 3.8.4 to address a security vulnerability.
";s:4:"date";s:19:"2026-10-29T00:00:00";}i:1;a:4:{s:7:"version";s:6:"5.0.32";s:8:"critical";b:0;s:5:"notes";s:147:"Fixed
- Fixed an issue where Save as a new event did not preserve changes made while editing an event.
";s:4:"date";s:19:"2026-10-11T00:00:00";}}s:13:"phpConstraint";s:13:"^8.0.2|^8.2.0";s:11:"packageName";s:23:"solspace/craft-calendar";}s:8:"ckeditor";a:4:{s:6:"status";s:8:"eligible";s:8:"releases";a:2:{i:0;a:4:{s:7:"version";s:5:"5.9.0";s:8:"critical";b:0;s:5:"notes";s:1065:"
- Updated CKEditor to 48.5.2. (#633)
- Fixed an
InvalidSubpathException error that occurred when editing an element with a CKEditor field that had “Insert image” in its toolbar, if the field’s default upload location contained a variable that couldn’t be resolved yet (e.g. {slug}). (#618, #630)
- Fixed a bug where links with styles and advanced link fields could be split into multiple links when their displayed text was changed. (#631, #632)
- Fixed a bug where links with styles and advanced link fields could become difficult to edit or unlink. (#631, #632)
";s:4:"date";s:19:"2026-10-06T00:00:00";}i:1;a:4:{s:7:"version";s:5:"5.8.0";s:8:"critical";b:0;s:5:"notes";s:2088:"
- CKEditor packages registered by plugins that load after CKEditor, including from
Craft::$app->onInit() callbacks, are now registered properly. (#621)
- CKEditor fields now only import third-party CKEditor packages, and register their asset bundles, when one of the package’s toolbar items is in the field’s toolbar. Packages without toolbar items are still loaded for every field.
- Third-party CKEditor plugins are now referenced via namespace imports, so plugins with the same name from different packages no longer conflict. Custom config JS can still refer to them by name (e.g.
extraPlugins: [Tokens]), as long as the name is unique.
- Added
craft\ckeditor\Plugin::registerCkeditorPackageBundles().
- Deprecated
craft\ckeditor\helpers\CkeditorConfig::getImportStatements().
- Package asset bundles are no longer registered automatically whenever
CkeditorAsset is registered.
- Fixed a bug where package toolbar items were registered again each time a CKEditor field was rendered.
- Fixed a bug where grouped toolbar items from third-party packages weren’t matched against the field’s toolbar.
- Fixed a bug where all of a package’s toolbar items were shown as a single group in the toolbar builder, instead of as separately-placeable items and groups.
- Fixed a bug where the “Displayed text” value was ignored when inserting a new element link, and the element’s title was used instead. (#617)
- Fixed a bug where links’ types would change to “URL” if a URL suffix was entered before an element was chosen. (#619, #624)
- Fixed an error that could occur when uninstalling CKEditor. (#623)
";s:4:"date";s:19:"2026-09-28T00:00:00";}}s:13:"phpConstraint";s:4:"^8.2";s:11:"packageName";s:17:"craftcms/ckeditor";}s:6:"formie";a:4:{s:6:"status";s:8:"eligible";s:8:"releases";a:17:{i:0;a:4:{s:7:"version";s:5:"4.0.7";s:8:"critical";b:0;s:5:"notes";s:22316:"Added
- Keep synced fields linked when importing forms, with a choice when a synced field’s settings differ on the destination. (#3098)
- Add an Export… button to the submissions index. It opens a dialog filled in from your current form, filters and search, where you can adjust the forms, submission types, statuses, dates and columns, and see how many submissions you’ll get, before exporting in any report format. No saved report is needed. (#3082)
- Add the
logSubmissionValues config setting to keep submitted values out of Formie’s log files, while still writing every log entry.
- Add an option to leave log files out of support requests.
- Add a documentation example for dynamically loaded forms, including shared asset loading and automatic initialisation.
Changed
- Use a database index for File Upload reference checks, with queued indexing of existing submissions. (#3069, #3096)
- Allow all failed integration and notification deliveries to be retried using current submission values and settings.
- Rename the “View delivery diagnostics” permission to “View queue delivery diagnostics”.
- Allow submission exports without Reports access using “Export submissions” under “Access submissions”. Existing report export permissions continue to work. (#3082)
- Move Mailchimp and Campaign Monitor API error-handling choices to standard dropdowns under Advanced on each integration connection. Existing global choices remain fallbacks until the connection saves its own.
- Default Mailchimp and Campaign Monitor API rate limits to failed deliveries, while skipping recognised subscriber rejections with a warning. Preserve configured actions and include form, submission and provider details in policy logs. (#2172, #2276)
- Store reports and schedules in the database instead of project config, allowing reports to be managed on production. (#3082)
- Show a warning on reports that point at forms that no longer exist.
- Keep encrypted field values out of Formie’s log files, including integration payloads for forms with encrypted fields.
- Update the
@verbb/formie-* npm packages to use the same version number as the plugin. Version ranges such as ^1.0.16 need updating once. (#3081)
- Update the Pardot guide for External Client Apps, OAuth security settings, and separate API and Form Handler delivery.
- Clarify terminology throughout the documentation, including synced fields, stencils, saved values and client events.
- Simplify control panel labels and help text for integration order, notification timing, test data, field settings and analytics events.
Fixed
- Fixed slow submissions with File Upload fields on sites with large submission histories. (#3096)
- Fixed
useCssLayers being ignored. Front-end CSS, including dynamically loaded field styles, is unlayered by default. Set useCssLayers to true to retain the layered styling used by earlier Formie 4 releases.
- Fixed legacy notification tokens in stencils not being upgraded, preventing emails from forms created from those stencils from rendering.
- Fixed file pickers in Repeater fields failing to open or opening multiple dialogs when editing submissions.
- Fixed queued exports and scheduled reports omitting answer columns when using automatic field selection.
- Fixed GoCardless Payment fields not rendering their payment input and redirect instructions.
- Fixed submission payment summaries missing for GoCardless, Moneris, Paddle and Square.
- Fixed PlaceKit throwing an error when its API key is unset or empty.
- Fixed forms using page reloads not showing a link to continue later after saving progress.
- Fixed File Upload fields retaining completed attachments after AJAX form resets, and duplicate advanced upload rows after Back navigation. (#3097)
- Fixed users with permission to import forms being sent to an inaccessible page after a successful import.
- Fixed importing a form creating a new form when an existing form had the same handle and no action was selected.
- Fixed queued integrations and notifications being discarded after their worker stopped unexpectedly, while preserving the site's queue retry settings.
- Fixed upgrades from Formie 2 and 3 failing on PostgreSQL for sites with payments, and sites already upgraded rejecting newer payment statuses, because of an old database constraint.
- Fixed upgrades stopping on payments saved with more decimals than their currency has, such as a failed payment of 25.015 USD. The amount is rounded, and the original stays on the payment and in its history.
- Fixed notifications from Formie 3 failing or losing values when they used plain tokens such as
{email} or {group.field}. These now convert automatically where they match a field on the form, including on sites that have already upgraded. Tokens with filters or Twig still need converting by hand.
- Fixed Categories fields losing their All or multiple source selection. The Sources setting is back in the form builder, and fields upgraded from Formie 2 or 3 offer their saved sources again.
- Fixed Group and Repeater answers being lost when upgrading from Formie 2 if their child fields held an outdated parent reference.
- Fixed per-form permissions from Formie 2 and 3 being removed the next time a user or user group was saved. Forms with existing grants now use Use Dedicated Permissions. Grants already removed on an upgraded site need to be granted again.
- Fixed Slack, Telegram, Zapier, Web Request, Freshdesk, Gorgias and Zendesk connections saved under their older class names being unavailable after upgrading, and their form integrations not being sent. Web Request URLs saved under the older
webhook setting are also kept. A Calendar Event connection saved in Formie 3 also no longer stops every integration on the site from loading.
- Fixed Product element integrations saving products without their mapped variant, SKU or price.
- Fixed Entry integrations upgraded from Formie 2 losing their field mapping controls and saving entries without mapped field content. Entries already created this way aren't changed, and each repaired integration is logged during the upgrade.
- Fixed element integrations failing when a Table field was mapped whole or by column, and Table date and time cells being saved in the wrong timezone.
- Fixed Recipients conditions saved in Formie 2 or 3, or chosen in the form builder, not matching the selected option, and stopped sending recipient addresses to the browser in those conditions.
- Fixed Address answers from Formie 2 holding only auto-complete text showing as empty, and auto-complete being dropped from Address fields during the upgrade.
- Fixed Single-Line Text fields ignoring a
type set in their Input Attributes, which showed passwords as plain text on forms set up as the Formie 3 guide described.
- Fixed Date dropdown and input fields losing seconds or AM/PM, or gaining an hour, when upgrading from Formie 2, and saving a form resetting the order of upgraded Date sub-fields.
- Fixed email notifications failing to render when a multi-select Dropdown inside a Group or Repeater was left blank, or with
devMode on for Recipients fields shown as a dropdown.
- Fixed Calendar Event integrations failing when a mapped date field was left blank, or when Repeat Until was mapped.
- Fixed Email Address fields not enforcing Blocked Domains added or edited in the form builder, including the domains returned through GraphQL.
- Fixed forms without a saved layout failing to render.
- Fixed control panel pages and form queries failing on PostgreSQL for users with no accessible forms, such as users who can only import forms, and querying forms by an unknown form status.
- Fixed users with Create Submissions or Save Submissions permissions, but no form access, being unable to open the new submission screen, save submissions or use the Google address current-location lookup in the control panel.
- Fixed Repeater field criteria not matching saved submissions on PostgreSQL.
- Fixed the Address field’s auto-complete option missing on PostgreSQL, and for providers enabled through an environment variable.
- Fixed uppercase submission UIDs failing to edit a submission on PostgreSQL.
- Fixed Agile integration settings failing to load when only tasks are mapped.
- Fixed Akismet, CleanTalk and OopSpam throwing an error instead of showing a validation message when saved without an API key.
- Fixed the Stripe SDK requirement allowing versions without
StripeClient. The minimum is now 7.33.
- Fixed TypeScript errors when using the
@verbb/formie-* npm packages in projects with moduleResolution set to NodeNext.
- Fixed the new report dialog waiting for forms and report data before appearing.
- Fixed reopening the new report dialog during its close animation, and kept report loading in a consistent layout with a visible toolbar placeholder and a compact, right-aligned form-picker spinner.
- Fixed report charts briefly appearing blank without a loading spinner before drawing.
- Fixed GraphQL
save_<form>_Submission and saveSubmission mutations not behaving like normal form submissions. They now send email notifications, trigger integrations, run spam and captcha checks, apply field conditions and default values, record request details and follow the form's login, schedule and submission limit rules. Editing through a private token only changes the fields it sends. With a private token, a missing captcha token returns an error, including on multi-page forms. Public GraphQL schemas can create submissions again, with rate limits, but editing by ID and saving drafts need a private schema, and payment forms need submitFormieClientForm. (#3090)
- Fixed the request IP address being saved in submission metadata and sent to integrations when Collect IP Address is off.
- Fixed File Upload fields rejecting extensions allowed by Craft's
allowedFileExtensions, extraAllowedFileExtensions and extraFileKinds settings. Per-field file type restrictions still apply, and the field settings show the permitted extensions in a neutral notice with clearer configuration guidance. (#3092)
- Fixed cached multi-page forms becoming stuck on the wrong page when restoring an in-progress submission.
- Fixed fields with Disabled visibility losing their values when saving submissions in the control panel. (#3093)
- Fixed the support form clearing entered values when a required field is missing.
- Fixed Repeater validation errors appearing on the wrong row after returning to a previous page, and searchable dropdown selections being cleared during AJAX page navigation. (#3088)
- Fixed a validation error from the server on a field inside a Group or Repeater marking the other fields around it as invalid on forms that reload the page.
- Fixed focus not moving to Checkboxes, Agree, searchable Dropdown and Rich Text fields after a validation error.
- Fixed the File Upload field’s asset picker on the control panel submission screen listing nothing, and chosen assets being rejected when saving. The field also has a direct Upload button there now. Chosen assets move into the field’s upload folder, as with an Assets field with a restricted location, and are deleted with the submission if the form deletes files.
- Fixed an error and an incomplete submission when a File Upload field’s upload subpath used an answer left blank or that couldn’t be a folder. These files now go to the root of the field’s volume, and move once the answer is filled in.
- Fixed notifications saved in the same second sending and listing in an unpredictable order on PostgreSQL.
- Fixed files staying behind on forms set to delete file uploads when a trashed submission was later purged by garbage collection. Submissions already in the trash are covered too.
- Fixed Address answers holding only auto-complete text showing as empty in email notifications when the field no longer has an Auto-Complete sub-field.
- Fixed the Redirect Entry picker appearing empty when Craft’s “All entries” source is disabled. (#3089)
- Fixed forms failing to load when a field or page has a condition rule that was added but never filled in, which can be present on forms upgraded from Formie 3.
- Fixed forms showing “A required form feature could not start” and being unable to submit when a field had conditions enabled but no rules.
- Fixed forms showing “A required form feature could not start” and being unable to submit when a field’s browser feature had nothing to attach to, such as Date fields stored as a date picker while using inputs or dropdowns, or conditions inside a Repeater with no rows yet.
- Fixed visitors seeing a server error after their submission was saved, and later notifications being skipped, when a notification failed with
useQueueForNotifications off. The failure is now logged and left in delivery diagnostics.
- Fixed upgrading from Formie 2 failing on forms with encrypted fields when
FORMIE_ENCRYPTION_KEY isn’t set, or with File Upload fields whose volume has been deleted.
- Fixed conditions from Formie 3 showing an empty Field column in the form builder, on fields, pages, integrations and form rules. Existing conditions now use the same field references as the builder when you upgrade, except on fields synced between forms, which still work as before. (#3087)
- Fixed Match Field validation no longer being enforced on fields imported by the Freeform migrations, and the setting showing a raw token instead of the field’s name in the form builder. (#3087)
- Fixed submissions throwing an error when Match Field points to a field inside a Group or Repeater. Fields in the same Repeater now compare within their row, and other fields compare with the first row. Browser validation still applies to Groups, while Repeater targets are checked when the form is submitted. (#3087)
- Fixed exports queued in the background failing for users with Manage reports but not Export submissions.
- Fixed Date fields returning an empty object from GraphQL submission queries, and Date Range fields not exposing their
start and end values. (#3079)
- Fixed Group fields failing when queried through GraphQL, and restored direct selection of their subfields. (#3080)
- Fixed GraphQL mutations written with the documented input type names being rejected for Name, Address, Group, Repeater, Table and Payment fields. These types, and their Group, Repeater and Table output types, now use names based on form and field handles instead of field IDs, so they’re the same in every environment. Any query that hard-coded an ID-based type name needs updating. (#3080)
- Fixed
inputTypeName returning [] for Table fields. (#3080)
- Fixed AJAX submissions still showing the form error message when Error Message Position is set to None.
- Fixed
fieldNamespace being ignored when rendering pages or complete forms, and corrected custom form examples and captcha guidance.
- Fixed the Address Country and Name Prefix sub-fields outputting no value in email notification field summaries. (#3085)
- Fixed stencil email previews and test emails failing with “Form not found”, using fields from an unrelated form, or rendering the Form Name variable blank. (#3091)
- Fixed saving and copying stencils containing synced fields.
- Fixed integration mappings from Formie 3 that use Form Name, Submission Date, Site Name or Site Handle failing to send, and Name, Address and Group sub-field mappings showing as “Don’t Include” and being cleared when saving the form. Existing mappings update automatically. (#3086)
- Fixed failed notification and integration alert emails failing to send when Craft’s
enableTwigSandbox setting is on. Customised messages using the default json_encode and integration.name output are updated automatically.
- Fixed the Trello, Google Sheets and Calendar Event integrations throwing an error when loading their form settings.
- Fixed the Product element integration failing to save when “Overwrite Values” is off.
- Fixed GoCardless webhooks being processed and then reported as failed.
- Fixed Front integration messages being reported as failed after they were delivered.
- Fixed Freshdesk deliveries failing their queue job after handling an existing contact, even though the contact update and ticket were delivered.
- Fixed Freshdesk reporting a failure instead of a skipped delivery when an event cancelled sending its contact.
- Fixed HubSpot deliveries being reported as successful after a file upload failed, allowing the form to be sent without its file.
- Fixed integration errors configured to be skipped still failing the enclosing queue job or triggering failure alerts.
- Fixed the Diagnostics button failing to open on control panels served over plain HTTP.
- Fixed Capsule throwing an error when fetching opportunity fields.
- Fixed the Sent Notifications index showing “-” for the Notification column.
- Fixed pruning of sent notifications using the wrong cutoff time for sites not set to UTC.
- Fixed a server error when saving a form’s template fields failed validation on a non-JSON request.
- Fixed
FieldLayout::getForm() throwing an error.
- Fixed slow submission exports and indexes for forms with rich text Multi-Line Text fields, or with
plainTextHtmlSanitizationMode set to sanitize, caused by rebuilding the HTML purifier configuration for every value. (#3083)
Deprecated
- Deprecate
IntegrationResult::rejected(), IntegrationResult::unknown(), IntegrationResult::requiresReconciliation() and IntegrationResult::$retryable. Rejected and unknown results are now failures, and every failure can be retried.
- Deprecate
DeliveryAttempts::reconcile(), DeliveryAttempts::hasReconciliation(), DeliveryAttempts::executePrepared(), DeliveryAttempts::EVENT_RECONCILIATION, DeliveryAttempts::operationFingerprint(), DeliveryAttempts::operationFingerprints(), IntegrationRunner::dispatchFingerprint(), IntegrationRunner::dispatchFingerprints(), SubmissionDispatches::resume(), IntegrationTriggers::forceIntegration(), the DispatchSubmission job, Integration::supportsDeliveryWriteTracking() and IntegrationStatus::isFinalized().
Removed
- Remove the “Confirm delivery outcomes” and “Force integration execution” permissions, and the confirm and force-run controls in Delivery Diagnostics. Diagnostics and Export remain for troubleshooting.
- Remove the
formie/deliveries and formie/deliveries/recover console commands. formie/cron/run no longer re-sends submission deliveries interrupted by a crash, and its deliveries group now only recovers payment webhooks. If a crash interrupts a delivery, run the integration from the submission’s edit page.
";s:4:"date";s:19:"2026-11-05T00:00:00";}i:1;a:4:{s:7:"version";s:5:"4.0.6";s:8:"critical";b:0;s:5:"notes";s:6144:"Added
- Add “All Form Fields”, “All Non Empty Fields”, “All Visible Fields” and formatted Group and Repeater summaries to integration field mappings for text fields. Freshdesk ticket descriptions receive them as HTML. (#3078)
- Add
IntegrationField::$acceptsHtml for integration fields that render HTML content. (#3078)
- Add instructions explaining the Redirect Source options in form behaviour settings.
- Add field warning for URL settings in the control panel, when the URL starts with a reference.
Changed
- Allow reference-supplied external redirect URLs, leaving the choice of destination source to the editor.
- Update the minimum Tiptap requirement to
1.0.6.
Fixed
- Fixed an information disclosure vulnerability. (#3074)
- Fixed a moderate-severity cross-site scripting vulnerability. (GHSA-544h-97wp-pvhx)
- Fix rich-text Multi-Line Text answers displaying as HTML source when referenced in email notifications.
- Fix rich-text editor registration running more than once when Craft’s
buildId setting is configured.
- Fix garbage collection failing when pruning Formie submissions, sent notifications or uploaded assets. (#3075)
- Fix form group permissions not applying to email notification Advanced and Templates tabs, the New Submission form list, the Recent Form Submissions widget, and sent notification sources, actions and resending.
- Fix the cursor jumping to the end when typing around variable tags.
- Fix browser requests failing when Craft uses a custom action trigger, including token refresh after AJAX submissions. (#3068)
- Fix file upload reference checks causing MySQL sort-memory errors for large submissions. (#3069)
- Fix upload manager file order and move button states becoming inconsistent after reordering files. (#3070)
- Fix searchable dropdown placeholders not appearing until a form field is focused. (#3072)
- Fix client-rendered forms failing to load when Date fields contain dropdown controls, including AM/PM controls. (#3073)
- Fix Date pickers displaying calendar labels in English on non-English sites. (#3076)
- Fix required advanced Date pickers being skipped by client-side validation. (#3077)
- Fix Date fields showing Required settings that were reset on save. Set Required on the Date's sub-fields instead. (#3077)
- Fix invisible hCaptcha challenges timing out before they could be completed, requiring a second submit click. (#3067)
- Fix Agree fields not being selectable in integration field mappings. (#3066)
- Fix the Opt-In Field setting for integrations not being able to be cleared. (#3066)
- Fix large HubSpot portals failing to load or refresh integration settings due to the metadata storage limit.
- Fix optional field selections, including Match Field and integration field references, not being able to be cleared.
- Fix country defaults for Phone, Address Country and Google address autocomplete not being able to be cleared.
- Fix Phone country dropdowns selecting the first allowed country when the default is None, and not restoring None when forms reset. (#3071)
- Fix optional option-source parameters not being able to be cleared, and provider defaults restoring explicitly empty values.
- Fix Form Default positions not being retained for Address and Name instructions, and Content, HTML, Recipients, Quiz and Survey labels.
- Fix deleted page client events returning on forms upgraded from legacy event settings.
- Fix clearing custom required error messages reverting to their previous value. (#3065)
- Fix populating Entries and other element fields with a single element ID.
- Fix forms on path-based sites receiving refreshed submission tokens for the wrong site. (#3064)
- Fix Microsoft Dynamics 365 requests failing with a provider origin override error. (#3063)
- Fix theme attributes not being applied to AJAX success and error messages. (#3061)
- Fix nested alert roles in form error messages that could cause duplicate screen reader announcements. (#3062)
- Fix AJAX submissions showing the form error message when Error Message Position is set to None.
- Fix Opayo re-tokenizing cards and requesting unnecessary merchant sessions after completing a 3D Secure challenge. (#3048)
- Fix importing Formie 3 forms with a null redirect target. (#3060)
- Fix variable pickers not showing for redirect URL settings.
Removed
- Remove the
completionRedirectAllowedOrigins configuration setting.
";s:4:"date";s:19:"2026-11-01T00:00:00";}i:2;a:4:{s:7:"version";s:5:"4.0.5";s:8:"critical";b:0;s:5:"notes";s:5954:"Added
- Add a Maximum Displayed Options setting for searchable dropdowns, defaulting to 100 while searching all options. (#3059)
- Add configurable Dropdown placeholders across all option sources, enabled for new fields while preserving existing options and defaults. (#3058)
- Add Form layout, Alphabetical, and Custom field ordering for reports and exports, preserving existing custom orders. (#3054)
- Add report subcolumn support for parent fields, including Name and Address, with Single Column, Separate Columns, and Both display options for automatic reports. (#3055)
- Add a dedicated field value projection and event for reports, with readable combined values and independent field formatting. (#3055)
- Add save-time validation for completion redirect URLs, with guidance for external origins that are not allowed. (#3038)
Changed
- Retain compact condition selectors with Plugin Kit’s
xxs size.
- Update the minimum Auth requirement to
2.0.56.
Fixed
- Fix render-time theme overrides being ignored for fields on sites with form translations. (#3057)
- Fix forms with Question CAPTCHA failing to render when strict Twig variables are enabled, and correct the answer input name for submission. (#3056)
- Fix form imports not reporting missing update permission when the existing form is hidden from the control panel index.
- Fix conditional Payment fields initializing widgets more than once, including duplicate Opayo Drop-in sessions and unhandled mount errors. (#3048)
- Fix dragging inside a nested field’s editor moving its parent Group or Repeater field. (#3049)
- Fix retired Duplicate, Honeypot, and JavaScript CAPTCHAs appearing as unavailable after upgrading, remove their obsolete form bindings, and preserve third-party CAPTCHA bindings that reuse those handles. (#3047)
- Fix required dropdowns enhanced with third-party libraries such as Choices.js failing validation when options are selected, and preserve custom required messages. (#3046)
- Fix new fields failing to save after upgrading to Formie 4 on PostgreSQL. (#3045)
- Fix submission index sorting ignoring the selected direction when switching between Submission and Date Created. (#3044)
- Fix report field columns and exports using alphabetical order instead of the form layout when including all fields. (#3054)
- Fix integration provider options appearing as custom values after upgrading or as “Don’t Include” after selection. (#3042)
- Fix integrations failing for whole Name and other container field mappings, and migrate legacy Phone sub-field mappings on previously upgraded forms. (#3052)
- Include the destination field and safe field reference in integration mapping errors, while continuing to fail the integration when a mapping cannot be resolved. (#3052)
- Fix Freshdesk ticket payloads with and without attachments, including errors resolving field mappings and uploaded files. (#3051)
- Fix integration failures before sending blocking retries, and allow unresolved provider operations to be confirmed individually in Delivery Diagnostics. (#3051)
- Fix queued notifications being incorrectly rejected as stale when site translations are applied, and provide clearer rejection messages and directions to delivery diagnostics. (#3040)
- Fix translated notification content losing formatting and custom TipTap nodes when emails are sent. (#3040)
- Fix the Condition dropdown showing no options when configuring conditional email notification recipients. (#3053)
- Fix matching recipient conditions returning no email addresses, and preserve older recipient rules when editing notifications. (#3053)
- Fix email field summaries including opted-out fields inside Group and Repeater fields. (#3043)
- Fix text-based fields inside Group fields not displaying their default values. (#3039)
- Fix custom validation messages not saving or being used for fields inside Group and Repeater fields. (#3041)
- Fix Checkboxes fields not enforcing option limits or using custom option limit error messages in the browser. (#3037)
";s:4:"date";s:19:"2026-10-28T00:00:00";}i:3;a:4:{s:7:"version";s:5:"4.0.4";s:8:"critical";b:0;s:5:"notes";s:4033:"Added
- Add
allowedPrivateIntegrationHosts configuration for integrations connecting to trusted private networks. (#3034)
- Add a Kebab Case text transform for reference tokens, including File Upload subpaths and filenames.
- Add temporary Salesforce diagnostics for API requests, field filtering, cached settings and editor mappings.
Changed
- Updated Markdown-it to 14.3.3 and the frontend build toolchain to Vite 8.3.4.
Fixed
- Fix plugin initialization failing on Craft versions before 5.10, preserving user submission deletion, reassignment and restoration. (#3035)
- Fix integration metadata being altered or discarded by diagnostic redaction, including refreshed Salesforce fields disappearing.
- Fix ordinary integration settings being mistaken for credentials in diagnostic logs.
- Fixed variable tags not showing their configured transform name or default-value indicator.
- Fix page-reload submissions stalling when the submit delay is zero.
- Fix mounted form lifecycle events omitting the form instance, including submission, page navigation, token refresh and teardown hooks. (#3032)
- Fix form builder tab navigation adding browser history entries, so Back returns to the previous page. (#3029)
- Fix form Appearance position dropdowns appearing empty when registration hooks filter or key their options. (#3017)
- Fix File Upload subfolder and filename variable pickers including the field being edited, including unnamed fields.
- Fix duplicate Upload Location validation errors and an unusably narrow subfolder editor. Only show the subfolder editor after selecting a location, with simpler instructions.
- Fix built-in variables hiding available transforms in the variable picker.
- Clarify upgrade guidance for settings that resolve references instead of Twig, including upload paths and filenames, supported transforms, and settings that retain Twig support.
- Fix Date sub-field labels and settings reverting after saving the form builder. (#3026)
- Fix Address country defaults and builder previews when option values use full country names. (#3036)
- Fix nested fields remaining hidden when a conditional Group or Repeater is revealed after continuing a multi-page form. (#3031)
- Fix Agree fields reverting their Label Position from Form Default to Hidden after saving. (#3030)
- Fix field variables in notification subjects appearing literally in PDF attachment filenames. (#3025)
- Fix Hidden fields missing from notification email address variable pickers.
- Fix forms created on secondary sites using the primary site as their source and failing when saving their first field. (#3024)
- Fix editing Name field labels on secondary sites failing when Use Multiple Name Fields is disabled. (#3024)
- Fix custom hidden field defaults leaving reference tokens unresolved when rendering a new form. (#3027)
- Fix dropdown optgroup labels being replaced with
true and their optgroup setting being lost in the form builder. (#3028)
";s:4:"date";s:19:"2026-10-22T00:00:00";}i:4;a:4:{s:7:"version";s:5:"4.0.3";s:8:"critical";b:0;s:5:"notes";s:3734:"Added
- Add a dedicated Spam Protection area with grouped navigation in Craft’s standard sidebar, matching page and panel headings, standard header Save buttons, separate provider and spam-rule permissions, and independent provider saves.
- Add sanitised installation, permissions and integration diagnostics to support bundles, with guidance to send requests from the affected environment.
- Add Salesforce token-request logging with the endpoint and grant type, excluding OAuth credentials.
Changed
- Clarify user permission labels, order spam rules before CAPTCHA and spam filtering services, remove permission info tooltips, align permission nesting with Formie’s navigation while retaining a single Select All control, limit settings permissions to production-accessible tools, and migrate legacy grants to preserve production access.
- Store CAPTCHA, spam filtering and spam-rule settings locally on each installation. Existing values are preserved during upgrade; these settings are no longer deployed through project config.
- Clarify project and instance settings for integrations, stencils, spam protection and captcha providers, including deployment and editing permissions.
- Remove the informational Widget Mode field from Cloudflare Turnstile settings.
Fixed
- Fix “Scroll To Top” having no effect after successful AJAX submissions. (#3023)
- Fix production settings navigation hiding permitted read-only pages and scheduled reports exposing unavailable editing controls.
- Fix form import, report export and scheduled report permissions depending on unrelated management permissions.
- Fix upgrading from Formie 2 failing on Date fields before form statuses have been migrated.
- Fix upgrading from Formie 2 failing on Payment fields before integration scopes have been migrated.
- Fix later migrations failing after an interrupted field-table rename, and report when missing field definitions require restoring a backup.
- Fix an error when upgrading from Formie 3 with an empty or invalid default date. (#3022)
- Fix the Settings page redirecting repeatedly when admin changes are disabled.
- Fix legacy Honeypot settings preventing forms from being created or saved, including from stencils.
- Fix project config sync overwriting or removing instance-level integrations, stencils and spam protection settings.
- Fix notification and submission properties rendering empty or being blocked by the Twig sandbox in PDF attachment filenames. (#3018)
- Fix the Defaults settings page failing to load when custom field positions use non-sequential keys. (#3017)
- Fix Date fields using Calendar (Simple) rendering text inputs instead of native date and time pickers. (#3014)
- Fix reCAPTCHA v3 failing when its script is already loaded without the configured site key.
- Fix reCAPTCHA v3 inline badges rendering outside the form. (#3016)
- Fix slow submission and sent notification indexes in the control panel on sites with many forms.
- Fix encryption warning icons appearing on a separate line from their text.
- Fix custom rendering documentation using removed methods and omitting validation markup and spam-protection inputs.
";s:4:"date";s:19:"2026-10-20T00:00:00";}i:5;a:4:{s:7:"version";s:5:"4.0.2";s:8:"critical";b:0;s:5:"notes";s:4668:"Changed
- Update the minimum Auth requirement to
2.0.55.
- Update the minimum Tiptap requirement to
1.0.5.
Fixed
- Fix JSON report exports failing to download in the control panel.
- Fix reports ignoring the option to display choice labels instead of values.
- Fix disabled or missing payment providers allowing payment forms to complete.
- Fix card details and temporary payment credentials being included in saved submissions and integration payloads.
- Fix Bpoint payment fields not rendering their card inputs.
- Fix Eway and Bpoint payment summaries missing from the submission editor.
- Fix summary fields remaining blank after AJAX page navigation.
- Fix summary fields repeatedly retrying failed requests.
- Fix multi-row Likert answers not saving when editing submissions in the control panel.
- Fix rank selectors missing labels in the submission editor.
- Fix passwords containing only
0 not being stored correctly.
- Fix cleared number fields restoring their default value when submissions are saved or loaded.
- Fix hidden query prefills replacing submitted values after native form validation errors.
- Fix editing submissions in the control panel replacing captured hidden values with the current administrator, date or IP address.
- Fix text counters and phone countries not returning to their initial values when forms reset.
- Fix rich-text validation errors failing to focus and describe the editable control.
- Fix text, name, dropdown, email, phone, number and hidden field labels not identifying their inputs in the submission editor.
- Fix text minimum limits using the maximum limit's unit in the submission editor.
- Fix static table fields allowing rows to be added or removed in the submission editor.
- Fix custom radio answers missing from the submission editor.
- Fix checkbox toggles sharing option labels and being included in submission values and validation.
- Fix required table fields incorrectly requiring every cell to have a value.
- Fix Pardot form handlers rejecting submissions with existing single-select mappings such as
country.value, while retaining plain field names and separate multi-select values.
- Fix calculations using another calculation with a number prefix or suffix returning incorrect results.
- Fix spam submissions configured to show success failing to display completion messages or redirect.
- Fix fresh forms retaining an earlier submission’s spam-protection timer.
- Fix form schedules accepting an end date before their start date.
- Fix save-and-resume links losing the form page after saving a resumed submission.
- Fix forms freezing when live validation and disabling the submit button until valid are both enabled.
- Fix file upload names failing to refresh after navigating between form pages.
- Fix duplicate validation errors for disallowed file uploads.
- Fix users with create-only submission permissions being unable to save new submissions in the control panel.
- Fix Salesforce Client Credentials connections using generic login endpoints instead of their saved instance domain, and clarify the My Domain requirement.
- Fix reCAPTCHA initialization when another reCAPTCHA SDK is already present on the page.
- Fix AWeber OAuth provider resolution on case-sensitive filesystems.
- Fix missing class references affecting CAPTCHA language detection, integrations, GraphQL, element conditions, submission editing, and plugin migrations. (#3012)
- Fix Events integration date mappings failing and preserve mapped timezones.
- Fix oversized payment webhooks failing instead of returning HTTP 413, and stencil permission failures returning the wrong error.
- Fix unnecessary predefined option and submission status deprecation errors with the debug toolbar enabled.
- Fix IP submission throttling using an incorrect time window on sites with a non-UTC timezone. (#3013)
- Fix SuiteCRM Contact fields not loading for field mapping with the V8 API. (#3010)
- Fix SuiteCRM Contact mappings being omitted from record payloads after a full integration refresh. (#3011)
";s:4:"date";s:19:"2026-10-17T00:00:00";}i:6;a:4:{s:7:"version";s:5:"4.0.1";s:8:"critical";b:0;s:5:"notes";s:2189:"Added
- Add the
formie:unload-warning:collect-exclusions browser event for integrations to exclude automatically updated transport fields from unsaved-changes checks. (#3008)
Changed
- Update the minimum Auth requirement to
2.0.53.
Fixed
- Fix saving upgraded Date fields resetting their child-field identities and settings.
- Fix Date year dropdowns losing their available years and rejecting valid submissions after upgrading.
- Fix Date migrations overriding explicitly configured future year ranges.
- Fix empty legacy Phone values displaying serialized country metadata after upgrading to Formie 4.
- Fix upgrades clearing integration connection state and cached field metadata required by existing mappings.
- Fix integration lists rendering as an empty pane instead of configured integrations or the empty-state message.
- Fix integration type icons appearing oversized or stretched in integration lists.
- Fix Zendesk tickets being rejected when the mapped requester name is blank.
- Fix submission status color migrations failing when legacy status event handlers are registered.
- Fix an error when upgrading multi-site installs from Formie 3 to Formie 4. (#3007)
- Fix unnecessary
EVENT_MODIFY_HTML_TAG deprecation warnings when rendering forms with the debug toolbar enabled. (#3009)
- Fix CAPTCHA token updates triggering an unsaved-changes warning on untouched forms. (#3008)
- Fix initial conditional field visibility triggering an unsaved-changes warning after native submissions.
- Fix edits made immediately after a form loads being treated as saved.
- Fix CAPTCHA widgets and callbacks remaining active after failed setup or removal.
- Fix CAPTCHA widgets with a numeric zero handle failing to validate or reset.
";s:4:"date";s:19:"2026-10-16T00:00:00";}i:7;a:4:{s:7:"version";s:5:"4.0.0";s:8:"critical";b:0;s:5:"notes";s:61760:"Before upgrading to Formie 4, review the Upgrading from v3 guide for breaking changes and required migration steps.
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 first-party framework-agnostic, browser, React, Vue, and Web Components packages for server-rendered and client-rendered forms, with REST and GraphQL transports.
- Add headless GraphQL payment support: structured Payment field input types, payment follow-up fields on
submitFormieClientForm, and BYO provider documentation. (#1375)
- Add GraphQL
Json siblings for stored rich-text content alongside existing Html fields (#865): submitActionMessageJson, errorMessageJson, instructionsJson, descriptionJson, and contentJson.
- Add generic
saveSubmission GraphQL mutation for handle-based submission saves (#1007).
- Add developer extension APIs for schema-driven integration and notification settings, submission workflow stages and tasks, field value projections, slot tags, client modules, and programmatic form and submission factories.
- 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)
- 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 a staged submission workflow service (
SubmissionWorkflow) with preflight, validate, screen, persist, dispatch, and finalize stages.
- Add database-backed temporary submission state, incomplete submission state, saved drafts, and resume-token handling.
- Add multi-site support with automatic site availability via Form Group site policy, per-site content translation via sparse site overrides, portable stencil translations, and per-site required-field overrides. (#2308, #84, #2724, #2968, #2982)
- Add a dedicated optional field-content encryption key, an Encryption settings page, key generation and status commands, resumable re-encryption, previous-key recovery, and read-only handling for unavailable encrypted values.
- Add
siteHandle request parameter support for headless form load and submit endpoints (#2286).
- Add
Cleanup service, ./craft formie/gc/run, and ./craft formie/cron/run console commands for scheduled cleanup and retention. formie/cron/run also runs due scheduled reports, with --only, --skip-gc, and --skip-reports for finer scheduling control.
- 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 Report Async Export Row Threshold setting (Settings → Submissions) to queue large report exports in the background (default 1000 rows). (#2259)
- Add Quiz field to forms for scored questionnaires (#605). Each question supports radio buttons, checkboxes, or a dropdown; mark correct answers on static options, enable optional Weighted score for per-option points, and add Answer explanation rich text for incorrect responses. Form Behaviour → Quiz Scoring settings control pass percentage, retake restrictions (by logged-in user or IP address), and whether Ajax/client submit responses include a
quizResult payload after a successful final-page submit. Scores persist in formie_submission_quiz_results for complete, non-spam submissions.
- Add Survey field to forms with selectable presentation types: radio buttons, checkboxes, dropdown, Likert scale (#798), Rating star scale (#2282), and Rank drag-and-drop ordering (#605). Likert supports single- and multi-row layouts, optional Weighted score on static columns, and built-in predefined scale defaults. Rank fields preserve submitted order on validation re-render.
- Add a Results tab to the form builder when a form includes Quiz or Survey fields (#605). View per-question response counts and option breakdowns, rank-weighted preference charts, Likert scoring averages when weighted scoring is enabled, and a quiz summary (attempts, average score, pass rate, pass threshold) for scored quizzes.
- Add Checkout Mode setting to the Opayo payment integration, with Own Form (default) and Drop-in Checkout options. Drop-in Checkout renders card fields inside an Opayo-hosted iframe via
sagepayCheckout, which can reduce PCI scope compared to own-form tokenisation, while reusing the existing server-side session key, transaction, and 3DS callback flow.
- Add registered Custom Provider option sources for Dropdown, Radio, Checkboxes, and Recipients fields. Modules can register lightweight
OptionSourceProviderInterface classes via OptionSources::EVENT_REGISTER_OPTION_SOURCE_PROVIDERS for 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 a persisted
metadata JSON column on submissions for submit-time request context (referrer, user agent, tracking cookies) and developer-defined custom data via form.setSubmissionMetadata(). Reference tokens such as {metadata:custom.campaignId} and {metadata:request.referrer} are supported in notifications, integrations, and PDFs. (#1379)
- 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 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)
- 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
objectTypeId values 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 durable integration and notification delivery history with encrypted diagnostics, safe retries, reconciliation tools, and support-download controls.
- 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_FAILED for handling integration failures outside the queue, and Send Email Alert for Failed Integration settings mirroring failed notification alerts. (Discussion #2579)
- 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 Salesforce Client Credentials authentication with configurable My Domain support. (#2961)
- Add an event-based Microsoft Dynamics 365 entity registry for custom entities without requiring a custom integration subclass. (#2995)
- 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 console commands to inspect unresolved payments, reconcile gateway status, record verified outcomes and resume submission processing.
- Add Stripe subscription Payment Limit field settings to cancel subscriptions automatically after a fixed or dynamic number of payments using Stripe subscription schedules. (#2123)
- Add Stripe subscription Setup Fee field settings to charge a one-time fee on the first subscription invoice using Stripe invoice items. (#1767)
- Migrate GoCardless payments from deprecated Redirect Flows to Billing Request Flows, including mandate fulfilment, one-off payment creation, and billing request webhooks. (#2552)
- Add GoCardless recurring subscription support via Direct Debit mandate authorisation and GoCardless subscription creation after billing request fulfilment. (#2552)
- 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)
- 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 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)
- 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)
- 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 optional per-form reCAPTCHA Action and Minimum Score settings for score-based modes, inheriting global Spam Protection defaults when left blank. (#2167, #2804)
- 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)
- 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 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 Form Groups for control panel organisation. (#1039, #662)
- Add a dedicated Settings → Defaults control panel page for form, field, and notification defaults. (#863)
- 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 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 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
craft.formie.ref() and craft.formie.refField() for building variable-picker-compatible reference tokens from Twig when overriding settings such as submitActionMessage. See Reference tokens. (#2838)
- Add Lock Field Settings and Editor Note on the field editor Advanced tab to help content authors protect important field configuration. Locking dims field settings until Unlock is clicked for the session; notes appear in the field editor banner. (#1189)
- Add Field Error Announcement plugin setting (Settings → Forms) to control how front-end validation and submit errors are announced to screen readers (
polite, assertive, or off). Live validation while typing always uses polite announcements. (#2505)
- 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 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 via rich-text.json under fields.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, including mergeInputAttributes and mergeContainerAttributes. (#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.json under fields.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 a Custom Field form-builder field backed by opt-in Craft field adapters. (#2208)
- Add Google Maps field support to Custom Field fields. (#625)
- Add Maps field support to Custom Field fields. (#626)
- Add Craft Link field support to Custom Field fields, 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 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
combobox browser 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)
- 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 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 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 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
validationMessages field setting, with legacy errorMessage values migrated to validationMessages.required. (#1269)
- 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 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 a page setting to place the submit button at the end of the last field row. (#2542)
- 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)
- Add a default country setting for Google Places address auto-complete fields. (#2721)
- Add a configurable maximum email attachment size, and validate notification attach assets in the form builder. (#2697)
- 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 built-in submission guards (honeypot, minimum submit time, replay protection) via a
RunSubmissionGuardsTask screen-stage workflow task and Settings → Spam Protection controls.
- Add suspicious text detection, maximum links screening, global submission throttling, and per-IP submission throttling under Settings → Spam Protection. (#1332, #1154, #1099)
- Add Theme setting for Friendly Captcha (light/dark/auto). (#2907)
- Add extensible TipTap nodes, marks, toolbar controls, and constrained TextStyle definitions across Formie editing, previews, and PHP rendering, including opt-in font family, font size, text/background color, line height, and Small caps controls.
- Add
csrfInput render option to control Craft CSRF hidden input output (true default, false to 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 a Last Edited By column to submission sources, tracking the Craft user who last saved a submission in the control panel. (#1403)
- Add
allowedSubmitMethods plugin setting to restrict form submission methods to Ajax only, page reload only, or both (#1751).
- Redesign page Client Events with a dedicated Tracking tab, support for multiple named events per page, variable picker values, and server-resolved
clientEvents payloads in Ajax submit responses (#888).
- Add submission PDF downloads from the control panel and via
craft.formie.generateSubmissionPdf() / craft.formie.getSubmissionPdfDownloadUrl() (#1213, Discussion #1273).
- 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 an
includeFlatpickrCss plugin setting to disable Formie’s bundled Flatpickr stylesheet when your project already provides its own. (#2341)
- Add conditional submission status rules in the form builder Settings → Submissions tab, evaluated on the front end during submission processing. (#508)
- 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 a stock Form Preview slide-out in the form builder, rendering the current form with Formie’s default templates, CSS, and JavaScript. (#370)
- Add submission UID to the control panel submission sidebar and as an optional submissions index column. (#2404)
- Add an opt-in setting to disable the submit button until the current page passes validation. (#1514)
- Add Ajax-safe tab link state theme keys
tabLinkCurrent and tabLinkInactive, with aliases for pageTabLinkActive, pageTabLinkInactive, and pageInactive (#1279).
Changed
- Require Craft CMS 5 and PHP 8.2+.
- Rebuild the form builder around React, schema-driven settings, and shared Plugin Kit components.
- Replace the legacy bundled front-end theme/runtime with package-based browser and framework runtimes for server-rendered and client-rendered forms.
- Route controller, managed client, GraphQL, draft, payment, notification, and integration processing through the staged submission workflow.
- Move integration settings to PHP-defined schemas and front-end integration, captcha, address, payment, and field behavior to client modules.
- 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
disabled so it stays visible but cannot be selected. Legacy disabled: true option rows are treated as hidden. Non-default states are indicated in the options table with row background tints.
- 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)
- Stop routing user-authored form content (labels, placeholders, messages, options) through the
formie translation category. Form copy is output from the database after site overrides are merged; formie.php is for Formie-owned UI strings only (#2907).
- Replace text-limit counter
{startTag}{num}{endTag} translation strings with Craft plural syntax and wire translated counter copy on the front end. (#2526)
- Stream CSV/text report exports row-by-row to disk for memory-safe large datasets (#2497).
- Use stable field references and normalized field values across notifications, calculations, conditions, integrations, GraphQL, exports, and historical submission content.
- Update phone number values sent to integrations to use
E164 format instead of international formatting. (Discussion #2731)
- Improve integration queue job descriptions and debug output with form context (
formId, formHandle, formTitle). (#2172)
- 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)
- Store incomplete submissions and pending uploads in database-backed, tokenized records with expiry, capability checks, garbage collection, and idempotent payment replay handling.
- Replace self-referential synced fields with shared definitions and per-form placements, and update stencils to use snapshot semantics and stable field-reference remapping.
- 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
- 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)
- 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)
- Replace custom static-cache refresh snippets with built-in token refresh behavior and tighten anonymous route, CORS, file-upload, callback, and webhook handling.
- 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 (or freeform5) with --batch-size, --submission-offset, --submission-limit, --submissions-only, and --skip-submissions for large migrations. (#2513)
- Improve default theme color contrast for WCAG 2.2 AA — darker error text, muted helper text, and border-only control styling with split border tokens (#2475).
Fixed
- Fixed rate-limit bypass, CSRF, XSS, information disclosure, payment verification, XML injection, submission permission, and redirect URL vulnerabilities.
- Fix file-upload security checks for MIME types, extensions, active content, and filename normalization.
- Fix plugin uninstall via
project-config/apply failing when Formie stencil project config is removed after the formie_stencils table has already been dropped. (#1710)
- Fix plugin migrations failing on production when
allowAdminChanges is disabled because migrations attempted to write plugin settings to project config. (#2615)
- 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 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 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 payment amount parsing for locale-formatted dynamic values (for example
1,234.56, 1.750,00, and £750.00) on both the server and in the browser payment modules. (#2334)
- Fix payment follow-up states (such as 3D Secure authentication) showing as red validation errors. Action-required and pending payment responses now render as neutral form notices, and Ajax submit payloads include
paymentStatus, paymentMessage, paymentAction, and paymentDecision metadata. (#2660)
- Fix external redirect payments (for example Mollie) leaving users on the status polling page when payment fails. Failed payments now redirect back to the original form URL with a flash error message. (#2502)
- Fix Stripe and other payment follow-up submits re-validating one-time captcha tokens (for example reCAPTCHA v2 checkbox and hCaptcha), which caused duplicate-token spam failures on the second Ajax POST. Incomplete continuation submits now skip captcha screening, matching replay-token behaviour. (#2465)
- 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 OAuth integrations reporting a successful connection when their access token was not persisted. (#2961)
- Fix Zoho picklist mappings sending option metadata IDs instead of their API values. (#2959)
- Fix User element integration silently skipping group assignment when a configured group UID no longer resolves. (#2909)
- Fix Group nested field values being ignored in submission title format tokens and Element/integration field mappings when the picker stored a child field reference. (#2922)
- 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 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
scope parameter is sent with the client-credentials grant, and normalize API domains that include a trailing /rest segment. (#2718)
- Fix Mailchimp integrations not exposing or formatting Address merge fields, which prevented mapping Formie Address fields to Mailchimp audiences that require
ADDRESS data. (#2387)
- Improve Pardot integration errors when an account does not support API v4 (legacy Pardot Classic). (#2642)
- Fix Upload Manager returning “Invalid file upload field” when a File Upload field is nested under a Group (and related nested content-key paths), and writing staged asset ids under the correct nested input names. (#2948)
- Fix Recent Submissions widget breaking the control panel because
WidgetsVendorAsset published from a src/ path that is not shipped in the package (#2939).
- Fix required File Upload fields using Upload Manager never passing client-side validation after a successful upload. (#2924)
- 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 file upload assets being deleted when trashing a submission with File Uploads → Delete files enabled, so restored submissions keep their uploaded files. (#1258)
- Skip notification email attachments when the asset file cannot be read, instead of failing the entire send. (#2626)
- Fix file upload validation allowing extensions such as
.jfif that Craft cannot save as assets. (#2716)
- 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)
- Fix ActiveCampaign Email marketing contact payloads sending blank unmapped properties (now
array_filter’d like the CRM path). (#2934)
- Fix status-change notifications never sending: the trigger compared
Submission::getStatus() as a status model, but it returns the handle string. (#2931)
- Fix control panel submission saves running visitor page-flow and new-submission semantics on
editExisting requests, which blocked status-change notifications, flipped completed submissions to incomplete, and overwrote the selected status. (#2932)
- Fix form import with Update existing form not removing notifications deleted before export. Empty
notifications arrays in the import payload now replace the form’s notifications instead of being ignored. (#1941)
- Fix notification email preview and send failing when both From Name and From Email are set. (#2698)
- Fix Recipients fields preserving the selected option label when multiple recipient options send to the same email address, using encrypted row identity tokens while keeping recipient emails private in front-end markup. (#2382)
- 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)
- 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)
- Validate literal email addresses in notification recipient settings so invalid addresses are caught when saving notifications. (#2712)
- Fix email notification preview failing when a recipient setting references a non-email field. (#2537)
- Fix final submit validating only the current page when a later page is conditionally hidden —
isLastPage() / isFirstPage() now accept the submission so they skip unreachable pages the same way as getNextPage(). (#2927)
- Fix page (and other form-builder) conditions showing an empty Value dropdown for Submission Status by always supplying status select options. (#2925)
- Fix CP submission edit (Follow field conditions) always hiding pages whose conditions use
{submission:*} tokens — the client now evaluates those from a submission snapshot instead of treating them as missing fields. (#2925)
- Fix headless/Ajax validation error messages using the wrong locale by applying the target site language at submission time (#1545).
- 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)
- Fix page-reload single-line and multi-line text limit validation rerenders so field error styling, form-level error messages, and scroll/focus behaviour match ajax submissions. (#1997)
- Fix Address and other fixed-parent sub-field settings being unavailable in the form builder by restoring on-demand field type config loading for nested sub-field types. (#1416)
- 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)
- 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)
- Fix dropdown field options not saving in the form builder when no default option is selected. (#2795)
- Fix replacing a deleted field with a new field using the same handle requiring a two-step save in the form builder. (#1854)
- Fix missing page-list validation indicators in the form builder when a form has no pages. (#2786)
- Keep field error live regions mounted without reserving empty layout space, honour the configured announcement priority, and associate definition-driven errors with their controls. (#2954)
- Fix required Multi-line Text fields with Rich Text enabled being skipped by client-side validation — the backing
<textarea> lives in a display: none wrapper, so visibility is now judged from the rich-text editor host instead. (#2947)
- Fix field validation errors relying on
aria-errormessage alone — also merge the error message id into aria-describedby (keeping any instruction ids) so assistive tech with weak aria-errormessage support still announces the error. (#2946)
- Fix element-field variable tokens with a property selector resolving empty (e.g.
{field:<ref>:title}). Unindexed selectors now resolve against related elements and join multi-value results. (#2930)
- Fix rich text toolbars always showing only Bold/Italic — pass
buttons / linkOptions to pk-tiptap-editor instead of the obsolete *Attr prop names so configured buttons reach the element. (#2929)
- Fix submitting a filled Date/Time field throwing
Undefined property: DateFieldValue::$date during validation when resolving nested date/time paths (including Date fields inside Group/Repeater). (#2923)
- 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
DateFieldValue without requiring a full calendar date. (#2261)
- 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.google instance instead of injecting a second Maps script. (#2041)
- Fix Phone field country selector labels not respecting the field’s Country Language setting. (#2042)
- Fix required asterisk indicator not appearing on Agree fields when the field label is hidden and consent copy is shown on the checkbox label. (#2333)
- Fix Summary field Ajax refreshes ignoring custom
themeConfig classes by round-tripping render-time theme config through the summary HTML endpoint (#1721).
- 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)
- Bound spam keyword scanning and spam log payloads so very large field values cannot stall PHP workers during spam handling. (#2065)
- 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)
- Fix Dropdown, Radio and Checkboxes Disabled option availability not outputting HTML
disabled on the front-end form. (#1816)
- 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 checkbox fields saving their default option values when explicitly unchecked on submit. (#2457)
- Fix the Dutch translation mapping
Auto to Automatisch, 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)
- 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)
- Fix redirect Entry selections on the Behaviour tab (and stencils) never persisting because save read
submitActionEntryId instead of the posted submitActionEntry list. (#2926)
- Fix rich-text links to internal pages opening in a new tab including
rel="noopener noreferrer nofollow". Internal links now omit the attribute; external links keep it. (#2604)
- Fix submit button conditions not applying on the front end. (#2568)
Deprecated
- Deprecate legacy form render IDs, asset helpers, render options, runtime-named classes and JavaScript translation hooks in favor of the new render IDs,
formAssets() / frontendAssets() helpers, client/frontend naming, and package-based runtimes.
- Deprecate legacy HTML tag APIs in favor of slot tag APIs.
- Deprecate JSON, variable, email, and legacy key field-value APIs in favor of array, reference, and reference-block APIs.
- Deprecate legacy custom field schema, preview, and input-template APIs in favor of
defineFormBuilder*Schema(), defineFormBuilderPreviewSchema(), and getInputTemplatePath().
- Deprecate legacy integration settings, front-end variables, payment processing, and submission dispatch helpers in favor of schema settings, client modules, and workflow services.
- Deprecate legacy Formie DOM and validator events, GraphQL client-event setting names, refresh-token parameters, theme config keys, and schema config keys.
- Deprecate the
PredefinedOptions service and namespace in favor of OptionSources and the verbb\formie\options\predefined namespace.
Removed
- Remove the legacy
CustomElement submission model, FieldLegacy trait, Formie 3 field inputHtml() fallback, and expired field name helpers.
- Remove the old JavaScript form bus, built-in front-end bundle assumptions, and
getFrontEndJsVariables() integration API.
- Remove the Duplicate, JavaScript, and Honeypot captcha integrations and the Algolia address provider.
- Remove file, Redis, Memcached, and session-backed submission progression; Formie 4 uses database-backed state and no longer exposes
submissionStateMode or submissionStore.
- Remove
enableGatsbyCompatibility and direct templateHtml usage from the primary GraphQL rendering path.
- Require GraphQL submission mutations to pass the applicable submission guards and a bootstrap
requestToken for headless transports.
";s:4:"date";s:19:"2026-10-16T00:00:00";}i:8;a:4:{s:7:"version";s:6:"3.1.50";s:8:"critical";b:0;s:5:"notes";s:566:"Fixed
- Fix plugin initialization failing on Craft versions before 5.10, preserving user submission deletion, reassignment and restoration. (#3035)
- Fix custom CRM integrations failing to send submissions when field settings are omitted. (#3033)
- Fix field variables in notification subjects appearing literally in PDF attachment filenames. (#3025)
";s:4:"date";s:19:"2026-10-22T00:00:00";}i:9;a:4:{s:7:"version";s:6:"3.1.49";s:8:"critical";b:0;s:5:"notes";s:888:"Changed
- Update the minimum Auth requirement to
2.0.55.
Fixed
- Fix Date/Time field variables rendering blank in email notification subjects and legacy whole-field variables rendering blank in subjects and content. (#3015)
- Fix notification properties and submission site names being blocked by the Twig sandbox in PDF attachment filenames. (#3018)
- Fix Pardot form handlers rejecting submissions with existing single-select mappings such as
country.value, while retaining plain field names and separate multi-select values.
- Fix SuiteCRM Contact fields not loading for field mapping with the V8 API. (#3010)
";s:4:"date";s:19:"2026-10-20T00:00:00";}i:10;a:4:{s:7:"version";s:6:"3.1.48";s:8:"critical";b:0;s:5:"notes";s:2746:"Changed
- Updated user deletion handling to use Craft’s deletion blockers, with options to reassign, unassign, or delete related submissions.
Fixed
- Fixed Craft emitting deprecation warnings while loading Formie fields.
- Fix SugarCRM connections sending an invalid placeholder client secret, and allow custom OAuth client credentials. (#2988)
- Fix non-form JSON files causing an error when reviewed for import. (#3001)
- Fix long-running queue workers sending email notifications with settings cached from an earlier job. (#2998)
- Fixed element integration mappings accepting unsupported query or element attributes.
- Fixed element field option ordering accepting unsupported query expressions.
- Fixed Entries and other element field handles rendering empty in email notification Twig, including query methods, length checks and numeric indexing. (#2996)
- Fix logged-in user variables being blocked by the Twig sandbox in File Upload field subpaths.
- Fix
{systemEmail}, {systemReplyTo}, and {systemName} resolving to literal environment variable names in email notifications. (#2997)
- Fixed form notification settings accepting changes without the corresponding form-builder permission.
- Fixed control-panel lists and import summaries rendering untrusted values as markup.
- Fixed support requests disabling TLS certificate verification.
- Fixed provider secrets being included in reCAPTCHA request URLs.
- Fixed Pardot prospect email values being interpolated into API paths without encoding.
- Fix Pardot form handlers treating multiple checkbox and multi-select values as one combined option by sending each selected value as a separate parameter.
- Fixed form duplication and form-builder metadata endpoints bypassing their corresponding permissions.
- Fixed notification IDs being accepted when they belonged to another form.
- Fixed submission bulk actions applying changes outside the current user's save permissions.
- Fixed element-index requests accepting client-controlled form scopes for submissions and sent notifications.
- Fixed notification editors being able to attach assets they are not permitted to view.
- Fixed read-only submission viewers being offered subscription cancellation actions.
";s:4:"date";s:19:"2026-10-15T00:00:00";}i:11;a:4:{s:7:"version";s:6:"3.1.47";s:8:"critical";b:0;s:5:"notes";s:266:"Changed
- Require Verbb Auth 2.0.50 or later for OAuth password-grant callback support.
Fixed
- Fix SugarCRM connections failing to authenticate. (#2988)
";s:4:"date";s:19:"2026-10-09T00:00:00";}i:12;a:4:{s:7:"version";s:6:"3.1.46";s:8:"critical";b:0;s:5:"notes";s:823:"Changed
- Require Verbb Base 3.0.20 or later so shared control-panel layouts use the current asset bundle namespace. (verbb-base#3)
Fixed
- Fix statically cached forms occasionally discarding valid submissions when Craft's asynchronous CSRF input races Formie's CAPTCHA token refresh. (#2986)
- Fix composite field variables in notification email headers failing to render. (#2985)
- Fix element field previews ignoring Specific Elements and other option settings after editing a field.
- Fix conditionally hidden fields remaining visible when using custom field wrappers.
";s:4:"date";s:19:"2026-10-07T00:00:00";}i:13;a:4:{s:7:"version";s:6:"3.1.45";s:8:"critical";b:0;s:5:"notes";s:1375:"Changed
- Updated the required version of
verbb/base to 3.0.19.
Fixed
- Fix Payment field details missing from submission exports.
- Fix Phone subfield variables causing notification email bodies to render empty. (#2980)
- Fix Salesforce Client Credentials API requests failing after a successful connection. (#2981)
- Fix queued integration jobs including cached provider metadata, and improve HubSpot submission performance for accounts with many forms.
- Fix invalid HubSpot tracking-cookie values causing form submissions to be rejected.
- Fix hidden labels remaining visible for element fields using Radio Buttons or Checkboxes display types. (#2979)
- Fix text word and character limits disagreeing between browser and server validation for Unicode punctuation, emoji, and composed characters. (#2977)
- Fix
{formName}, {formHandle}, and {siteHandle} being blocked by the Twig sandbox in File Upload field subpaths. (#2978)
";s:4:"date";s:19:"2026-10-02T00:00:00";}i:14;a:4:{s:7:"version";s:6:"3.1.44";s:8:"critical";b:0;s:5:"notes";s:1979:"Added
- Add Salesforce Client Credentials authentication with configurable My Domain support. (#2961)
- Add the
allowLegacySignatureImageUrls config setting to disable unsigned Signature image URLs for existing submissions.
Changed
- Protect Signature image URLs for new submissions with field-scoped access tokens while preserving URLs in previously sent email notifications.
Fixed
- Fixed a moderate-severity authorization vulnerability. (GHSA-q6g7-g2wg-h43h)
- Fix field variables in notification email address settings resolving to rendered HTML when custom email templates are used. (#2974)
- Fix OAuth integrations failing to connect after authorisation. (#2973)
- Fixed OAuth callback transaction validation.
- Fixed authorization for connecting and disconnecting OAuth integrations.
- Fixed a moderate-severity information disclosure vulnerability. (GHSA-rh4q-6j5r-8jqf)
- Fixed a moderate-severity authorization vulnerability. (GHSA-p696-447f-9258)
- Fixed a moderate-severity authorization vulnerability. (GHSA-qg3f-hm4x-h5h8)
- Fixed a moderate-severity information disclosure vulnerability. (GHSA-963f-vfpf-f85p)
- Fix slow GraphQL schema creation and form rendering when integrations have large cached settings. (#2972)
- Fix email notifications failing when their content references an empty optional field.
- Fix email notifications failing when their content references a deleted field.
- Fix PHP 8.4 deprecation warnings caused by implicitly nullable parameters and CSV parsing. (#2970)
";s:4:"date";s:19:"2026-09-30T00:00:00";}i:15;a:4:{s:7:"version";s:6:"3.1.43";s:8:"critical";b:0;s:5:"notes";s:660:"Fixed
- Fixed a high-severity server-side request forgery vulnerability. (GHSA-82jr-3xc8-86mr)
- Fix creating forms from legacy stencils containing temporary page, row, or field IDs.
- Fix editing stencils when the Solspace Calendar event integration is installed.
- Fix form redirect responses failing after the submission was saved. (#2969)
- Fix form content fields being inaccessible in email notification variables after the Twig sandbox security changes.
";s:4:"date";s:19:"2026-09-24T00:00:00";}i:16;a:4:{s:7:"version";s:6:"3.1.42";s:8:"critical";b:0;s:5:"notes";s:1202:"Changed
- Resolve redirect URL placeholders as strict submission, field and form tokens instead of executing Twig, while rendering remaining form-authored Twig and object templates in Base's explicit sandbox.
- Require
verbb/base 3.0.17 or later for the explicit sandbox renderers and collection safeguards.
- Apply
EVENT_MODIFY_TWIG_ENVIRONMENT permissions as additions to Twig sandbox defaults; broad allowedClasses permissions no longer apply to those renders.
Fixed
- Fixed a high-severity server-side template injection vulnerability. (GHSA-25q7-h5pg-6wjv)
- Fixed a high-severity server-side template injection vulnerability. (GHSA-3m2m-h2c6-gjwh)
- Fixed a high-severity server-side template injection vulnerability. (GHSA-f55h-mf7f-7wx7)
- Fixed a high-severity server-side template injection vulnerability.
";s:4:"date";s:19:"2026-09-23T00:00:00";}}s:13:"phpConstraint";s:4:"^8.2";s:11:"packageName";s:12:"verbb/formie";}s:22:"graphql-authentication";a:3:{s:6:"status";s:8:"eligible";s:8:"releases";a:0:{}s:11:"packageName";s:37:"jamesedmonston/graphql-authentication";}s:10:"lettermint";a:4:{s:6:"status";s:8:"eligible";s:8:"releases";a:1:{i:0;a:4:{s:7:"version";s:6:"v2.0.0";s:8:"critical";b:0;s:5:"notes";s:374:"Added
- Test suite, coding standard and static analysis checks.
Changed
- Use the official
lettermint/symfony-mailer transport instead of somehow-digital/symfony-lettermint-mailer.
- Update the plugin icon and add an icon mask.
";s:4:"date";s:19:"2026-10-25T00:00:00";}}s:13:"phpConstraint";s:4:"^8.2";s:11:"packageName";s:32:"somehow-digital/craft-lettermint";}s:12:"phone-number";a:3:{s:6:"status";s:8:"eligible";s:8:"releases";a:0:{}s:11:"packageName";s:25:"rynpsc/craft-phone-number";}s:15:"craft-recaptcha";a:3:{s:6:"status";s:8:"eligible";s:8:"releases";a:0:{}s:11:"packageName";s:20:"c10d/craft-recaptcha";}}}i:1;N;}