A contact form not sending emails does not announce itself. The page loads, the customer types in a dead condenser and a street address, the screen says thanks, and the message goes nowhere. Nobody at the shop sees an error, because there isn't one. The only symptom is quiet, and in a trades business quiet looks like a slow week, not a broken website.
I'm going to work one example all the way through: what the silence cost, where the messages were actually going, and the five tests that found them. The shop is a composite and every number is a stated assumption, not a client's books. That is on purpose. You can swap in your own figures and redo the arithmetic in ten minutes.
The example: a four-truck shop and 42 quiet days
Picture a four-truck HVAC and plumbing company in Round Rock. The site runs on WordPress with the Contact Form 7 plugin, on an ordinary cPanel shared-hosting account. For years the company's email lived on that same hosting account. On June 9 the owner moved the mailboxes to Google Workspace so the office could share calendars. The move went smoothly. Email between people worked that afternoon.
The form kept showing its green success message. On July 21 a longtime customer called the office and asked why nobody had answered the request she sent through the website two weeks earlier. That is 42 days, in the hottest stretch of a Central Texas summer, with every form notification arriving somewhere nobody looked.
The way it was discovered is typical. A silent form failure is usually found by a customer who complains, not by the business checking. Most customers do not complain. They call the next company.
Curious what a site like this costs you in missed leads? See real builds for businesses like yours.
What does a contact form not sending emails cost over six weeks?
Here are the assumptions for the example shop. Replace each one with your own number.
- The form averages 5 submissions a week (pulled from last summer's inbox).
- About 20% of submissions are junk: vendors, job seekers, spam.
- When the office answers the same day, 45% of real form inquiries turn into a booked job.
- The average repair ticket is $420. A system replacement averages $9,800.
- The shop spends $60 a day on Google Ads, and about one third of its ad leads arrive by form instead of by phone.
Now the math, one line at a time.
- Submissions missed: 5 a week x 6 weeks = 30.
- Real inquiries: 30 x 80% = 24.
- Jobs that would have booked: 24 x 45% = 10.8, call it 11.
- Revenue from those jobs: 10 repair tickets x $420 = $4,200, plus 1 replacement at $9,800 = $14,000.
- Ad spend that bought leads nobody saw: $60 x 42 days = $2,520 in total spend; one third of that is $840.
Total: $14,840, or about $353 for every day the form stayed silent. That figure leaves out the maintenance agreements a few of those eleven customers would have signed, the reviews they would have left, and the neighbor each one would have told.
It also leaves out the reason late recovery barely helps. According to a Harvard Business Review audit of 2,241 U.S. companies, firms that tried to contact a web lead within an hour were nearly seven times as likely to qualify that lead as firms that waited even one hour longer. A no-cool request from June 12 was solved by another company on June 12. Finding that message in late July recovers an apology, not a job.
Where can a form submission get lost on the way to your inbox?
A form submission passes through five handoffs before a person reads it. A leak can sit at any one of them, and each looks identical from the customer's side of the screen.
- Browser to form handler. The Submit button has to actually deliver the data to the site. Spam protection, a script conflict, or a stale cached page can stop it here.
- Form handler to storage. Some form tools save every entry in a dashboard. Some save nothing and rely on email alone.
- Form handler to mail sender. The site has to pass the notification to something that sends mail: the web server itself, or an outside mail service.
- Mail sender to receiving server. The receiving mail system checks whether the sender is authorized to send for the domain (SPF, DKIM, DMARC) and decides where the message should be routed.
- Receiving server to a human. The message lands in an inbox, a spam folder, a quarantine, or the mailbox of someone who left the company last year.
One fact matters more than the rest: a success message proves the website accepted the submission. It does not prove an email was sent, delivered, or read. Handoff 1 can pass while handoffs 3, 4, and 5 all fail.
How do you test a contact form that is not sending emails?
Test the handoffs in order and stop at the first one that fails. Each test takes a few minutes. Here is how each one went for the example shop.
Test 1: Submit it like a customer would
Use your phone on cellular data, not the office Wi-Fi, and use a personal email address rather than a company one. Fill in every field the way a homeowner would and note the exact time. If the button spins forever or the form reloads empty, the leak is at handoff 1. Common causes are a spam-protection key (reCAPTCHA or similar) that was registered to an old domain or a retired account, a plugin update that broke the form's script, or a caching plugin serving a page with an expired security token.
Example shop: green success message. Handoff 1 passes.
Test 2: Look for the stored entry
Log in to the site and look for the submission itself. Gravity Forms and the paid versions of WPForms keep an Entries screen. Squarespace and Wix keep submissions in their own dashboards. Contact Form 7 stores nothing unless a companion plugin such as Flamingo is installed. If your form tool stores entries and your test is there, the site did its job and the leak is in email. If your tool stores nothing, email is the only copy of every lead you have ever received through it.
Example shop: Contact Form 7, no Flamingo. No stored entries, so no record of what was missed. Keep going.
Test 3: Check whether the site handed off a message
By default, WordPress sends form notifications through a function called wp_mail, which hands the message to the web server's own mail program with a From address of wordpress@ your domain. No login, no authentication. To see what happened to a specific message, use the host's mail log. On cPanel hosting it is called Track Delivery, and it lists every message the server sent, the recipient, and the result. A mail-logging plugin shows the same thing from inside WordPress.
Example shop: Track Delivery showed the 2:14 p.m. test message, addressed to service@ the company domain, marked as accepted and delivered. Delivered where? That question is handoff 4.
Test 4: Check authentication and routing
Two things live here. First, routing. cPanel has an Email Routing setting for each domain. When it is set to Local Mail Exchanger, the server believes it hosts the domain's mailboxes and delivers mail for that domain to itself, without ever checking where the real mailboxes now live. Second, authentication. Open a form notification that did arrive (or send a test to a personal Gmail address), choose Show original in Gmail, and read the SPF, DKIM, and DMARC lines. Each should say PASS. Google's Email sender guidelines have required every sender to personal Gmail accounts to authenticate with SPF or DKIM since February 2024, and they tell senders to keep reported spam rates below 0.10% and never reach 0.30%. Microsoft began enforcing similar rules for high-volume senders to Outlook.com in May 2025. Unauthenticated mail from a shared web server is exactly what those filters are built to distrust.
Example shop: Email Routing was still set to Local. Handoff 4 fails. Found it.
Test 5: Check the human end
Even when everything upstream passes, look at who receives the notification. Check the spam folder and, in Google Workspace or Microsoft 365, the admin quarantine. Check for an inbox rule that files website mail into a folder nobody opens. Check whether the recipient is a former dispatcher, the previous web designer, or a personal Gmail address that receives the mail by forwarding, since forwarding commonly breaks SPF.
What the shop found: two leaks, not one
Leak one: routing. When the mailboxes moved to Google Workspace, the domain's MX records changed, but the web host was never told. For 42 days the server delivered every form notification to the old service@ mailbox sitting on the hosting account. The owner logged in to the host's old webmail and found all of the missed submissions waiting there, including the customer who eventually called. Switching Email Routing to Remote Mail Exchanger took one click.
Leak two: the From address. After the routing fix, the owner ran Test 1 again using a Yahoo address, and that message never arrived. The form had been built to put the customer's own email in the From field so the office could hit reply. Yahoo and AOL publish a DMARC policy of reject, which instructs receiving servers to refuse mail claiming to be from their addresses when it was not sent through their systems. Every Yahoo and AOL customer's form submission was being refused. On top of that, the Workspace setup had replaced the domain's SPF record with one that listed only Google, so the web server was no longer authorized to send as the company's domain at all.
This is the pattern worth remembering. The first leak you find is rarely the only one, and the trigger is almost never the website. It is a change made somewhere near the website: a new email provider, a DNS edit, a hosting migration, a plugin update.
How do you keep a contact form from failing silently again?
The repair for the example shop took under an hour. These are the changes that hold.
- Send through an authenticated mail service, not the web server. Connect the site by SMTP or API to a transactional mail service such as Postmark, SendGrid, Mailgun, or Amazon SES, or to the Google Workspace or Microsoft 365 account itself, with DKIM signing set up for your domain.
- Set From to an address on your own domain. Something like forms@ your domain. Put the customer's address in Reply-To so the office can still answer with one click.
- Keep exactly one SPF record that lists every service allowed to send for the domain. Two SPF records on a domain count as an error and fail the check.
- Store every entry. Turn on entry storage or add Flamingo, so email is a notification and not the only copy.
- Add a second path that is not email. A text alert to the on-call phone, or a direct push into the field service software the office already watches, such as Jobber, Housecall Pro, or ServiceTitan.
- Send notifications to a shared mailbox plus one named person, never to a single employee's address alone.
- Compare counts. Google Ads and GA4 keep counting form conversions when notifications fail, because the conversion fires on the submission. If the reports say nine form leads last week and the inbox holds four, there is a leak. This matters most on landing pages built for Google Ads, where every submission was paid for.
- Test on a schedule. Once a month, on the same day you do your monthly Search Console check, and again after any DNS change, email move, host migration, or plugin update.
Two ownership questions sit underneath all of this. Someone at the company needs the logins for the domain registrar, the DNS, the host, and the email account, which is the heart of owning and managing your business website. And when different vendors handle the site and the email, nobody is automatically responsible for the seam between them. That tradeoff is covered in whether to bundle or split web design and hosting. A form test also belongs at the top of any small business website audit, ahead of anything cosmetic. At Turnkey Web, a real submission through every form is part of launch day and part of any DNS change afterward, because this failure is so easy to cause and so hard to notice.
Run the same math for your own shop
The formula is short:
form submissions a week x weeks silent x share that are real x booking rate x average ticket
For a roofer, submissions may be fewer but each is an inspection that can turn into a full replacement, so two missed forms can outweigh the example shop's entire six weeks. For a cleaning or lawn company, each missed form is a recurring customer, so multiply by the months a typical customer stays. A landscaper in March and an HVAC shop in July will both get a larger number than the same shop would in November.
Whatever number you get, divide it by the days of silence. The example shop's answer was about $353 a day. A monthly form test takes five minutes and catches the failure within thirty days instead of whenever a customer happens to call and complain.
What else do owners ask when a contact form stops sending emails?
Why did my contact form stop working when nobody touched the website?
Something near the website changed. The usual triggers are moving company email to Google Workspace or Microsoft 365, a DNS edit, a hosting migration, an automatic plugin update, or a spam-protection key tied to an account that was closed. The form depends on all of them, so start by listing what changed in the weeks before the leads went quiet.
The form says the message was sent. Doesn't that mean it works?
No. The success message only confirms the website accepted the submission. Sending, delivery, and landing in an inbox a person reads are separate steps, and any of them can fail without an error on screen.
Should form notifications go to my personal Gmail?
Send them to a mailbox on your own domain first, and add a personal address as a second recipient if you want one. Never use a gmail.com or yahoo.com address as the form's From address, and avoid relying on auto-forwarding, which often breaks authentication and sends the message to spam.
Can I recover the leads that never arrived?
Sometimes. Check the form tool's stored entries, the spam folder and admin quarantine, and any old mailbox still sitting on the web host. Gmail deletes spam after 30 days, so look quickly. A host's mail log shows the time and recipient of each message but not what the customer wrote.
How often should I test my website's contact form?
Once a month, plus immediately after any change to email, DNS, hosting, or plugins. Submit from a phone on cellular data with a personal email address, and confirm the message reaches a person, not just a server.
Frequently asked questions
Why did my contact form stop working when nobody touched the website?
Something near the website changed. The usual triggers are moving company email to Google Workspace or Microsoft 365, a DNS edit, a hosting migration, an automatic plugin update, or a spam-protection key tied to an account that was closed. List what changed in the weeks before the leads went quiet and start there.
The form says the message was sent. Doesn't that mean it works?
No. The success message only confirms the website accepted the submission. Sending, delivery, and landing in an inbox a person reads are separate steps, and any of them can fail without an error on screen.
Should form notifications go to my personal Gmail?
Send them to a mailbox on your own domain first, and add a personal address as a second recipient if you want one. Never use a gmail.com or yahoo.com address as the form's From address, and avoid relying on auto-forwarding, which often breaks authentication and sends the message to spam.
Can I recover the leads that never arrived?
Sometimes. Check the form tool's stored entries, the spam folder and admin quarantine, and any old mailbox still sitting on the web host. Gmail deletes spam after 30 days, so look quickly. A host's mail log shows the time and recipient of each message but not what the customer wrote.
How often should I test my website's contact form?
Once a month, plus immediately after any change to email, DNS, hosting, or plugins. Submit from a phone on cellular data with a personal email address, and confirm the message reaches a person, not just a server.