First released in 2013, Webheadcoder Multi-Step Forms for Contact Form 7 adds multi-step flows to forms by placing each step on a separate page, preserving submitted data between steps, and sending the completed email only from the designated step configured to send it. See it in action at https://w
PricingFree downloadThe WordPress.org download is free. Pro versions, add-ons or external services may cost extra.
CompatibilityRequires WordPress 5.9 and PHP 7.3.
SourceWordPress plugins · Nov 15, 2026
01 / Source details
Aboutthistool.
First released in 2013, Webheadcoder Multi-Step Forms for Contact Form 7 adds multi-step flows to forms by placing each step on a separate page, preserving submitted data between steps, and sending the completed email only from the designated step configured to send it.
See it in action at https://webheadcoder.com/contact-form-7-multi-step-forms/
Requires Contact Form 7 (5.6 or above) by Rock Lobster Inc. (Takayuki Miyoshi).
Usage
01Create one page or post for each step in your multi-step form process. If you have three steps, create three pages or posts. You will need their URLs when creating your forms.
02Create a Contact Form 7 form.
03Place your cursor at the end of the form.
04On the “Form” tab of the Contact Form 7 form, click on the button named “multistep”.
05In the window that opens, select “First Step” if this is the first step of your multi-step form. If this is the last step, select “Last Step.” All other checkboxes are optional.
06The Next Page URL is the URL that contains your next form. If this form is the last step, you can leave the URL field blank.
07Click “Insert Tag.”
08Save your completed form and place the form’s shortcode into the appropriate page or post you created in step 1.
09Repeat for each form in your multi-step form process.
10On the last step, you may want to send an email. Select “Send Email” in step 5. On the Mail tab, enter mail-tags as you normally would. For example, if your first form has the field your-email , you can include [your-email] in the Mail tab on your last form. Contact Form 7 may flag this because your-email is not displayed on the current form; you can safely ignore that warning.
Multistep Tag Options
Name – The name of this multistep form-tag. This is required, but is currently not being used.
First Step – Besides marking the first step of your multistep form, this allows any form to act as the first step and display when no previous data has been submitted. This is useful when you want some users to skip the first step.
Last Step – Besides marking the last step of your multistep form, this clears the data from users’ browsers. Once they submit this form, they will no longer see their data populate the forms.
Send Email – If this is checked the form will send an email like a normal Contact Form 7 submission.
Skip Save – If you use Flamingo or CFDB7 to save submissions to the database this prevents saving this form submission.
Next Page URL – This is the URL your users will go to after the form is submitted. [multistep multistep-123 last_step send_email skip_save “/thank-you”]
Additional Tags
[multiform "your-name"]
The multiform form-tag can be used to display a field from a previous step. Replace your-name with the name of your field. This is only for use on the Form tab, this tag will not work in the Mail tab.
[previous "Go Back"]
The previous form-tag can be used to display a button to go to a previous step. Replace Go Back with text you want to show in the button.
Messages Tab When a visitor visits the fourth step in your multi-step form without completing the first step, the message “Please fill out the form on the previous page.” is displayed. You can change this for each form in the Messages tab.
What this plugin DOES NOT do:
The free version supports file uploads on the last step only. If you need file uploads, place them on the last step. The Pro version supports file uploads on any step.
This plugin does not load another form on the same page. It only works when the forms are on separate pages. Many have asked to make it load via ajax so all forms can reside on one page. This plugin does not support that.
PRO Version If you expect to have a lot of data submitted through your multi-step forms, the Pro version may be able to help you better. The PRO version uses Session Storage so it is able to handle roughly 1,000 times more data for your multiple forms. In total it can handle about 5MB vs 4KB in the free version. Currently the Pro version REQUIRES the WordPress REST API and Contact Form 7 AJAX Submission to be enabled.
Another feature the Pro version offers is the ability to skip steps with the “Contact Form 7 – Conditional Fields plugin”. Learn more here.
The Pro version also lets visitors upload files on any step and attaches them to an email sent by that step or a later one. See “Can visitors upload files on any step?” below.
Source Code
The human-readable source for this plugin’s minified JavaScript and compiled CSS is published at https://github.com/coreyt808/webheadcoder-multi-step-forms-for-contact-form-7 , with the unminified files in assets-src/ . To rebuild the generated files in resources/ , use Node.js 24 and run composer install , npm ci , and npm run deploy .
External services
This plugin uses Freemius, an external service, for optional usage tracking and opt-in, licensing, account management, pricing, and purchase or upgrade functions. Freemius receives and processes information used for these functions. The free plugin remains usable if an administrator chooses “Skip” on the Freemius opt-in screen.
If an administrator opts in, the plugin can send the opted-in administrator’s first name, last name, and email address; the plugin’s version and state; the WordPress and PHP versions; the site language and website URL; and, when the administrator separately allows it, the list of installed plugins and themes.
Activating and maintaining a paid license sends the license and site or product information needed for license activation, account management, and update checks. A pricing or checkout connection is initiated only after an administrator explicitly selects a plugin-provided Upgrade or Purchase link and proceeds through the Freemius SDK-managed flow.
Learn more about Freemius , its opt-in behavior , and its data practices . Use of the service is subject to the Freemius Terms of Service and Privacy Policy .
02 / Source details
Frequently asked questions.
The Next button doesn’t show up
You still need a standard Contact Form 7 submit button on each step.
Add a submit tag like this: [submit “Next”]
Also note: multistep is a hidden field. If content appears to disappear right after it, place the tag at the end of the form (or add a line break after it).
I keep getting the “Please fill out the form on the previous page” message. What’s wrong?
This message usually means step-tracking data is missing. Check these first:
01Caching is blocking cookies. Exclude cookies named cf7* from cache behavior.
02Form step URLs do not match protocol or domain. Every step must use the same domain and protocol. For example, if your first page uses https://webheadcoder.com , your second page cannot use http:// or a subdomain.
03The first form is missing first_step in its multistep tag, for example: [multistep multistep-123 first_step “/your-next-url/”]
Why are no values being passed from one form to the next form?
If the page reloads on submit instead of using AJAX, Contact Form 7 JavaScript is not running correctly or the REST API is disabled.
Use Contact Form 7’s troubleshooting guide: https://contactform7.com/why-isnt-my-ajax-contact-form-working-correctly/
How can I show a summary of what the user entered or show fields from previous steps?
[multiform “your-name”] Use the multiform tag to display values captured on earlier steps. Replace your-name with your field name.
My form values aren’t being sent in the email. I get [multiform “your-name”] instead of the actual person’s name.
multiform is for the Form tab only.
For email content in the Mail tab, use standard CF7 mail-tags such as [your-name] , not [multiform "your-name"] .
Also confirm the last step includes the multistep tag.
Can I have an email sent on the first step of the multi-step forms?
Yes. Enable “Send Email” in the tag generator, or add send_email directly in the tag: [multistep multistep-123 first_step send_email “/your-next-url/”]
My forms are not working as expected. What’s wrong?
Start with these checks:
Confirm every step includes a multistep tag.
Look for JavaScript errors from other plugins or themes that may block CF7 scripts.
Temporarily deactivate other plugins and test again to isolate conflicts.
Why “place your cursor at the end of the form” before inserting the multistep tag?
multistep is a hidden field and intentionally adds minimal spacing. If another element is placed immediately after it, that element may appear hidden.
To avoid this, insert multistep at the end of the form or add a line break after the tag.
How do I get Flamingo or CFDB7 to not save every form?
Use the “Skip Save” option, or add skip_save in your multistep tag: [multistep multistep-123 skip_save “/your-next-url/”]
Can visitors upload files on any step?
In the free version, use Contact Form 7’s normal [file] and [file*] on the last step only.
In the Pro version, use Contact Form 7’s normal [file] and [file*] fields on any step. Files upload when the visitor submits that step. To attach a file from an earlier step, add its mail-tag to the File attachments setting on the Mail tab of the form that sends the email, as you would for a file on the same form. For example, a file uploaded as [file file-123] on step 1 is attached by a later form whose File attachments contain [file-123] . The file name is available as [file-123] in the email body and [multiform file-123] on the Form tab.
How it works and its limits:
Files are kept on the server in wp-content/uploads/cf7msm_uploads/ until the visitor completes the last step, and are deleted after 6 hours without a successful step. Change this with the cf7msm_upload_ttl filter (in seconds).
The files retained for one visitor can total 25 MB, the same as Contact Form 7’s per-email limit. Change this with the cf7msm_upload_max_flow_bytes filter. An email cannot attach more than 25 MB, so the step is stopped with a message instead of sending without some files.
When a visitor goes back to a step, the earlier file is shown as “Already uploaded” with Replace and Remove buttons. Uploading a field with the same name on a later step replaces the earlier file.
If an earlier file has expired, the step that sends the email asks the visitor to go back and upload it again instead of sending the email without it.
Flamingo, CFDB7 and Advanced CF7 DB only save the files uploaded on the step being submitted. The skip_save option does not affect file uploads.
All steps must be served by the same web server, or by servers that share the uploads directory. Load-balanced or ephemeral-disk hosting where a later step can reach a server without the files is not supported.
Contact Form 7’s configuration validator only checks file fields on the current form, so it does not warn about the size of files from earlier steps.
The upload directory must be inside wp-content , the WordPress uploads directory or WP_TEMP_DIR . A different location can be set with the cf7msm_upload_dir filter.
The directory is protected by an .htaccess file on Apache. Nginx ignores .htaccess , so add a rule like this to your server block:
FinderPress Media Auditor helps site administrators scan for broken images, missing Media Library files, unreachable media URLs, and other media issues across WordPress content. Use it to audit images, video, audio, PDFs, featured images, and attachment files without sending scan data to an external
The Accepted Payment Methods plugin is a straightforward, lightweight solution that enhances your website by displaying visually appealing icons of the payment methods you accept. This plugin is ideal for a variety of websites, including e-commerce platforms, service-oriented websites, and informati