splitforms.com

Contact form · WordPress

Contact form for WordPress websites

Skip Contact Form 7, WPForms, Gravity Forms, Forminator, and the rest of the bloated plugin economy. One form tag in your theme or a Custom HTML block gives you a working WordPress contact form that sends submissions to your inbox plus the splitforms dashboard. No plugin, no wp_options clutter, no database table, no PHP cron job.

  • 500 free / mo
  • 14ms latency
  • No backend code
WordPress contact form — copy-paste code for splitforms

No backend code

No server, API route, or SDK. Your WordPress form posts straight to one endpoint.

Straight to your inbox

Every submission is emailed to you and saved to a searchable dashboard — spam filtered before it reaches you.

Design without limits

It's your own WordPress markup and styles. Splitforms is only the backend, so nothing constrains how the form looks.

Copy-paste ready

Your WordPress contact form, ready to paste.

Replace YOUR_ACCESS_KEY with the key from your dashboard — that's the whole integration. No SDK to install, no build step, just the php you already write.

Generate access key
contact.php
<?php
/**
 * Drop this into a Custom HTML block, a page template, or any theme file.
 * Works with Bedrock, Sage, classic themes, and the block editor.
 */
?>

<form action="https://splitforms.com/api/submit" method="POST">
  <input type="hidden" name="access_key" value="<?php echo esc_attr( YOUR_ACCESS_KEY ); ?>" />

  <p>
    <label>Name <input  name="name" type="text" required /></label>
  </p>
  <p>
    <label>Email <input name="email" type="email" required /></label>
  </p>
  <p>
    <label>Message <textarea name="message" required></textarea></label>
  </p>

  <input type="checkbox" name="botcheck" style="display:none" tabindex="-1" />

  <p><button type="submit">Send</button></p>
</form>

How to add it

How to add a contact form to a WordPress website.

To add a contact form to a WordPress website you need three things: a free splitforms access key, the php snippet above, and your key pasted into it. No backend, server, or SDK — the form posts to one URL and every submission lands in your inbox and dashboard.

Get your free splitforms access key

Sign up at splitforms.com, verify your email, and copy your access key from the dashboard. No credit card required.

Drop the WordPress snippet into your project

Copy the WordPress code example into your project and replace YOUR_ACCESS_KEY with the key from step 1.

Receive submissions in your dashboard

Submissions arrive in the splitforms dashboard within seconds. Free includes inbox delivery; Pro adds Slack, Discord, Sheets, or any signed webhook URL.

Where submissions go

Where do your WordPress form submissions go?

Every submission is emailed to you and saved to a searchable dashboard — spam filtered before it ever reaches you. Search, export to CSV, or forward it to a webhook or Slack on Pro.

  • 500 submissions per month, free forever
  • Honeypot + AI spam classifier on every plan
  • Signed webhooks to Slack, Discord, your server
WordPress contact form submissions in the splitforms dashboard

No backend needed

Do you need a backend for a WordPress form? No.

Your WordPress form posts standard FormData to one URL. Splitforms validates the access key, runs the spam classifier, and forwards it to your email — so there's no server, API route, or database for you to build or maintain.

  • Works without a plugin — drop a Custom HTML block or paste into a theme file
  • Compatible with Bedrock, Sage, classic themes, and the block editor
  • No PHP knowledge required — pure HTML works too
How splitforms processes a WordPress form submission

Best practices

What a production-ready WordPress form needs.

The difference between a form that works in the demo and one that survives launch traffic — the production-tested defaults, in priority order.

  • Define the access key as a constant in wp-config.php (above the 'stop editing' line). Keeps it out of your theme repo and works for both staging and production via environment.
  • Use a Custom HTML block in the block editor for one-off contact pages — survives theme switches, no template editing required.
  • For headless WordPress (with Next.js, Astro, etc.), there's no PHP involved — use the framework-specific snippet from the matching /forms/<framework> page.
Production-ready WordPress contact form best practices

How SplitForms works

From form to workflow in 3 simple steps.

Connect your form, collect every submission, and send data where it needs to go — without building backend infrastructure.

A SplitForms contact form submission launching straight to your inbox

Add your endpoint

Point your form to your unique SplitForms endpoint. That's it.

HTML form pointing at a SplitForms submit endpoint

Receive submissions

We instantly capture and organize every submission in your inbox.

Submissions inbox with searchable leads and status pills

Route anywhere

Send data to email, spreadsheets, CRMs, webhooks, and 7,000+ apps.

Generic integration tiles for email, sheets, chat, CRM, automate, and webhook

No credit card required. Set up in under 60 seconds.

Connect & automate

Connect your favorite tools and automate everything

SplitForms works with the destinations you route to and the platforms you build on — from Slack and Sheets to WordPress, Shopify, and Next.js.

Connect your SplitForms form to Slack, Google Sheets, Mailchimp, Zapier and more

Trusted by indie teams and agencies shipping forms worldwide

PETAL/COKRAFT.DELINEAR-XBUILD.DEVSTUDIO 71MERIDIANFRAME&CO

Testimonials

Loved by developers shipping at every scale.

40 quotes on record — from indie hacks to agency migrations.

Questions

WordPress contact form questions.

View all FAQs
How do I add a contact form to WordPress without a plugin?

Two options. (1) Block editor: add a Custom HTML block, paste the form snippet, replace YOUR_ACCESS_KEY. (2) Theme file: paste the PHP/HTML snippet from this page into your page-contact.php template. Both work without installing anything.

Does splitforms work with WordPress block editor (Gutenberg)?

