Contact Form X


Displays a user-friendly contact form that your visitors will love.

CFX: Contact form reinvented. Fast and friendly. Fresh and clean. Awesome for everyone 🙂


Install, activate, and then display the form anywhere, using the widget, shortcode, or template tag. Here is an overview of Contact Form X:

  • Easy to use
  • Simple and secure
  • Lightweight and super fast
  • Provides multiple form styles
  • Customize just about everything
  • Display the contact form anywhere
  • Change the order of the form fields
  • Send email to multiple recipients
  • Complete documentation via Help tab
  • Excellent free plugin support

For a quick look at the plugin, check out the “Screenshots” section, below.

Form Fields

Easily choose which fields to display in the form. Each field may be set as required, optional, or disabled. Choose from these fields:

  • Name
  • Website
  • Email
  • Subject
  • Custom Field
  • Challenge Question
  • Message
  • Google reCaptcha (v2 or v3 Invisible)
  • Carbon Copy
  • Agree to Terms

You can change the order of these fields and customize their labels and placeholders, everything is super flexible.

For a live demo of Contact Form X, visit my contact page at Perishable Press. Note: the form at Perishable Press is highly customized with CSS, but all other functionality is the same. Feel free to send a test email to see how it works, I won’t mind 😉 Also check out CFX in the “Screenshots” section (below) for a better idea of how the default form is styled out of the box.


To help protect user privacy, Contact Form X provides the following features:

  • Agree to terms checkbox, customizable
  • Choose which fields to include with the form
  • Option to disable collection of user IP address and other data
  • Note: this plugin uses cookies to enhance form functionality

Basically, this plugin enables visitors to send a message via contact form. Any information the user enters into the form will be sent directly to the recipient(s) according to plugin settings. When enabled in the plugin settings, details about each sent message will be stored in the WordPress database. Visit the “Advanced” plugin settings to control this and other data-collection features.

Note: This plugin provides an option to enable Google reCaptcha, which is provided by Google as a third-party service. For details on privacy and more, please refer to official documentation for Google reCaptcha.

CFX is developed and maintained by Jeff Starr, 10-year WordPress developer, security specialist, and book author.

Geeky Stuff

Lots of goodness for the geeks among us:

  • Built with the WordPress API
  • Ajax-powered form submission
  • Remembers form data on error
  • Google reCaptcha version 2
  • NEW: Google reCaptcha version 3 (invisible)
  • NEW: Drag/drop ordering of the form fields
  • View your email messages on the WP Dashboard
  • Option to enable/disable storing of email data in database
  • Display form via widget, shortcode, or template tag
  • Five CSS themes: Default, Classic, Micro, Synthetic, Dark
  • Optionally collect user data like IP, host, and referrer
  • Works perfectly with or without Gutenberg Block Editor
  • Focused on performance, security, and usability
  • Include extra form and user info with each message
  • Customize the form’s success and error messages
  • Provides plenty of useful hooks for developers
  • Targeted loading of CSS and JavaScript assets
  • One-click remove email data from database
  • One-click restore default options
  • Translation ready

Contact Form X is a fresh new, lighter alternative to the heavier contact forms out there. CFX is lightweight yet fully featured. As they say, “everything you want, nothing you don’t”.

Support development of this plugin

I develop and maintain this free plugin with love for the WordPress community. To show support, you can make a donation or purchase one of my books:

And/or purchase one of my premium WordPress plugins:

Links, tweets and likes also appreciated. Thanks! 🙂


  • Plugin Settings/tab: Email Settings
  • Plugin Settings/tab: Form Settings
  • Plugin Settings/tab: Customize
  • Plugin Settings/tab: Appearance
  • Plugin Settings/tab: Advanced
  • Documentation at your fingertips via the Help tab
  • Theme Style: Default
  • Theme Style: Classic
  • Theme Style: Micro
  • Theme Style: Synthetic
  • Theme Style: Dark
  • Success Message Options (customizable)
  • Showing some error messages (customizable)
  • Dashboard Widget (click toggles email message)
  • Email with optional extra info included


