You are viewing beta documentation for Formie 4.x.
Migrations & Upgrades
Major upgrade — real-project checklist
Major Formie upgrades touch templates, custom fields, integrations, front-end JavaScript, spam settings, and status APIs. This checklist distils Upgrading From v3 into a practical project runbook — for upgrading an older Formie codebase.
Prerequisites
- Staging environment mirroring production
- Upgrading From v3 open for detailed breaking-change reference
- Database and files backup
Leave compatibilityMode enabled until deprecation logs are clear:
config/formie.php
return [
'compatibilityMode' => true,
];Phase 1 — Pre-upgrade audit
- List custom Formie fields, integrations, modules listening to Formie events
- Grep for deprecated APIs:
getStatuses(),renderFormAssets,onAfterFormieSubmit,defineGeneralSchema,getValueAsJson - Inventory Twig templates using
craft.formie.*andform.getFormId() - Note static cache / Blitz setup and any custom CSRF refresh snippets
- Export critical forms JSON (Settings → Import/Export) as rollback snapshots
- Review
translations/*/formie.phpfor field labels that should move to CP site overrides
Phase 2 — Install and migrate
- Update Formie via Composer on staging
- Run pending Craft migrations /
project-config/sync - Confirm
compatibilityModeistruein config - Open Formie → Settings → Spam Protection — verify guards and captcha providers seeded from legacy settings
- Remove obsolete config keys:
enableGatsbyCompatibility,submissionStateMode,submissionStore - Clear deprecation log baseline:
./craft clear-deprecations
Phase 3 — Control panel verification
- Open each form in the builder — schema loads without JS errors
- Verify Submission Statuses and Form Statuses in the control panel
- Test notification preview and test send
- Reconnect OAuth integrations (Stripe, Mailchimp, and so on)
- Confirm form groups, stencils, and reports if used
Phase 4 — Template and front-end
Run the full template compatibility audit. Minimum checks:
craft.formie.renderFormAssets()→craft.formie.formAssets()renderCss/renderJsoptions →includeCss/includeJsform.getFormId()→form.getRenderId()submission.getValueAsString()→submission.getFieldValueAsString()- Front-end event listeners updated (
formie:submit:result,formie:validator:ready) - Remove custom static-cache token refresh JS if
staticCacheRefreshOnLoadhandles it - GraphQL:
formieHtmlForminstead oftemplateHtml;enableClientEventsinstead ofenableJsEvents
Phase 5 — Custom PHP
- Field schema methods renamed to
defineFormBuilder*Schema() - Integration settings use
defineFormSettingsSchema()not Twig HTML - Captchas/address providers use
getClientModule()notgetFrontEndJsVariables() - Notification events on
Notificationsservice; integration events onIntegrations - Dispatch via
IntegrationTriggers/Notificationsservices, notSubmissionshelpers - Submission status classes:
SubmissionStatuses,SubmissionStatus - Theme config:
defineFieldSlotTag()/SlotTaginstead ofdefineHtmlTag()/HtmlTag
Phase 6 — Spam and screening
- Legacy Honeypot/Javascript/Duplicate captcha integrations removed — replaced by submission guards
- Spam keywords and captcha secrets in control panel settings, not old
project.yamlplugin keys - Review Spam keywords in detail if rules were complex
- Test submit with honeypot filled (should mark spam) and normal submit (should succeed)
Phase 7 — Translations
- Remove form builder content from
formie.php(field labels, messages) - Update validation string keys:
{attribute}→{label} - Update text-limit counter plural strings (see upgrading doc)
- Multi-site: French copy in CP site overrides, not locale files
Phase 8 — Functional testing
- Single-page form — page reload submit
- Multi-page form — Ajax navigation, back button, incomplete save
- Save and continue later — resume link works after 24h if within TTL
- File upload field
- Payment form (if applicable) — including 3DS retry
- Email notifications — inbox placement, PDF attachment
- Integrations — CRM/marketing trigger on submit
- GraphQL/headless submit if used
- Static cached page submit
- Client events / GTM payload on success
Phase 9 — Production cutover
- Deploy during low traffic
project-config/syncon production- Re-enter production integration secrets and captcha keys (if DB not copied from staging)
- Monitor Craft queue for notification/integration failures
- Monitor
storage/logs/web.logfor Formie deprecations
Phase 10 — Disable compatibility mode
When staging shows zero Formie deprecation warnings after realistic traffic:
return [
'compatibilityMode' => false,
];- Re-run full test suite
- Deploy config change
- Watch logs for 48 hours
Quick replacement reference
| Old | New |
|---|---|
craft.formie.renderFormAssets(form) | craft.formie.formAssets(form) |
form.getFormId() | form.getRenderId() |
submission.getValueAsJson() | submission.getFieldValueAsArray() |
onAfterFormieSubmit | formie:submit:result |
getStatuses() | getSubmissionStatuses() |
defineGeneralSchema() | defineFormBuilderGeneralSchema() |
| Honeypot captcha integration | Honeypot submission guard |
enableJsEvents | enableClientEvents |
Full table in Upgrading From v3.
Related
Last updated: June 27, 2026, 2:14:20 PM