Import forms from Contact Form 7, Gravity Forms, WPForms, and Ninja Forms.
Supported Sources
| Source | Forms | Entries | Detection Method |
|---|---|---|---|
| Contact Form 7 | Yes | No | post_type = 'wpcf7_contact_form' |
| Gravity Forms | Yes | Yes | Table wp_gf_form exists |
| WPForms | Yes | Paid storage only | post_type = 'wpforms' |
| Ninja Forms | Yes | Current nf_sub posts + legacy nf3_subs storage | Table wp_nf3_forms exists |
Running Migration
if ( class_exists( 'FORMFORGE_Migration' ) ) {
$migration = FORMFORGE_Migration::instance();
// Available sources: 'cf7', 'gravity', 'wpforms', 'ninja'
}Field Type Mapping (CF7)
| CF7 Type | Form Forge Type |
|---|---|
text | text |
email | email |
tel | phone |
textarea | textarea |
select | select |
checkbox | checkbox |
radio | radio |
file | file_upload |
WPForms file-upload, Ninja Forms file, and Gravity Forms fileupload are also normalized to file_upload. Migration preserves accepted file extensions from CF7 filetypes, WPForms extensions, Ninja nf3_field_meta upload type settings, and Gravity Forms allowedExtensions when those values exist.
For Ninja Forms 3.x, current field metadata is read from wp_nf3_field_meta; placeholders, choice options, required flags, and file upload limits should not be inferred from the base wp_nf3_fields row alone. Required flags may arrive as MySQL BIT(1) bytes and must be decoded before casting to boolean. Current free Ninja Forms submissions are stored as nf_sub posts with _form_id, _seq_num, and _field_ postmeta; older wp_nf3_subs / wp_nf3_sub_meta rows are still imported when present.
Gravity Forms entries store compound fields under sub-input ids such as 1.3, 1.6, or 3.1. Form Forge aggregates supported Name, Address, and checkbox sub-inputs into one readable migrated submission value for the corresponding field label. Gravity Forms field descriptions, CSS classes, admin labels, default confirmation messages, and simple admin/user email notification settings are copied when they map safely. Third-party add-on feeds, payment settings, conditional logic, and provider-specific integration configs are intentionally not migrated.
Post-Migration Steps
- Review migrated forms in the builder
- Update notification email addresses
- Replace old shortcodes in content
- Test each form
- Deactivate the old form plugin
—