Choosing a Contact Form Plugin
WordPress does not ship with a contact form, so the first decision is which plugin to build on. This choice matters more than it looks, because moving a busy form from one plugin to another later is a chore. The five names you will run into again and again are Contact Form 7, WPForms, Fluent Forms, Gravity Forms, and Forminator. They all produce a working WordPress contact form, but they aim at different people and different budgets.
Contact Form 7
Contact Form 7 is the oldest and most installed form plugin in the WordPress world. It is free, light, and built around editing form markup by hand using its own template tags. Developers like it because it stays out of the way and does exactly what you tell it. Beginners sometimes find it bare, because there is no drag and drop builder and no entry storage without an add on. If you are comfortable with a little markup and you want something lean, it is a fine starting point.
WPForms
WPForms is the plugin most often recommended to non technical owners. It has a friendly drag and drop builder, ready made templates, and a free version called WPForms Lite that covers a simple contact form well. The paid version adds entry storage, conditional logic, multi step forms, file uploads, and payment fields. If you want the shortest path from nothing to a polished form, this is usually it.
Fluent Forms
Fluent Forms has grown quickly by offering a lot in its free version and running fast even on modest hosting. It has a clean builder, conditional logic in the free tier, and strong entry management. Teams that want power without a heavy footprint often land here. It is a strong middle ground between the simplicity of WPForms and the depth of Gravity Forms.
Gravity Forms
Gravity Forms is the choice for complex, data heavy forms. It has no free version, but its add on library is deep: advanced conditional logic, multi page forms, calculations, user registration, and integrations with many outside services. Agencies building application forms, quote calculators, or member portals reach for it because it scales with the project. For a plain contact form it can be more than you need.
Forminator
Forminator, from the team behind several popular WordPress plugins, is free and covers not just contact forms but polls and quizzes too. It includes spam protection options and payment fields in its free tier, which makes it appealing for small sites that want a bit of everything without a subscription. Its builder is capable, though its styling controls feel less refined than WPForms or Fluent Forms.
How to decide
Match the plugin to the job rather than the hype. For a straightforward contact page, any of these will do, so weight your choice toward how comfortable you feel in the builder and whether you need entry storage out of the box. For forms that grow into quotes, bookings, or applications, favour Fluent Forms or Gravity Forms, which handle logic and multi step flows without strain. The table below sums up the trade offs.
| Plugin | Free version | Builder | Best for | Entry storage |
|---|---|---|---|---|
| Contact Form 7 | Yes, full | Markup and tags | Developers, light sites | Add on only |
| WPForms | Lite version | Drag and drop | Beginners, fast setup | Paid tiers |
| Fluent Forms | Generous | Drag and drop | Power on a budget | Yes, free |
| Gravity Forms | No | Drag and drop | Complex, data heavy forms | Yes |
| Forminator | Generous | Drag and drop | Small sites, mixed uses | Yes, free |
Whichever you pick, the workflow that follows is broadly the same: build the form, place it on a page, protect it from spam, and make sure the email reaches you. We will use WPForms and Contact Form 7 for the walkthroughs because they sit at the two ends of the spectrum, but the ideas carry across all five.
Building Your First Form Step by Step
Let us build a working contact form from scratch. A basic form needs four fields at most: name, email, subject, and message. Do not ask for more than you truly use, because every extra field lowers the number of people who finish. We will show WPForms first for its visual builder, then the Contact Form 7 approach for anyone who prefers markup.
Building it in WPForms
- In your dashboard, go to Plugins, then Add New, search for WPForms, install it, and click Activate.
- A new WPForms menu appears. Click it, then Add New to open the builder.
- Name the form something clear like Contact Page, then choose the Simple Contact Form template. WPForms drops in name, email, and message fields for you.
- To add a field such as a subject line, drag Single Line Text from the left panel into the form and rename its label to Subject.
- Click any field to set its options on the left. Mark the email field as required, and check that the field type is Email so the browser validates the address.
- Open Settings, then Notifications, and confirm the Send To Email Address is the inbox you actually watch. We will return to notifications in detail later.
- Open Settings, then Confirmations, and write the thank you message the visitor sees after they send. Keep it warm and specific.
- Click Save in the top right. Your form is now ready to place on a page.
That is the whole build. The strength of a visual builder is that you can see the form take shape and reorder fields by dragging, which makes it hard to get wrong.
Building it in Contact Form 7
Contact Form 7 works differently. You edit a small block of template tags that describe the fields, and the plugin turns them into a form. After installing and activating the plugin, go to Contact, then Add New. You will see a default template you can adapt. A simple contact form looks like this:
<label> Your name
[text* your-name] </label>
<label> Your email
[email* your-email] </label>
<label> Subject
[text your-subject] </label>
<label> Your message
[textarea your-message] </label>
[submit "Send"]
Each tag in square brackets is a field. The asterisk, as in [text* your-name], marks a field as required. The word after the type, such as your-email, is the field name you will reference in the email template. Switch to the Mail tab to control where the message goes and what it contains. The default sends to your site admin address, and you can insert field values with tags like [your-name] and [your-email]. Save the form and Contact Form 7 gives you a shortcode to place it on a page, which we cover in the next section.
Keep the first version small
Whichever plugin you use, resist the urge to add fields on day one. A short form respects the visitor and converts better. You can always add a phone field or a dropdown once the basic form is proven and delivering to your inbox. If your contact form is really the front door to a quote or a booking, plan the extra fields deliberately rather than piling them on, and consider the multi step approach we describe later so the form never feels long.
Embedding the Form with a Block or Shortcode
A saved form does nothing until it appears on a page. WordPress gives you two main ways to place it: the block editor and a shortcode. Both end in the same result, so use whichever fits how you build pages.
Using the block editor
Most modern form plugins add their own block. Create or open the page where the form should live, click the plus icon to add a block, and search for your plugin name, for example WPForms or Fluent Forms. Select the block, then pick your saved form from the dropdown inside it. The form previews right there in the editor. Update or publish the page and it goes live. This is the friendliest route because you never touch any code and you can see the placement as you work.
Using a shortcode
Every form plugin also gives each form a shortcode, which is a short piece of text in square brackets that WordPress swaps for the real form when the page loads. This is how Contact Form 7 works by default, and it is handy when you want a form inside a widget, a template, or a page builder that does not support the block. A Contact Form 7 shortcode looks like this:
[contact-form-7 id="1234" title="Contact Page"]
WPForms uses a similar pattern, such as [wpforms id="1234"]. To use one, copy the shortcode from your form list, add a Shortcode block to your page, and paste it in. You can also drop a shortcode into a text widget to show a form in a sidebar or footer. If you work in a page builder like Elementor or Beaver Builder, each one has either a native form widget or a shortcode element that accepts these codes.
Where to place the form
The obvious home is a dedicated contact page, and every site should have one. Beyond that, think about the moments a visitor is most ready to reach out. A short form in the footer catches people who scrolled to the bottom looking for a way to get in touch. A form at the end of a service page turns interest into a message while the reader is still engaged. Just avoid burying the form below unrelated content or asking for it before you have earned the visit. If you run an online store, a well placed contact or enquiry form pairs naturally with the checkout work covered in our guide on how to build a WooCommerce store.
Stopping Contact Form Spam
The moment a form goes live, bots find it. Within days you can be fishing real messages out of a flood of junk, and if spam reaches your inbox it also trains your mail provider to distrust your form emails. Good spam protection is not optional, but the trick is to stop bots without making real people prove they are human on every visit. There are several methods, and the best sites layer two of them.
Honeypot
A honeypot is a hidden field that humans never see and never fill, but many bots fill in automatically because they see every field in the markup. If that hidden field arrives with content, the submission is discarded. Honeypots are invisible, add no friction for real users, and cost nothing in accessibility. They will not stop every bot, but they catch a large share of the simple ones and should be on for every form. Most plugins include a honeypot option you simply enable.
Akismet
Akismet is the spam filtering service built into many WordPress sites, best known for comments. Several form plugins can pass submissions through Akismet, which checks them against a large network of known spam patterns and quietly flags the bad ones. Like a honeypot, it works in the background with no puzzle for the visitor. It needs an Akismet account and key, and for commercial sites that means a subscription, but it is effective and unobtrusive.
reCAPTCHA v2 and v3
Google reCAPTCHA is the most familiar spam tool. Version 2 is the checkbox that says I am not a robot, sometimes followed by an image challenge. It is effective but adds a step and can frustrate people, especially on mobile. Version 3 is invisible: it scores each visitor in the background and lets you decide what score to block, so most users never see anything. The trade off with v3 is that it watches behaviour to build that score, which has privacy implications worth weighing.
hCaptcha
hCaptcha is a privacy oriented alternative to reCAPTCHA that works in a similar way, with a checkbox and optional challenges. It appeals to owners who would rather not route visitor signals through Google. Many form plugins support it as a drop in replacement, so switching is usually a matter of pasting in different keys.
Cloudflare Turnstile
Cloudflare Turnstile is a newer option that aims to verify visitors without the annoying puzzles. It runs a quiet background check and only challenges when something looks off, so most people pass without lifting a finger. It is free and privacy minded, which has made it popular fast. If your site already sits behind Cloudflare, it is a natural fit, and it pairs well with the caching setup described in our WordPress caching guide.
The right choice depends on how much spam you get and how much friction you can accept. For most small sites, a honeypot plus either Akismet or Turnstile stops the vast majority of junk with no visible challenge. Save the checkbox style tools for forms that are being hit hard. The table and diagram below compare the options.
| Method | User friction | Privacy | Cost | Stops |
|---|---|---|---|---|
| Honeypot | None, invisible | Excellent | Free | Simple bots |
| Akismet | None, background | Good | Paid for business | Known spam patterns |
| reCAPTCHA v2 | Checkbox, sometimes puzzle | Lower | Free tier | Most bots |
| reCAPTCHA v3 | None, scored | Lower | Free tier | Most bots |
| hCaptcha | Checkbox, sometimes puzzle | Better | Free tier | Most bots |
| Cloudflare Turnstile | None to minimal | Better | Free | Most bots |
Email Notifications and Why They Fail
Here is the problem that quietly costs businesses the most leads: the form says thank you, but the email never arrives. The visitor thinks they reached you, you never see the message, and you only find out when someone complains that you ignored them. Understanding why this happens is the single most valuable thing in this guide.
Why WordPress email is unreliable
By default, WordPress sends mail using a basic PHP function that hands the message to the web server to deliver. That method has two weaknesses. First, many hosts disable or throttle it. Second, and more damaging, the email is sent without proper authentication, so the from address usually claims to be your domain while the message actually leaves from your host server. Modern mail providers see that mismatch and treat it as a red flag. The result is that form emails land in spam or get silently dropped, which looks exactly like the form is broken.
The fix: send through SMTP
The reliable answer is to stop using the default method and send your mail through a proper SMTP service instead, using a plugin such as WP Mail SMTP, FluentSMTP, or Post SMTP. SMTP is the standard system real email uses, complete with authentication that proves your messages are legitimate. When you route form mail through an authenticated sending service, deliverability jumps, because the receiving servers can verify where the message came from. This one change fixes the majority of missing form email complaints.
Setting up WP Mail SMTP
- Install and activate WP Mail SMTP from Plugins, then Add New.
- Open its setup wizard and choose a mailer. Options include a transactional email service or your own mailbox provider. A dedicated sending service is more reliable than a personal mailbox for volume.
- Set the From Email to an address at your own domain, not a free mailbox, and turn on Force From Email so every plugin uses it.
- Paste in the API key or connection details your chosen mailer gives you, following its instructions.
- Save, then use the plugin Email Test tab to send a test message and confirm it arrives.
To make delivery even stronger, add the right DNS records for your domain, commonly SPF, DKIM, and DMARC, which tell the world your sending service is authorised to send on your behalf. Your sending provider supplies the exact records to add. This is the same authentication that keeps your normal business email out of spam, and it is worth doing once and forgetting.
Admin and autoresponder notifications
Most forms send two emails. The admin notification goes to you or your team so you know a message arrived. The autoresponder, or confirmation email, goes to the visitor to reassure them that their message was received and to set expectations for a reply. Set both up thoughtfully. In the admin notification, put the visitor email in a reply to field so you can answer with one click, and include every field so you have the full context. In the autoresponder, keep it short, human, and branded, and tell them roughly when to expect a response. The diagram below shows the full path a submission takes from click to inbox.
Storing Entries and Autoresponders
Email alone is a fragile record. Inboxes get cluttered, messages get deleted, and if delivery ever fails you lose the enquiry with no trace. Storing every submission in your WordPress database as well gives you a reliable backup and a searchable history of who contacted you and when.
Why database storage matters
When entries are saved, a missed email is no longer a lost lead, because the message still sits in your dashboard. You can search past enquiries, export them to a spreadsheet, and spot patterns such as a spike in questions about one product. For a business, that record is quietly valuable. Fluent Forms, Gravity Forms, WPForms paid tiers, and Forminator all store entries by default or with a setting. Contact Form 7 needs an add on such as Flamingo to keep a copy, which is worth installing the day you launch a form.
Keep storage lawful and tidy
Storing entries means you are holding personal data, so treat it with care. Do not keep submissions forever out of habit. Decide how long you genuinely need them, delete old entries on a schedule, and restrict who on your team can view them. If a form collects anything sensitive, be extra careful about retention. We return to the privacy side in the consent section below.
Getting autoresponders right
The confirmation email the visitor receives is a small touch that builds trust. A good autoresponder confirms the message was received, thanks them by name if you collected it, restates roughly when you will reply, and carries your branding so it does not look like spam itself. Avoid the temptation to stuff it with marketing. At this moment the person wants reassurance, not a sales pitch. If you plan to add them to a newsletter, ask for that consent separately with a clear checkbox rather than assuming it. Because the autoresponder is an email your form sends, it depends on the same SMTP setup from the previous section, so test it the same way.
Styling the Form to Match Your Brand
A form that looks bolted on undermines trust. When the fields, buttons, and spacing match the rest of your site, the form feels like a natural part of the page and people are more comfortable filling it in. There are three levels of styling, from easiest to most control.
Let the theme style it
The simplest option is to let your form inherit your theme styles. Many modern themes and the newer form plugins produce clean, neutral forms that already look at home. WPForms and Fluent Forms include style settings in the block editor, where you can set field size, label position, button colour, and corner rounding without writing any code. For a lot of sites, adjusting those built in controls is all you need.
Add custom CSS
When you want the form to match your brand exactly, a little custom CSS goes a long way. You can target the form container and its fields to set fonts, colours, spacing, and focus states. Add your rules under Appearance, then Customize, then Additional CSS, so they survive theme updates. A simple example that rounds the fields and brands the button looks like this:
.wpforms-form input[type=text],
.wpforms-form input[type=email],
.wpforms-form textarea {
border: 1px solid #cbd5e1;
border-radius: 8px;
padding: 12px;
}
.wpforms-form button[type=submit] {
background: #4f46e5;
color: #ffffff;
border-radius: 8px;
padding: 12px 22px;
}
Swap the class prefix and colours to match your plugin and brand. Keep an eye on the focus state, the visual change when a field is selected, because a clear focus outline helps both usability and accessibility, which we cover shortly.
Use a page builder
If you build pages with Elementor, Beaver Builder, or a block library, they often include their own form styling controls or even native form widgets. These give you visual sliders for spacing, typography, and colours without touching CSS. The trade off is that a builder adds weight to the page, so use it where you are already building visually rather than loading a whole builder just to style one form. Whatever route you choose, a fast form matters as much as a pretty one, and the techniques in our guide on how to speed up a WordPress website keep the form from dragging your page down.
Conditional Logic, Multi-step, and Uploads
Once your basic form is delivering, you can make it smarter. These features turn a plain contact form into a tool that qualifies leads, gathers files, and feels effortless to fill in. Not every plugin supports them in its free tier, so this is where the plugin choice from earlier pays off.
Conditional logic
Conditional logic shows or hides fields based on earlier answers. If someone picks Support from a dropdown, you can reveal an order number field that a sales enquiry would never see. This keeps the form short for everyone, because each person only sees the fields that apply to them. It also routes better: you can send different enquiries to different inboxes based on what the visitor chose. Fluent Forms and Gravity Forms handle logic well, WPForms offers it in paid tiers, and it is one of the most useful upgrades once your form does more than say hello.
Multi-step forms
A long form is intimidating as one wall of fields. Breaking it into steps with a progress bar makes it feel manageable, and people are more likely to finish because each step asks only a little. Multi step forms suit quote requests, applications, and bookings where you genuinely need more information. The key is to open with the easy questions and leave contact details until the visitor is already invested. If your enquiry form leads toward a paid service or product, the same staged thinking applies to checkout, which our guide on how to add a payment gateway in WooCommerce gets into.
File uploads
Sometimes you need a file: a photo for a quote, a resume for a job, a brief for a project. A file upload field lets visitors attach one directly. When you enable uploads, set sensible limits. Restrict the allowed file types to what you actually need, cap the file size so a huge upload does not fail or strain your server, and be aware that stored uploads are data you must protect and eventually clear. A common mistake is leaving uploads wide open, which invites both abuse and accidental oversharing, so tighten the rules before you launch the field.
Do not over engineer
Every one of these features earns its place only when it serves the visitor or your workflow. A three step form for a simple contact page adds friction for no reason. Reach for logic, steps, and uploads when the form has a real job that needs them, and keep the everyday contact form short. When the form grows into a genuine application or booking system, that is often the point to bring in help, and you can request a free quote for a custom build.
GDPR, Consent, and Accessibility
A contact form collects personal data and is used by every kind of visitor, so two responsibilities come with it: handling data lawfully and making the form usable by everyone. Neither is hard, and both protect you as much as your visitors.
Consent and data handling
Privacy rules such as the GDPR in Europe, and similar laws elsewhere, expect you to be honest about what you collect and why. For a contact form, a few habits keep you on the right side of them.
- Collect only what you need. Every extra field is more data to justify and protect. If you do not use it, do not ask for it.
- Explain the purpose. A short line near the submit button, linking to your privacy policy, tells people how their message will be used.
- Ask for marketing consent separately. Do not bundle a newsletter sign up into the contact form. Use a clear, unticked checkbox if you want to add them to a list.
- Set a retention period. Decide how long you keep entries and delete older ones on a schedule rather than hoarding them.
- Secure the data. Serve the form over HTTPS, limit who can read entries, and keep your site and plugins updated so the stored data stays safe.
Keeping the whole site current is part of protecting that data, which is one reason ongoing care matters. Our WordPress services include the updates, backups, and monitoring that keep a form and its stored entries secure over time.
Accessibility
An accessible form is one that everyone can complete, including people using a screen reader or a keyboard alone. It is also simply a better form for all users, and search engines favour pages that are built well. A few points cover most of what matters.
- Label every field. Each input needs a real, visible label tied to it, not just placeholder text that vanishes when the person starts typing.
- Make errors clear. When a field is wrong, say what is wrong in words next to the field, not by colour alone, and move focus to the first error.
- Keep a visible focus state. People navigating by keyboard need to see which field is active, so never remove the focus outline without replacing it.
- Use proper field types. An email field, a telephone field, and a real submit button help browsers and assistive tools do the right thing.
- Check contrast. Label and button text must have enough contrast against their background to be readable.
Most reputable form plugins produce reasonably accessible markup out of the box, but styling and custom fields can undo that, so it is worth testing your finished form by tabbing through it with the keyboard and checking that every field announces its label. If accessibility is a legal requirement for your organisation, treat it as a first class part of the build rather than an afterthought.
Testing and Troubleshooting Delivery
Never trust a new form until you have proven it works end to end. The most common and costly failure is silent: the form looks fine and thanks the visitor, but the email never lands. A short testing routine catches that before it costs you a lead.
Test it like a real visitor
- Open the live page in a private browser window, not the editor preview, so you see exactly what visitors see.
- Fill in every field with realistic content and submit the form.
- Confirm the thank you message or confirmation page appears as expected.
- Check the destination inbox for the admin notification, and look in the spam folder too.
- Check that the autoresponder reached the address you entered as the visitor.
- Open your form entries in the dashboard and confirm the submission was saved.
- Reply to the admin notification and confirm it goes to the visitor address, which proves your reply to setting is correct.
Run this test whenever you change the form, switch hosts, or update a related plugin, because any of those can quietly break delivery.
When email still does not arrive
If the message does not land, work through this list in order. It moves from the most common cause to the least.
| Symptom | Likely cause | Fix |
|---|---|---|
| No email at all | Default PHP mail failing | Install and configure an SMTP plugin |
| Email lands in spam | Missing authentication | Add SPF, DKIM, and DMARC records |
| From address rejected | Free mailbox as sender | Send from your own domain address |
| Reply goes to wrong place | Reply to not set | Set the visitor email as reply to |
| Only some emails arrive | Host sending limit | Use a dedicated sending service |
| Real messages marked spam | Filter too aggressive | Loosen captcha, whitelist your form |
Other things to check
If the form itself will not submit, look for a plugin conflict by testing with other plugins temporarily off, and check the browser console for a script error. If spam is getting through despite protection, add a second layer such as a honeypot alongside your captcha. If real people report the form rejecting them, your spam settings may be too strict, so ease them and watch. And if entries are saving but emails are not, you have confirmed the form works and the problem is purely delivery, which points straight back to the SMTP setup.
When to bring in help
Most contact form problems come down to plugin choice, spam settings, and above all email delivery through SMTP. Work through this guide in order and you will have a form that captures every message, keeps out the junk, matches your brand, and respects your visitors. If your case turns into a stubborn deliverability issue, a complex multi step build, or a form that has to plug into your other systems, that is exactly the kind of work our team handles. A clean redirect and link structure helps too when you move a form between pages, which our guide on how to set up redirects in WordPress covers. When you want a hand, get a free quote and we will get your form working the way it should.