Shopify Custom Contact Form Not Sending Emails? Here's How to Fix It!
Hey fellow store owners! Ever pour your heart into building a slick custom contact form on your Shopify store, test it, see that satisfying 'success' message, and then… crickets? No email notification in your inbox? You're not alone. This is a surprisingly common, and super frustrating, issue that recently came up in a lively community discussion. It feels like your store is playing a cruel trick on you, doesn't it? The good news is, our community experts dug deep into this exact problem, and there are some clear paths to getting those messages delivered.
The Plot Twist: Are You Even Talking to Shopify?
Before we dive into the nitty-gritty of Shopify's internal workings, there's a critical first check that one of our sharp community members, ThemeMend, pointed out. Sometimes, what looks like a Shopify form might actually be sending data elsewhere entirely! In the specific case we were discussing, the form on the page was posting to Formspree, not Shopify. The original poster provided a link to their live form, which ThemeMend inspected:
If your form's action attribute points to an external service like Formspree, then Shopify never even sees the submission, and of course, won't send a notification! The "success" message you're seeing would be coming from that external service, not Shopify.
How to Check Where Your Form is Submitting
This is a super quick check that can save you hours of head-scratching:
- Go to the page with your custom form on your live store.
- Right-click anywhere on the form and select "Inspect" (or "Inspect Element").
- In the developer tools that pop up, look for the
tag. - Check its
actionattribute.
If it says something like action="https://formspree.io/f/...", you've found your culprit! In this scenario, your troubleshooting needs to shift to Formspree:
- Formspree Confirmation: On Formspree's free plan, a new form needs to be confirmed by clicking a link in an email after its first submission. Until then, submissions are accepted, but emails don't go out. This is a #1 cause for this exact symptom!
- Destination Email: Is the email address verified in Formspree?
- Submission Limits: Are you past Formspree's free plan limits (usually 50 submissions/month)?
- Spam Folder: Always check your spam folder, and Formspree's dashboard has a submission log you can check.
If you actually want Shopify to handle these submissions, then you'll need to update your form's code to use Shopify's native (or more typically, {% form 'contact' %} in Liquid) and ensure your input fields are named correctly (e.g., contact[email], contact[body]).
Assuming You ARE Talking to Shopify: The Silent Spam Filter
Okay, so you've confirmed your form is definitely submitting to Shopify. Great! Now we can focus on why Shopify might be accepting the submission (form.posted_successfully? returns true) but silently dropping the email notification. This is often where Shopify's internal spam filters come into play. As Ecom_swift_LLC pointed out, Shopify runs every /contact submission through its own spam filter after the redirect, so a 'success' state doesn't guarantee email delivery.
The original poster's custom form structure looked something like this:
{% form 'contact', id: 'ContactForm', class: 'ba-form isolate' %}
{% endform %}
The "Hidden" Field Dilemma: HTML vs. CSS
One of the strongest theories from the community, particularly from M.Rahman and Ecom_swift_LLC, revolved around the hidden attribute on the field. While cuongnm_trooix noted that the hidden attribute shouldn't stop submission (a disabled attribute would), Ecom_swift_LLC suggested that a field that's empty until JavaScript fills it, especially when using the native HTML hidden attribute, can look a lot like an "inverted honeypot" pattern – something anti-spam filters watch for. It's a subtle distinction, but potentially significant.
How to Fix It: Use CSS Instead of HTML's hidden Attribute
The fix is simple: remove the native HTML hidden attribute and hide the field using CSS instead. This makes it visually hidden but still a 'normal' part of the form submission from a backend perspective.
- Locate your
tag forcontact[body]. - Change it from
hiddentostyle="display: none;"(or apply a CSS class that does the same).
Your code would then look like this:
Quick Test: Temporarily remove all hiding and make the visible with some static text. If the email delivers then, you've confirmed the hiding method or dynamic JS updates were indeed triggering Shopify's silent drop logic.
Don't Forget contact[name]
Ecom_swift_LLC also highlighted that stripping a contact form down to just email and body is unusual. Adding contact[name] back into your form, even if it's visually hidden via CSS, can help make your submission look less suspicious to spam filters. Think of it as making your form appear more "complete" in Shopify's eyes.
How to Add a Hidden contact[name] Field
You can add an input for contact[name] and hide it with CSS:
You can pre-fill the value if you're capturing a name in a multi-step process, or leave it empty if it's not strictly necessary for your internal process but helps with spam filtering.
Multi-step Forms and Dynamic Content
If your form uses JavaScript to combine answers into contact[body], that dynamic content generation before submission can also be a red flag for spam filters. It's not a definitive cause, but it's worth considering. As cuongnm_trooix suggested, temporarily testing with a simple, static body in your can help isolate if the content itself (or how it's assembled) is the issue.
Checking Your Notification Template
Sometimes, the issue isn't with the form submission at all, but with the notification email template itself! Ecom_swift_LLC reminded us that Shopify will still show your success page even if the notification template fails to render. A broken or edited Liquid snippet under Settings > Notifications > "Contact form" can silently swallow the email.
How to Check Your Contact Form Notification Template
- In your Shopify Admin, go to Settings.
- Click on Notifications.
- Find and click on "Contact form" under the "Customer notifications" section.
- Open the template and try to save it without making any changes. If it saves without an error, the template is likely fine. If you get an error, you've found a potential problem!
- Review any recent changes you or an app might have made to this template.
Your Troubleshooting Toolkit: How to Test Like a Pro
When you're facing a tricky issue like this, a methodical approach is your best friend. Here's a solid plan, combining tips from rajimulislamjoy and cuongnm_trooix:
- Controlled Comparison: Submit the exact same email address and a short, plain-text message through your working default Shopify contact form and then through your custom form.
- Compare POST Payloads: Use your browser's developer tools (Network tab) to inspect the POST request for both submissions. Compare the
form_type,contact[email], andcontact[body]to ensure they are effectively identical. - Simplify First: Temporarily test your custom form with a standard, visible
containing static text, instead of one dynamically filled with JavaScript. If that works, gradually reintroduce your JavaScript content piece by piece. - Check for Length/Links: While there's no documented native body-length limit, testing a shorter body or removing links can still be a useful isolation step to rule out content-based spam triggers.
- If All Else Fails, Contact Shopify Support: If your requests are effectively identical between the working and non-working forms, and you've checked all the above, give Shopify Support the exact UTC timestamps of your test submissions. They might be able to trace the submission on their end.
What Shopify Doesn't Tell You (or Show You)
One frustrating aspect highlighted by the community (Ecom_swift_LLC, cuongnm_trooix) is that there's no log of contact-form submissions anywhere in the Shopify Admin. This makes debugging these issues particularly challenging. While Shopify's documentation, as referenced by cuongnm_trooix, states that submissions flagged as spam are still emailed with [SPAM] in the subject, the community insights suggest that certain form configurations (like the 'inverted honeypot' scenario with hidden fields) might lead to a silent drop before that typical spam tagging process. This means we have to rely heavily on external testing and the process of elimination. Here's the Shopify Help Center article mentioned:
Shopify Help Center: Add a Contact Us page to your store
So, if you're building a custom form on your Shopify store and running into these email notification hiccups, remember to start with the basics: ensure you're actually submitting to Shopify, then methodically check for potential spam triggers like hidden fields and dynamic content, and finally, double-check your notification templates. With a bit of patience and these expert insights from the community, you'll get those crucial customer messages flowing into your inbox in no time!