Installing the plugin

  1. Upload the plugin to your blog and activate
  2. Configure the plugin settings as desired
  3. Display the form on any post or page via shortcode: [contactformx]

Visit the Help tab on the plugin settings page for complete documentation.

More info on installing WP plugins


This plugin cleans up after itself. All plugin settings will be removed from your database when the plugin is uninstalled via the Plugins screen.

Note: uninstalling/deleting the plugin via the WP Plugins screen results in the removal of all settings and email data from the WP database.

Like the plugin?

If you like Contact Form X, please take a moment to give a 5-star rating. It helps to keep development and support going strong. Thank you!


What about the styles?

The plugin provides five form styles (themes): Default, Classic, Micro, Synthetic, and Dark.

The first three themes (Default, Classic, Micro) employ minimal, mostly structural styles. One of the benefits of using the minimal styles is that they allow your WordPress theme to set the form’s appearance. And that’s good because it helps keep your pages looking visually consistent across your site.

The last two themes (Synthetic, Dark) go much further with the stylings. The Synthetic and Dark styles will override any/most CSS applied via your WordPress theme. So if the contact form looks weird or whatever when trying Default, Classic, or Micro, try either Synthetic or Dark should do the trick.

What about targeted loading of assets?

Sure. By default, Contact Form X loads its assets (CSS and JavaScript) on every front-end page. So if you display a contact form in your sidebar, it will work on all pages.

Some sites prefer to have a “Contact” page, and then just display the contact form in one location. In this scenario, it doesn’t make sense to include plugin assets on every front-end page. So CFX provides a setting called “Targeted Loading” (under the Advanced tab). There you can enter the URL of the page that displays the contact form. That way, the plugin will know to load assets only on that page. This is an excellent way to help keep things optimized for performance and so forth.

How to change the button color?

In the plugin settings, visit the “Appearance” tab. There you will see the first option, “Form Style”. That tells you which styles are used for the form. So to change the button color, scroll down to locate the styles that you are using (e.g., Default, Classic, Micro, et al). To change the color of the submit button, add the following line to whichever styles you are using:

#cfx .cfx-button { background: red !important; }

Change the red to whatever color you want. Can use hex values, rgba, or any valid CSS properties. Save changes and done.

How to include extra form data with email messages?

Visit the Advanced tab and enable “Extra Email Info” option. Save changes and done.

How to defer or async loading of JavaScript?

The recommended way to defer or async load JavaScript is to use a trusted plugin, such as this one.

How to set maxlength on the Message textarea?

It is possible to set a maxlength attribute on the Message field, a textarea. To do so, add the following code via (child) theme or custom plugin:

function contactformx_textarea_maxlength($chars) { return 500; }
add_filter('contactformx_textarea_maxlength', 'contactformx_textarea_maxlength');

You can adjust the number of characters by changing 500 to any number.

How to display the form shortcode inside a widget?

Enable the Advanced option, “Widget Shortcodes”. Save changes and done.

How to remove or empty the old database table?

In CFX v1.9, sent emails optionally may be stored in the database as custom post types. Before CFX v1.9, email data was stored in its own/separate database table. So that means users who are upgrading from previous versions to 1.9 or better will have an unused email table in their database. It won’t hurt or affect anything, but you may want to empty or remove it to help save space.

Important: the following steps are for users of CFX v1.9+ who have upgraded from a previous version. Do NOT follow these steps if using CFX versions less than 1.9, OR if you never have used any version of CFX less than 1.9.

To empty the old/unused CFX database table:

  1. Log in to WordPress as admin-level user
  2. Create a new page and leave in Draft status
  3. Add [contactformx_legacy_empty_table] to the page
  4. Preview the page on the frontend
  5. Click the link to Empty the CFX database table
  6. After seeing the success message, delete the draft page and shortcode

