Stop forwarding contact form submissions to your inbox by hand
Why mailto: links and Gmail filters fall apart at scale, and how to wire up a clean per-submission email notification with one hidden field.
You ship a contact form. The first few submissions come in and you handle them by glancing at the dashboard. Then it gets busy. You set up a Gmail filter. Then a Zapier. Then you forget what's where. Sound familiar?
The right answer is the boring one: a per-submission email notification, formatted, sent automatically, with no setup beyond one hidden field.
Why mailto: doesn't scale
The simplest path is a mailto: link. It works right up until you realise:
- Mobile users hit it and a half-configured email client opens with their personal address pre-filled. Most close the app.
- Desktop users without a configured mail handler get a browser prompt asking which app to use. Most close the prompt.
- You can't pre-fill a structured message. Field labels? Form name? Spam check? None of it.
- You have no record of submissions you didn't see. From your perspective they never happened.
Why “just forward it from my form to my inbox” fails
The slightly fancier version is using a Gmail filter or a Make/Zapier flow that catches form notifications and routes them somewhere. This works at low volume. Then:
- Spam mixes in with real submissions and the filter starts over-blocking real ones (or under-blocking spam).
- Threads collapse together because the subject line is identical every time. You lose track of who said what.
- A team member needs access. Now you're sharing a Gmail filter setup over Slack screenshots.
- You change form fields. The filter still works but the email body is now half-empty.
What a good form notification looks like
Every form notification email needs five things to feel professional and stay useful at scale:
- A clear subject line with the form name so it threads correctly and is filterable.
- The submission rendered as a table, not a JSON dump or a wall of
field=valuelines. - A way to reply directly to the submitter, usually via a
Reply-Toheader set to the email field from the form. - No spam. If the underlying service flagged it as spam, the notification shouldn't fire. (It should still be visible in the dashboard for audit.)
- A link back to the dashboard for cases where the email isn't enough: searching old submissions, exporting, etc.
The 30-second setup
With most form services this is one hidden field added to your existing markup. Here's the SaveForm flavour:
<form action="https://saveform.io/api/submit/YOUR_FORM_ID" method="POST"> <!-- Where the notification email lands --> <input type="hidden" name="_emailTo" value="you@example.com" /> <!-- Optional: customise the subject line --> <input type="hidden" name="_subject" value="New contact form submission" /> <input type="text" name="name" required /> <input type="email" name="email" required /> <textarea name="message" required></textarea> <button>Submit</button> </form>
The _emailTo field is stripped from the stored submission, so it never shows up in your dashboard or CSV exports. It's pure routing metadata.
When a notification email isn't enough
Email is a great announcement channel for the “something happened” signal, but a bad storage channel. Two patterns where you should reach for something more:
- You need per-submission routing based on the data (e.g. enterprise leads go to the AE channel, hobby leads go to the docs page). Use a webhook.
- You need to reply automatically to the submitter with an acknowledgement. That's an auto-reply, a separate feature with its own design constraints.
For the basic case of “tell me when someone fills the contact form”, the hidden-field approach is hard to beat. It survives team changes, form-field renames, and the slow drift toward Slack notification fatigue.
One hidden field, one clean inbox
Add a single _emailTo field and you'll get a formatted HTML notification for every submission to that form. Free tier includes email notifications.