Opinion
Your contact form doesn't need a builder
After 15 years of building forms, I stopped using drag-and-drop builders. Here's the math on what you actually lose, and what you get back.
Most WordPress sites have a 200 KB form builder loading on every page so the visitor can fill in three fields. That’s the math. And once you see it, you can’t unsee it.
The pitch for form builders is “no code.” But the cost is a stack of inputs, a JS bundle, an asset map, a CSS file, and three privacy policies you didn’t budget for. For a contact form. That has a name field, an email field, and a message.
Here’s what I run instead.
The whole form is HTML
I’d put a contact form on a 12-month-old WordPress install in five minutes. The markup is what I’d write for any framework: <form>, three <label>s, three inputs, and a <button>. That’s it. No shortcode soup, no [/cf7-shortcode] muddle in the editor, no JavaScript-rendered fields swallowing my CSS.
When the markup is HTML, three things stop being problems:
- The form renders inside any block theme without a fight.
- Screen readers can read it the moment the page hits the DOM.
- I can copy the same form into an email template later.
The only thing the plugin gives you on top of HTML is the submit handler, the spam check, and the inbox. Those are the parts you can’t easily build yourself.
What “no code” actually costs
Run a Lighthouse pass on a typical WP forms-builder install and check the network panel. You’ll see:
- A jQuery dependency you may not have asked for.
- A 100-200 KB form-builder bundle.
- An animation library because every form has a “fade in” hover state.
- Three font subsets the builder ships by default.
The shipped form is six fields. Four kilobytes of HTML. The builder weighs more than the rest of your homepage.
For sites that get traffic, this matters. For sites that don’t yet, it matters more, because every kilobyte of overhead pushes Core Web Vitals further from green.
What I miss from builders (honestly)
Two things, and they’re real:
- Conditional logic UI. Showing a field when another field has a specific value. Builders make this trivial with a dropdown.
- Multi-step wizards. Splitting a 20-field form across three screens for a job application or onboarding flow.
I solved both without a builder.
For conditional logic, Core Forms reads data-show-if attributes on any field. The wiring is a five-line JavaScript helper. You write the field once, attach data-show-if="reason=other", and it shows when reason equals other. No drag, no dropdown, no logic graph.
For multi-step, Core Forms ships a [cf_steps] shortcode that splits the form by step boundary. One pass, no plugin needed, progress bar included.
So those two excuses are gone.
Three other reasons builders feel necessary (but aren’t)
“I want to drag and drop fields.” You’ll do it twice in the lifetime of the form. The drag interface costs you on every visit forever.
“My client wants to edit the form themselves.” Fine. Give them the markup with comments saying which line is which field. They’ll get it. They edit a much scarier header.php already.
“I want pretty styling out of the box.” Core Forms ships a default theme that uses your site’s font, gives every input the same focus ring, and respects your brand color. It’s about as much CSS as you’d write for a button.
Where this goes wrong
If you actually need 80 conditional fields with tiered logic for an enterprise intake form, this isn’t your stack. Use Gravity Forms or Formidable. They’re built for that. They’ll out-feature a lean plugin every time on the form-as-application use case.
But “contact us.” “Sign up for the newsletter.” “Request a demo.” Even “apply for this job.” All of those are six to twelve fields. None of them justify dragging a 200 KB sidekick onto every page of your site.
The next step
Pick a form on your site and check the network tab. If the form-builder bundle is bigger than the rest of your homepage, you’ve got the wrong tool for the job.
Start with the shortcode on a single page, write the HTML by hand, and ship. If you need a Mailchimp action or Slack notification on top, those are five-minute wires, not architecture decisions.
I haven’t installed a form builder on a client site in three years. I haven’t missed one either.