To remove the old/unused CFX database table:

  1. Log in to WordPress as admin-level user
  2. Create a new page and leave in Draft status
  3. Add [contactformx_legacy_drop_table] to the page
  4. Preview the page on the frontend
  5. Click the link to Empty the CFX database table
  6. After seeing the success message, delete the draft page and shortcode

Using a temporary/draft page for the shortcode and then deleting it afterwards ensures that only YOU are making changes to the database. It is important to not display either of the above shortcodes publicly.

Got a question?

Send any questions or feedback via my contact form


January 7, 2021
Hey Jeff, Another lightweight plug and play plugin as always! and that's awesome. I wish it could add multiple forms though. or am I missing anything from docs?
November 10, 2020
Good options for a clean, customizable and code valid contact page! The support is excellent and very resposive to feedback and help is almost immediate! Thank you for an amazing plugin!
September 29, 2020
Just finished spending some time working with this Plugin and although I haven't used all the Free ones of this type, thought I would give my Review. What I Noticed ------------------------------ All Example Screenshots show "label" element before "input" element and indeed, that is the way the code is produced for the front-end. This is as it should be for Accessibility and Best Coding Practice in general. And yet in the Admin section they are reversed. Although it may "look" better, design wise, it is not better for Accessibility and Best Coding Practice in general. There may already be people using WordPress that would really enjoy more Accessibility coding on the Admin side -- or will be. Also in the Admin section, for all 5 Tabs, the "label" elements for each page are turned into links which, if somewhat confusing, is probably not intentional. I have to wonder if it is due to your use of coding within the Help Tab. That is just a guess on my part and even though it is an oddity, it doesn't detract from the page functionality. With that said, I also compliment you on your excellent use of the Help Tab (page top, far right under login name) to provide detailed information about the Plugin without having to go off the page. Suggestions ------------------------------ To add more eMail Recipients one must change the number setting then 'Save' changes, in order to get a Form to include another recipient information. Didn't see that mentioned anywhere. Although I was able to figure out that one must first change the "number setting" then click 'Save', I fear many will spend excessive amount of time on figuring this out. Especially since there is a 'delete' link for each Recipient but if one doesn't change the number, a Recipient form will keep reappearing. I know, seems like a small thing and maybe it is and it's just me. Detailing that bit of information would remove any ambiguity. To the right of "Number of recipients" input field is a link named "Number of recipients". Suggest replacing that with the text "Increase/Decrease number then click Save. This will Create/Remove Form for other Recipient info." or something to that effect. --- Although you've stated "maxlength" within the Input fields there is isn't one for Textarea? As HTML5 does provide for this I suggest using one with a 500 character limit. I would even go further in that since JavaScript is mandatory for this Plugin, why not include a Character Counter so people can see how many characters are being used? --- Conclusion: All in all, an easy and simple to use Plugin for a basic Form with some nicely done coding behind it. Highly recommended.
August 2, 2020
This Contact form plugin has all the options I need. Thank you for maintaining.
Read all 19 reviews

Contributors & Developers

“Contact Form X” is open source software. The following people have contributed to this plugin.


Translate “Contact Form X” into your language.

Interested in development?

Browse the code, check out the SVN repository, or subscribe to the development log by RSS.


If you like CFX, please take a moment to give a 5-star rating. It is super appreciated and really helps to keep plugin development going strong.

