Here's the version of this problem that costs the most: it's been happening for months and you don't know.
The form says "thank you." The visitor believes they've reached you. You believe nobody's been in touch. There's no error, no bounce, no alert — just an absence, and absences are invisible.
Most of the time there's one specific cause, and it's a setting almost everyone gets wrong for entirely sensible reasons.
The short version
The most common cause: your form's From address is set to the visitor's email address.
That means your server sends mail claiming to be from [email protected] — which is exactly the forgery pattern SPF and DMARC exist to stop. Gmail publishes a policy, your server isn't authorised to send as Gmail, and the message fails.
The fix: From should be your own domain. Put the visitor's address in Reply-To.
Five other causes follow.
Cause 1 — The From-address mistake
Form plugins encourage this. Contact Form 7's default template historically used [your-email] in the From field, and it seems obviously right — you want the email to look like it came from the person who wrote to you.
Why it fails: you're asking your web server to send mail as @gmail.com, @outlook.com, or @somecompany.com. None of those domains authorise your server in their SPF records. Gmail, Yahoo, and Microsoft all publish DMARC policies. The message fails authentication and gets rejected or filtered.
The correct configuration:
From: Website Form <[email protected]>
Reply-To: [your-email]
Subject: New enquiry from [your-name]
You get the same convenience — hitting reply goes to the visitor — without forging anything.
Where to change it:
Contact Form 7: the Mail tab, "From" field.
WPForms: Settings → Notifications → "From Email."
Gravity Forms: the notification's "From Email."
Fluent Forms: the notification settings.
If your From field contains a form tag pulling the visitor's address, that's your problem.
Cause 2 — PHP mail
Even with a correct From address, WordPress's default sending method fails.
wp_mail() uses PHP's mail(), which sends unauthenticated mail from your web server. Since 2024, providers require authentication, and plenty of hosts block PHP mail entirely — so your form reports success while nothing leaves.
The fix: route mail through a transactional service via SMTP. Step by step.
Cause 3 — It's arriving in your spam folder
Worth ruling out before assuming a sending failure, and easy to miss when notifications come from your own domain to your own inbox.
Check spam and junk. Also check any filters you've set — a rule sending anything containing "enquiry" to a folder you never open is a real and common cause.
If it's in spam: mark it as not spam, add the From address to your contacts, and fix the authentication so it stops happening.
Cause 4 — The recipient address is wrong
Sounds trivial, catches people regularly.
Check the "To" field in your form's notification settings. Common failures: a typo, an address from a previous role, a shared inbox that was decommissioned, or a forwarding rule that broke during an email migration.
Test by sending to a completely different address — a personal Gmail — to establish whether the problem is sending or receiving.
Cause 5 — Your host is blocking or throttling
Some hosts block PHP mail. Some rate-limit outbound mail. Some block SMTP ports.
The tell: everything is configured correctly and mail still doesn't leave, with no error.
How to check: install an email logging plugin. If the log shows the message as sent but the recipient has nothing anywhere, the mail isn't leaving the server.
The fix: SMTP through an external service via API where possible, which sidesteps port blocking entirely.
Cause 6 — A plugin conflict
Less common, and worth checking when nothing else explains it.
Caching plugins can interfere with form submission. Security plugins sometimes block form POST requests as suspected spam. Two form plugins running simultaneously can conflict. An optimisation plugin deferring JavaScript can break the form's submit handler.
How to check safely: use Health Check & Troubleshooting, which disables plugins for your session only — so you can test on a live site without visitors noticing. The method.
Testing properly
Work down until something fails.
1. Check the current From address. If it's a form tag pulling the visitor's email, stop here and fix it.
2. Submit the form yourself and check inbox, spam, and any filtered folders.
3. Submit with a different recipient address — send the notification to a personal Gmail temporarily. If it arrives there but not at your business address, it's a receiving problem.
4. Check your email log. Sent but not received means it isn't leaving the server. Not logged at all means the form isn't triggering wp_mail().
5. Test with plugins disabled via troubleshooting mode.
The safety net worth building
Even with everything working, don't rely on email as the only record of a form submission.
Email is a delivery mechanism that can fail — a filter changes, a mailbox fills, a DNS record breaks. If a lead exists only as an email that didn't arrive, it's gone.
Store submissions in the database. Most form plugins do this by default; some don't. Check yours, and turn it on if it isn't.
Then you have a record regardless. If email breaks for a fortnight, you can go back and see what came in — which is the difference between a technical annoyance and lost business.
Also consider: a second notification to a different address at a different provider, or pushing submissions to a CRM or a spreadsheet.
Frequently asked questions
Why does the form say sent but nothing arrives?
The success message confirms the form processed the submission, not that the email was delivered. Most form plugins show it as soon as wp_mail() returns without an error — and wp_mail() returns success when it hands the message off, even if the host blocks the actual sending or the receiving provider rejects it. Install an email logging plugin to see whether the message was genuinely attempted and what happened to it.
Should the From address be the visitor's?
No, and this is the single most common cause of form notifications failing. Setting From to the visitor's address means your server sends mail claiming to be from Gmail, Outlook, or their company domain — none of which authorise your server, and all of which publish DMARC policies. It fails authentication. Set From to your own domain and put the visitor's address in Reply-To, which gives you the same convenience without forging anything.
How do I log form submissions?
Most form plugins store submissions in the database by default — Gravity Forms, WPForms, and Fluent Forms all have an entries view. Contact Form 7 doesn't, and needs an add-on like Flamingo. Turn database storage on regardless of whether your email is working, because email is a delivery mechanism that can fail silently, and a lead that exists only as an undelivered email is a lost lead.
What to do next
Open your form's notification settings and look at the From field.
If it contains a form tag pulling the visitor's email address, you've found it — and that's a two-minute fix that resolves this for most sites.
While you're there, confirm your form is storing submissions in the database. Even with email working perfectly, that's the safety net that means a delivery problem costs you an afternoon rather than a month of leads.
Free: The 60-Minute Email Authentication Fix.
Related guides
- WordPress emails not sending — the wider diagnosis
- How to set up SMTP in WordPress — the underlying fix
- Find a plugin conflict safely — testing without downtime
- Email authentication — why the From address matters
Join the Newsletter
Get practical marketing tactics delivered straight to your inbox.

Written by
Muhammad Basim
Related Articles
Transactional Email Services Compared for WordPress
Every one of these services will deliver your password resets. That's not the differentiator. What differs is setup difficulty, what the free tier covers, how good the logs are when something goes wrong, and — the one people never consider until it bites them — whether the service also handles marketing mail, and whether you […]
WooCommerce Order Emails Going to Spam: The Fix
"I never got a confirmation. Did my order go through?" Every store owner gets this message. And when it arrives often enough, you stop treating it as customer confusion and start realising your receipts genuinely aren't landing. This costs more than most email problems, because a missing order confirmation doesn't just annoy someone — it […]
How to Set Up SMTP in WordPress, Step by Step
Twenty minutes, once, and your site's email stops being a mystery. The job is simple in principle: stop WordPress handing mail to your web server, and hand it to a service that exists to send mail properly. What follows is the actual sequence, including the two steps people skip that make the difference between "the […]