Skip to content
ThemesIonic — home
Plugins

Contact Form 7

Contact Form 7 is free, light and everywhere. The thing to understand before using it is that by default it does not save a single submission — if the email fails, the enquiry is gone.

4 min read beginner

Contact Form 7 builds an email and sends it. That is the entire model. You define a form as markup, define a mail template, and each submission produces a message. Nothing is stored.

It is free, it is light, it is installed on an enormous number of sites, and the design decision above is the single most important thing to know before using it.

The storage problem

By default there is no record of a submission anywhere. If the mail fails — a misconfigured server, a full mailbox, a spam filter, a typo in the recipient address — the enquiry is simply gone. Nobody is notified, and there is nothing to recover.

On a contact form for a business, that is a commercial risk rather than a technical footnote. Two consequences:

  1. Install a storage add-on before the form goes live, so submissions are recorded in the database regardless of what happens to the email.
  2. Fix mail delivery properly. PHP mail from a web server is frequently blocked or silently filtered. Route through an authenticated SMTP or API service — the diagnosis is in contact form not sending email and WordPress not sending emails.

Almost every "Contact Form 7 is broken" report is a mail delivery problem, and almost every "we lost an enquiry" report is this design decision.

Building forms in markup

Forms are defined as tags in a text area:

<label>Your name
    [text* your-name autocomplete:name] </label>

<label>Your email
    [email* your-email autocomplete:email] </label>

<label>Message
    [textarea your-message] </label>

[submit "Send"]

This is either a strength or a barrier depending on who you are. A developer gets exact control of the markup, which means real <label> elements, sensible autocomplete attributes and a form that is genuinely accessible. A non-technical site owner gets a text box full of syntax.

That trade-off is the honest summary of the whole plugin.

Spam

There is no built-in filtering beyond basic integrations. Options, roughly in order of preference:

  • A honeypot add-on — invisible to visitors, catches naive bots, no data leaves the site.
  • Akismet integration, which the plugin supports — effective, and it transmits submitter data to a third party, as Akismet explains.
  • A challenge such as reCAPTCHA, which works and costs every visitor friction — see adding reCAPTCHA to a WordPress form.

Start with the honeypot. Add more only if spam actually arrives.

The add-on ecosystem

Much of what modern form plugins include as standard is an add-on here: storing submissions, conditional fields, multi-step forms, file upload handling, redirects after submission, integrations with mailing lists.

That is not automatically bad — you install only what you need, and the base plugin stays small. It does mean a form with a few requirements can end up assembled from four plugins from four authors, each with its own maintenance and its own compatibility risk. At that point the "free and light" advantage has quietly disappeared.

Count the add-ons before assuming this is the cheaper route. The comparison across the category is in contact form plugins.

Accessibility and markup

Because you write the markup, you can produce a genuinely accessible form — proper labels, logical order, real fieldsets. You can also produce a bad one, and the defaults do not stop you.

Worth getting right:

  • A real <label> for every field, not placeholder text.
  • Required fields marked in text as well as by an asterisk.
  • Error messages that identify the field, near the field.
  • A visible focus state on inputs and the submit button.
  • A confirmation that is announced to screen readers, not just displayed.

Performance

Light. The plugin loads a small stylesheet and script, and it can be configured to load them only on pages containing a form — worth doing, because by default they load site-wide.

Compared with the heavier form builders, this is its clearest advantage, and it survives until you have added four add-ons.

When to use something else

  • You need conditional logic — show a field based on another answer.
  • You need payments in the form.
  • You need a usable entry interface for a non-technical team, with search and export.
  • Multi-step or long forms.
  • The person maintaining the site will not edit markup tags.

In those cases a modern form plugin does more, with less assembly, and the licence cost is smaller than the maintenance cost of five add-ons.

Common mistakes

  • Going live without storage, then discovering months later that enquiries were lost.
  • Blaming the plugin for mail failures, which are almost always the server.
  • Testing only to your own address, which is often the one address that works.
  • Loading assets site-wide on a site with one contact page.
  • Assembling six add-ons and still calling it the lightweight option.
  • Placeholder text instead of labels, which fails accessibility and confuses everyone once they start typing.

Verify

Submit the form as a visitor from a private window, and confirm three things: the email arrives at an external address, the submission is recorded in the database, and the confirmation message appears. Then deliberately break the recipient address and submit again — the stored record should still be there. That second test is the one that tells you whether the form is safe to rely on.

Frequently asked

No. It builds an email and sends it. If mail delivery fails, the submission is lost with no record anywhere. A storage add-on is effectively mandatory for any form you care about.
For simple forms where you value light weight and no licence, yes. For conditional logic, multi-step forms, payments or a usable entry interface, a modern form plugin does far more with far less assembly.
Almost always mail delivery rather than the plugin — PHP mail being blocked or unauthenticated. Route mail through an authenticated SMTP or API service and test again before changing anything in the form.

Related guides