2.1 (2020/11/08)

  • Adds drag/drop ordering of form fields 🙂
  • Adds option to enable display of shortcodes in widgets
  • Adds option to display dashboard widget when user can edit_post
  • Adds filter hook contactformx_textarea_maxlength
  • Updates plugin script to account for changes in jQuery UI
  • Simplifies enqueue logic for plugin settings page
  • Improves form HTML and CSS for better validation
  • Replaces linear-gradient(top with linear-gradient(to bottom
  • Updates Help tab information
  • Updates default translation template
  • Improves display of settings page
  • Generates new default translation template
  • Tests on PHP 7.4 and 8.0
  • Tests on WordPress 5.6

2.0 (2020/07/31)

  • Changes default “From” address to “”
  • Adds options to display success message without the reset button
  • Fixes bug with fields not forgetting submitted values
  • Fine tunes the CFX dashboard widget
  • Updates contextual Help tab information
  • Generates new default translation template
  • Refines readme/documentation
  • Tests on WordPress 5.5

1.9.2 (2020/06/08)

  • Sets exclude_from_search to true
  • Tests on WordPress 5.4

1.9.1 (2020/03/11)

  • Fixes bug where dates not showing on dashboard widget
  • Tests on WordPress 5.4

1.9 (2020/03/08)

  • Adds option to disable storing email info in database
  • Replaces custom database table with custom post types
  • Adds Google reCaptcha v3 (hidden reCaptcha)
  • Updates Google reCaptcha version 2 library
  • Improves “Email Message Extra” option name and description
  • Improves sanitization of post data
  • Improves security of form cookies
  • Improves display of dashboard widget
  • Improves default button styles
  • Improves noscript display styles
  • Adds legacy functions for database
  • Fixes PHP warning for contactformx_enqueue_resources_admin()
  • Fixes incorrect URL for email icon
  • Updates infos in the plugin Help tab
  • Generates new default translation template
  • Tests on WordPress 5.4

1.8 (2019/10/24)

  • Updates styles for plugin settings page
  • Improves logic of contactformx_maybe_enqueue()
  • Generates new default translation template
  • Tests on WordPress 5.3

1.7 (2019/09/02)

  • Fixes bug with non-admin users
  • Fixes bug with default subject line
  • Fixes bug with carbon copy reply-to address
  • Adds support for autofill values on input fields
  • Tweaks function contactformx_enable_data()
  • Improves targeted enqueue scripts functionality
  • Renames contactformx_send_headers to contactformx_mail_headers
  • Generates new default translation template
  • Fine-tunes display of plugin page
  • Updates some links to https
  • Tests on WordPress 5.3 (alpha)

1.6 (2019/04/28)

  • Bumps minimum PHP version to 5.6.20
  • Updates default translation template
  • Tests on WordPress 5.2

1.5 (2019/03/04)

  • Bumps minimum PHP version to 5.3
  • Removes support for deprecated reCaptcha
  • Adds responsive styles for mobile browsers
  • Changes input type to email for email field
  • Simplifies “Additional Information” display
  • Bugfix: label and placeholder in reverse order
  • Tweaks plugin settings screen UI
  • Generates new default translation template
  • Tests on WordPress 5.2 (alpha)

1.4 (2019/02/02)

  • Just a version bump for compat with WP 5.1
  • Full update coming soon 🙂

1.3 (2018/11/12)

  • Adds homepage link to Plugins screen
  • Adds option to display “powered by CFX”
  • Improves display of CFX dashboard widget
  • Improves logic of contactformx_print_js_vars_admin
  • Improves logic of contactformx_maybe_enqueue
  • Updates default translation template
  • Tests on WordPress 5.0 (beta)

1.2 (2018/08/13)

  • Tweaks styles on plugin settings page
  • Replaces wp_kses_post with wp_strip_all_tags for style settings
  • Adds rel="noopener noreferrer" to all blank-target links
  • Updates donate link
  • Updates GDPR blurb
  • Adds option to customize invalid-email error message
  • Improves CSS for all form styles
  • Improves CSS for Dashboard widget
  • Adds “Rate Plugin” link to Advanced tab
  • Updates value of CONTACTFORMX_HOME constant
  • Regenerates default translation template
  • Further tests on WP versions 4.9 and 5.0 (alpha)

1.1 (2018/06/07)

  • Changes required to host plugin at

1.0 (2018/06/05)

  • Initial release