Yes — use a Custom HTML block. The form survives Gutenberg's wpautop processing because Custom HTML blocks render verbatim. Reusable Patterns work too — save the form as a Pattern and drop it on any page.

How do I handle form errors in WordPress?

If you use the native form style with a redirect configured in the dashboard, splitforms sends the browser there on success and returns an error page on failure. For inline error handling, wrap the form in a small JS snippet that fetches splitforms.com and renders the error from data.message. See the AJAX page for the JS pattern.

Can I use splitforms with WordPress Multisite or headless WordPress?

Yes — both. For Multisite, use one access key per site (or one shared key with a form-name field to disambiguate). For headless WP (with Next.js, Astro, etc.), the form lives in your frontend framework — see the matching framework page.

How do I customize the success / redirect behavior?

Build the /thanks/ page in WordPress, then set its absolute URL in Dashboard → Form settings → Redirect. Splitforms sends the browser there after a successful native form submit. Submitted redirect fields are ignored.

Will splitforms work with Elementor / Divi / Bricks form widgets?

The form widgets in those page builders all let you set a custom action URL. Set Action to https://splitforms.com/api/submit, Method to POST, add a hidden access_key field. Each builder hides this in a slightly different settings panel.

WordPress wpautop() mangles your form HTML in posts

If you paste a <form> directly into a Classic Editor post, WordPress's wpautop filter wraps random <p> tags around your inputs and breaks the markup. Use a Custom HTML block (block editor) or a theme template file instead — wpautop doesn't touch those.

Caching plugins (WP Rocket, W3 Total Cache) cache the form page itself

Page caching is fine — your form posts to splitforms.com directly, not a WordPress endpoint, so the cached HTML still works. But if you ever switch to a WP-side handler (e.g. wp_ajax), exclude /contact/ from the page cache or submissions will hit a stale page.

Theme-injected JavaScript can hijack form submission

Some themes (Astra, OceanWP, GeneratePress 'Premium') auto-attach AJAX handlers to every form on the page. Add data-no-ajax="true" or a custom class your theme excludes — or use a Custom HTML block which most themes leave alone.

Cloudflare Bot Fight Mode blocks splitforms responses

If you proxy your WP site through Cloudflare with Bot Fight Mode on, the redirect from splitforms.com → /thanks may be flagged. Whitelist your domain in splitforms's allowed-domains list AND ensure /thanks is reachable without a Cloudflare challenge.

Hardcoded YOUR_ACCESS_KEY in the PHP example needs escaping

The snippet shows <?php echo esc_attr( YOUR_ACCESS_KEY ); ?> as a placeholder. In real code, define your key as a constant in wp-config.php: define('SPLITFORMS_KEY', 'sk_live_…'); then echo esc_attr(SPLITFORMS_KEY). Don't paste the literal string into theme files.

Wordfence and other security plugins block external form POSTs as 'leaving WordPress'

Wordfence's Live Traffic and 'Block fake Google crawlers' rules flag form submissions to non-WordPress domains as suspicious outbound activity from a logged-out user. The submission still goes through (the browser POSTs directly, bypassing PHP), but Wordfence may rate-limit or temporarily IP-ban the visitor's session, breaking subsequent page loads. Whitelist splitforms.com under Wordfence → Firewall → Allowlisted Services, or move to iThemes Security / Solid Security which handles outbound endpoints more gracefully.

How does WordPress handle forms without splitforms?

WordPress core has no contact-form feature — every contact form on a WP site is either a plugin (Contact Form 7, WPForms, Gravity Forms, Forminator, Fluent Forms, Ninja Forms) or a custom theme template. Plugins add 3-7 database tables, increase TTFB by 50-300ms, and most require a paid SMTP plugin (WP Mail SMTP) on top because shared-host PHP mail() lands in spam. CF7 alone is 1.2MB of JS/CSS loaded on every page. Anti-spam is a separate Akismet subscription ($10/mo for commercial use) or a paid CAPTCHA plugin. Splitforms replaces the plugin: a <form> tag in a Custom HTML block, pointing at our endpoint, with a hidden access_key field. No plugin, no extra DB tables, no SMTP gymnastics.

Any deployment notes for shipping WordPress to production?

WordPress runs on shared hosts (Bluehost, Hostinger), managed WP hosts (Kinsta, WP Engine, Pressable), or self-hosted Apache/nginx. The form's POST is cross-origin to splitforms.com, so the host doesn't matter for delivery. Caching plugins (WP Rocket, W3 Total Cache, LiteSpeed Cache) cache the page that hosts the form — that's fine, the form action URL is static. Don't proxy through WP's admin-ajax.php or wp_remote_post — adds latency and re-introduces the SMTP problem. For Multisite, use one access key per site or a shared key with form-name to disambiguate. Headless WP (Next.js/Astro front) doesn't involve PHP at all — use the matching framework's snippet.

Simple pricing

Start free. Scale when you need more.

Choose a plan that fits your workflow — from a free form endpoint to full automations, exports, and higher submission limits.

Free

$0

Free forever

 
Best for testing

For side projects and indie devs.

  • 500 submissions / mo
  • Unlimited forms
  • Email notifications included
  • Honeypot spam filtering
  • Submissions dashboard
  • MCP setup stays free
  • No credit card required

3-Year

$59/ 36 months
was $99 · save 40% · new-user price

Pay $59. 3 years sorted.

  • 15,000 submissions / mo
  • Unlimited forms
  • Everything in Pro
  • Renews every 3 years
  • Long-term discount
  • Priority support included
  • Vote on the roadmap

No credit card required on Free • Cancel anytime