Skip to main content

How to Create a Contact Form in WordPress

Create a WordPress contact form from a template, set where the messages go, keep spam out with the honeypot and rate limit, and read replies from the submissions inbox.

A contact form is the first form most WordPress sites need and the one most guides make harder than it is. So, if you are looking to create a contact form in WordPress that delivers the message, keeps spam out and does not lose anything when the email fails, this guide can surely help.

I build Core Forms, and every screen here comes from its Contact form template running on a test site.

Every site wants something slightly different from its contact page, so one guide cannot cover every field. But almost every contact form needs the same 4 things, a name, an email, a subject and a message, and in this one I will try my best to cover those properly, along with the settings that decide where the message goes and what stops the spam.

The template ships with the plugin, so you can follow along click for click. Or, if you get stuck halfway, support is a message away. Without further ado, let’s get started.

What a Contact Form Asks

The Contact form template collects 4 things:

  • Your name is required.
  • Email address is required, because it is where your reply goes.
  • Subject is optional, and it becomes the line you read in the inbox.
  • Message is required.

That is the whole form, and it is enough. The contact form examples guide covers when a phone number, a company field or a topic select earns a place, and the answer is “less often than you think.”

Create the Contact Form

Two templates match a contact search, one on a single page and one split into steps:

  1. Go to Core Forms > Add New.
  2. Type contact in the template search.
  3. Click Use this template on the first Contact form card for a single page.

Core Forms template gallery searched for contact, showing the Contact form template and its multi-step version The same 4 fields, on one page or across two steps.

Core Forms builder for the Contact form showing name, email, subject and message fields with the live preview Name and email carry autocomplete hints, so browsers fill them in on the first click.

The builder is the visual side. The Code tab shows the same form as plain HTML, and any change in one shows up in the other. The guide to a WordPress contact form without a plugin shows what that HTML looks like by hand, and what a plugin adds on top of it.

Where the Message Goes

Every template except the blank one ships with a Send Email action, so a new contact form delivers messages from the first submission. Open the Actions tab to see it:

  • From and To default to the site admin email.
  • Subject is “New submission on” followed by your site name.
  • Message is [all:label], which prints every field with its label.
  • Additional Headers has Reply-To: [NAME] <[EMAIL]>, so replying in your mail client answers the sender.

The Send Email action for the Contact form with the default from, to, subject, message and Reply-To header Change To if the messages should reach someone other than the site admin, and leave the Reply-To line alone.

The Reply-To header is the setting that matters most. Without it, every reply starts with copying the sender’s address out of the message, and with it the message behaves like an email they sent you. The data variables feature lists everything else you can put in the subject or the body, such as [SUBJECT] in the subject line.

Keep Spam Out

The Settings tab is where the anti-spam lives, and the defaults are sensible:

  • Anti-spam shows honeypot on. A hidden field that people never see and bots fill in, which catches most automated junk with no effect on real visitors.
  • Rate limit is 0, meaning unlimited. Setting it to 5 submissions per IP per hour stops a script from sending 400 messages before you wake up.
  • Prevent duplicates blocks a repeat submission from the same browser session, which stops the double-click that sends 2 copies.
  • Save submissions is on, so every message is stored even if the email fails.

The Settings tab for the Contact form showing save submissions on, prevent duplicates, the rate limit, and anti-spam with the honeypot on A rate limit of 5 per hour is invisible to a real visitor and painful for a script.

The guide to honeypot fields explains why the hidden field works, and the spam protection feature covers Turnstile, reCAPTCHA and Akismet for a site that needs more than the honeypot.

Single Page or Multi-Step

The multi-step version splits the form into “Your details” (name and email) and “Request details” (subject and message).

Core Forms builder for the multi-step Contact form with two steps, Your details and Request details The Send Email action carries over, so both versions deliver the same way.

Step 2 of the multi-step contact form with the subject and message fields Step 1 has to pass validation before the message box appears.

For a 4-field contact form the single page wins, and it is not close. A visitor can see the whole form, judge how long it takes and finish it in under a minute. The multi-step version exists because the contact template is the one everybody starts from, and it is the shortest way to see how steps work before you build a longer form. The guide to when multi-step forms help and hurt has the rule of thumb.

Publish the Contact Form

The shortcode is shown next to the form’s name in the editor:

[cf_form slug="contact-form"]

Paste it into your contact page, or search for Core Forms in the block inserter and pick the form from the dropdown. Put a line above the form saying what happens next, such as “We reply within 1 working day,” because that line does more for conversions than any button color.

The contact form on a page with name, email, subject and message fields and a Send message button The form takes the page’s font and colors, so it looks like part of the site rather than a widget.

Read the Messages

Every message lands in the form’s Submissions tab, whether or not the email arrived.

Core Forms Submissions tab for the Contact form showing a message with name, email, subject and text The inbox is the copy that survives a mail outage.

Click View to read the full message and answer from the Send Reply box on the same screen. When an email does go missing, Core Forms > Email Logs shows whether it was sent, and the guide to a WordPress form not sending email walks through the rest.

The Limits

The form sends email through whatever WordPress uses to send email. On many hosts that is PHP mail, which lands in spam more often than it should. An SMTP plugin or a transactional service such as the Resend action fixes delivery, and the form cannot do that for you.

There is no CAPTCHA by default. The honeypot handles most bot traffic, but a site that gets targeted by hand-typed spam needs Turnstile or reCAPTCHA turned on in the Settings tab.

The form does not tell the visitor when you have read their message. The Auto-Responder action can confirm receipt, and the reply itself is up to you.

Attachments are not in the template. A file field can be added, with the limits described in the file uploads feature.

What Quietly Ruins a Contact Form

Turning off saved submissions to keep the database small. A contact message is small, and the day the mail server fails is the day you find out the inbox tab was the only copy.

Sending the notification from the visitor’s email address. Mail servers reject email that claims to come from a domain it did not come from. From should be your address, and Reply-To should be theirs, which is how the template is set.

Adding a CAPTCHA on day 1 for a site with no spam. Every extra check costs a few real messages, so start with the honeypot and add more when the spam actually arrives.

Requiring a phone number. It halves the messages from people who wanted to write, not talk, and the ones who want a call will put their number in the message.

Final Remarks

You now have a contact form that delivers to the right address, replies to the sender in one click, keeps most spam out and stores every message where a mail outage cannot reach it. If you keep one idea from this guide, keep this one: the Submissions tab is the real inbox, and the email is a notification about it.

The contact form template page has the fields and a live demo, and the guide to contact form vs email address settles the question of whether you need a form at all. If something here does not behave the way this guide describes, the support team can help.

I hope the first message through it is a good one.

FAQ

Can I have more than one contact form?

Yes. Each form has its own slug, actions and settings, so a sales form and a press form can go to different addresses without any routing rules.

Can the contact form send messages to different people by topic?

Yes. Add a topic select, then use recipient routes in the Send Email action to send each topic to a different address. The feedback form guide shows the routes in use.

Does the contact form work with any theme?

Yes. The form is plain HTML that takes the theme’s font and colors. The Form Theme Customizer under Core Forms adjusts spacing and button styles when the theme’s defaults do not suit the page.

Build the form. Stop reading.

Every note here came out of a real Core Forms setup. Use CFLAUNCH for 20% off either plan.

Public launch offer

20% off Core Forms

Forms, polls, surveys, payments, and licensing — every feature, unlimited sites, one plugin.

Copy your code

Those are the after-discount prices. Paste CFLAUNCH at checkout to apply it.