Why Gmail delivery silently fails (the actual reason)
Most people don't realize Gmail will accept an inbound SMTP connection, return a clean 250 OK response, and then quietly drop the message into spam or trash without telling the sender. There's no bounce, no notification — just silence. If you're wiring up a contact form and the test submissions aren't arriving, the email almost certainly was sent successfully. Gmail just doesn't want to show it to you.
Here's the actual reason. Gmail runs every inbound message through a reputation gauntlet that scores three things: the sending domain's SPF record, the message's DKIM signature, and the sender's historical engagement rate with the recipient. A contact form running on a fresh domain with no SPF and no DKIM scores near zero — and Gmail treats near-zero senders as presumptive spam. The message lands in Spam or never appears at all.
Third-party SMTP services like SendGrid, Mailgun, and AWS SES make this worse on cold setups because their shared IP pools have varied reputations. If your form's SMTP provider hands you an IP that some other tenant burned last week, your perfectly innocent form submission inherits that reputation. This is why a form that worked yesterday can suddenly stop landing today, with no code change.
splitforms sidesteps the cold-start problem by sending through warmed-up infrastructure by default. You only run into deliverability issues when you switch to custom SMTP — which is exactly what we're going to cover. For the deep dive on spam classification, see why contact form emails go to spam.
The three setups that actually work
There are three patterns for getting form submissions into Gmail in 2026. Pick the one that matches your situation:
| Setup | Best for | Cost | Setup time | Deliverability |
|---|---|---|---|---|
| splitforms default | Solo devs, freelancers, side projects | Free (1,000/mo) | 2 minutes | Excellent — pre-warmed sender |
| Gmail App Password + SMTP | Want submissions to look like they come from you@gmail.com | Free | 10 minutes | Good after SPF/DKIM |
| Workspace SMTP relay | Businesses with custom domains and > 500/day | $6/user/mo Workspace | 30 minutes | Best — domain reputation |
The honest answer for 90% of readers: use splitforms' default delivery and stop overthinking it. The other two setups only matter if you specifically need the from-address to be a Gmail address you control, or if you're a business with volume and compliance needs.
Setup 1: splitforms default delivery to any Gmail inbox
This is the easiest path. You don't configure SMTP at all — splitforms sends the submission notification to whatever email address you registered with. If that address is a Gmail address, you're done.
- Sign up at splitforms.com/login using your Gmail address. Magic-link auth, no password.
- Copy your access key from the dashboard.
- Paste the form below into your site:
<form action="https://splitforms.com/api/submit" method="POST">
<input type="hidden" name="access_key" value="YOUR_ACCESS_KEY" />
<input type="text" name="name" required />
<input type="email" name="email" required />
<textarea name="message" required></textarea>
<input type="checkbox" name="botcheck" style="display:none" tabindex="-1" />
<button type="submit">Send</button>
</form>Submit a test message from the live form. The email arrives in your Gmail inbox within a few seconds, from `notifications@splitforms.com` with the form data in the body. Reply-to is set to whatever the visitor typed in the `email` field, so hitting Reply in Gmail just works.
If the first email lands in Promotions or Spam, click Not spam and drag it into Primary. Gmail learns the sender within one or two messages. After that, every submission lands in the inbox. This setup works the same whether you're building a Next.js form backend, a React form, or static HTML.
Setup 2: Gmail App Password + custom SMTP
This setup matters if you want the from-address to be you@gmail.com instead of the default splitforms sender. Form submissions appear in Gmail as if you sent them to yourself — useful for keeping everything in one thread and for setting up filters based on your own address.
Step 1: Turn on 2-Step Verification
App Passwords require 2-Step Verification (2SV) on the Google account. Go to myaccount.google.com/security, find “How you sign in to Google,” and enable 2-Step Verification if it's off. Use your phone or an authenticator app — security keys also work.
Step 2: Generate the App Password
- Go to
myaccount.google.com/apppasswords - App name: type something like “splitforms SMTP”
- Click Create
- Copy the 16-character password (it shows with spaces — they're optional)
Treat this password like an API key. Anyone with it can send mail as you until you revoke it. If you lose it, generate a new one and delete the old.
Step 3: Configure splitforms custom SMTP
In your splitforms dashboard, go to Settings → Custom SMTP and fill in:
Host: smtp.gmail.com
Port: 587
Security: STARTTLS
Username: you@gmail.com
Password: <your 16-char App Password>
From: you@gmail.comClick Send test email. Within seconds, you should see a test message in your Gmail inbox sent from yourself, to yourself. If it lands, save the config — every form using that access key now sends through your Gmail account.
One catch: personal Gmail caps outbound at roughly 500 messages per 24 hours. If you're sending more than that, switch to Workspace SMTP relay below, or keep splitforms' default sender (which has no per-user cap on the free tier).
Setup 3: Google Workspace SMTP relay for businesses
If you run a business with a custom domain on Google Workspace, SMTP relay is the production-grade option. It sends from any address at your domain, doesn't count against a specific user's mailbox quota, and supports up to 10,000 messages per day per domain. The trade-off is more setup.
Step 1: Enable SMTP relay in Workspace Admin
- Sign in to
admin.google.com - Apps → Google Workspace → Gmail → Routing
- Scroll to SMTP relay service → click Configure
- Description: “splitforms form submissions”
- Allowed senders: Only addresses in my domains
- Authentication: Only accept mail from the specified IP addresses (add your SMTP provider's IPs) OR Require SMTP Authentication
- Encryption: Require TLS
- Save
Step 2: Add SPF and DKIM
This is the part most people skip and then wonder why Gmail rejects their own relay mail. In your DNS:
# SPF (TXT record at @ or root domain)
v=spf1 include:_spf.google.com ~all
# DKIM — generate the key in Admin → Apps → Gmail → Authenticate email
# Then add the TXT record Google gives you at google._domainkey.yourdomain.comWait for DNS propagation (5 minutes to a few hours), then go back to Workspace Admin → Authenticate Email and click Start authentication. Once DKIM is active, your mail signs automatically.
Step 3: Point splitforms at the relay
Host: smtp-relay.gmail.com
Port: 587
Security: STARTTLS
Username: <a Workspace user with relay permission>
Password: <App Password for that user>
From: forms@yourdomain.comFrom now on, every submission sends from forms@yourdomain.com, signed with your domain's DKIM, with your domain's SPF. Deliverability to Gmail and Outlook recipients is as good as it gets. For high-volume forms, the same architecture works for Astro, Vue, and Svelte sites.
Filters and labels: organize form submissions in Gmail
By default, every form submission lands in your Primary inbox and mixes with personal mail. After a week of this you'll regret not setting up filters. Here's the minimal setup:
Auto-label all form submissions
- In Gmail, click the search bar → click the sliders icon (Show search options)
- From:
notifications@splitforms.com(or your custom SMTP sender) - Click Create filter
- Check: Apply the label → New label → name it Form submissions
- Check: Never send it to Spam
- Check: Categorize as: Primary
- Click Create filter
Every future submission auto-labels and skips both Spam and Promotions. The label shows in the left sidebar with an unread count.
Separate forms by subject prefix
If you have multiple forms (contact, pricing, careers), set a unique subject prefix on each form in the splitforms dashboard. Then create one filter per prefix:
Subject contains "[Pricing]" → label: Forms/Pricing
Subject contains "[Careers]" → label: Forms/Careers
Subject contains "[Support]" → label: Forms/SupportNow each form has its own folder. You can also forward specific labels to teammates with another filter, which is a poor man's shared inbox for free Gmail users.
Mark as not spam and IMAP rules
Gmail's machine learning is aggressive. If your first form submission lands in Spam, you have to teach Gmail to trust the sender. The fastest training signal is the Not spam button — Gmail weights that 10x heavier than a filter.
- Open Gmail → click Spam in the left sidebar
- Find the form submission, open it
- Click Report not spam at the top
- Reply to the message once (even just “noted” — Gmail logs replies as positive signals)
- Star the message
After two or three messages, Gmail learns the sender is legitimate and lands future ones in Primary automatically. Don't skip step 4 — replies are the strongest engagement signal Gmail has.
If you use a desktop client over IMAP
Apple Mail, Thunderbird, and Outlook see Gmail labels as IMAP folders. The “Form submissions” label appears as a subfolder. Server-side filters apply before IMAP delivery, so the routing you set up in Gmail's web UI works in every client automatically — no need to duplicate rules per device.
Troubleshooting: when submissions don't arrive
Three failure modes account for almost every case of “the form is broken.” Diagnose in this order before assuming splitforms has a bug.
No email at all
- Search Gmail for
in:anywhere from:notifications@splitforms.com— the message is probably in Spam or Promotions, not deleted. - Check the splitforms dashboard at splitforms.com/dashboard/submissions. If the submission is there but no email arrived, the API call succeeded and the problem is in delivery.
- If custom SMTP is configured, check splitforms' Logs tab for the SMTP response. A 5xx response means Gmail rejected; a 2xx means Gmail accepted and then filed it somewhere.
- Verify the recipient address in splitforms settings is correct. Typos in the destination email account for more “missing” submissions than any other cause.
Intermittent delivery
- Check Google Postmaster Tools (
postmaster.google.com) for your sending domain's reputation. Anything below Medium triggers selective filtering. - Verify SPF includes every IP range your SMTP provider uses. Most providers publish an
include:directive — use that instead of hard-coded IPs. - Make sure every message is DKIM-signed. Some SMTP providers only sign when you explicitly enable domain authentication.
- Check for rate-limiting on your sending account. Personal Gmail caps at ~500/day; hitting it pauses all sending for 24 hours.
Always in Promotions tab
- Remove the
List-Unsubscribeheader from outbound transactional mail (splitforms strips this by default). - Include a plain-text alternative alongside HTML. Multipart messages score better than HTML-only.
- Create the Gmail filter from the section above — “Categorize as Primary” overrides Promotions classification.
- Reply to one message. A single user-initiated reply teaches Gmail this is conversational mail, not bulk marketing.
If you've worked through all of the above and submissions still don't arrive, the FAQ covers edge cases, and /docs documents the splitforms API contract. For a broader checklist see contact form not working.
How splitforms handles this by default
The reason splitforms exists is so you don't have to deal with any of this. The default delivery path uses a sender with established Gmail reputation, signed SPF + DKIM, and rate-limited routing. You sign up, paste a form, and emails land in your inbox. No DNS, no App Passwords, no Workspace bill.
When you outgrow the default — usually because you want emails from your own domain — the custom SMTP integration takes 10 minutes for Gmail App Password and 30 minutes for Workspace relay. Both are documented in /api-reference.
Pricing stays simple: 1,000 submissions/month free, $5/month Pro for 5,000, or $59 for 4 years if you want to lock the price in. Webhooks, AI spam classification, and MCP for AI agents are included on the free tier — competitors like Formspree, Web3Forms, and Basin paywall those. If you're already using Formspree or another backend and Gmail delivery is the breaking point, see the 5-minute migration guide.
Browse other guides at /blog, or grab a pre-wired template from /free-contact-form and have a working Gmail-routed form in two minutes.
FAQ
Why don't my contact form submissions arrive in Gmail?
Three usual causes. First, your sending domain has no SPF or DKIM record, so Gmail silently drops messages claiming to be from your domain. Second, your SMTP provider is on a Gmail block list because of past abuse from other tenants. Third, Gmail filed the message in the Promotions tab or Spam — it arrived, you just can't see it. Search `in:anywhere` for the form's subject line before assuming it never landed.
Can I use a regular Gmail password for SMTP?
No. Google removed support for less-secure-app passwords in 2022. As of 2026, the only way to authenticate SMTP against a personal Gmail or Workspace account is an App Password (with 2-Step Verification on) or OAuth2. App Passwords are 16-character tokens you generate at myaccount.google.com/apppasswords — they bypass 2FA for the specific app you create them for. Treat them like API keys.
Will Gmail mark splitforms emails as spam?
It can on the first few sends if you're using a brand-new sending domain with no reputation. Once you add SPF and DKIM records, mark the first message as `Not Spam`, and reply to a test submission once, Gmail learns the sender within a day or two. splitforms also defaults to sending from a warmed-up shared domain when you don't configure custom SMTP, which avoids the cold-domain problem entirely.
Why do my form emails always land in Promotions?
Gmail categorizes transactional mail from third-party SMTP into Promotions when the body is HTML-heavy, contains links, or has marketing-style headers. Three fixes: send plain-text alongside HTML, drop the `List-Unsubscribe` header for one-to-one transactional sends, and create a Gmail filter that forces matching subjects into the Primary tab. splitforms users can also pipe submissions to Slack or a webhook to bypass email categorization entirely.
Do I need Google Workspace to receive form submissions in Gmail?
No. Free personal Gmail accounts can receive form submissions just fine. Workspace becomes useful when you want to send from a custom-domain reply-to address (you@yourcompany.com instead of you@gmail.com), use SMTP relay for high-volume sending, or share an inbox with teammates. For solo founders and freelancers on the splitforms free tier, regular Gmail is plenty.
What's the difference between App Password and SMTP relay?
An App Password authenticates against one specific Gmail or Workspace mailbox and counts against that mailbox's daily send limit (around 2,000 messages for Workspace, 500 for free Gmail). SMTP relay is a Google Workspace–only feature that sends from your domain without touching a specific user mailbox, with a much higher 10,000-per-day cap and no per-user attribution. Use App Password for personal/small setups, SMTP relay for businesses.
Can I have multiple forms route to different Gmail labels?
Yes. Configure each form to use a distinct subject prefix in splitforms (e.g. `[Pricing] new lead` and `[Support] new ticket`), then create two Gmail filters that auto-apply labels based on the subject. You can also set a unique `replyto` per form, route specific forms to different addresses with Gmail's plus-aliasing (you+pricing@gmail.com), or send via webhook to Slack channels for forms that need real-time attention.
Submissions arrive sometimes but not always. Why?
Intermittent delivery almost always means your sending IP or domain landed in a temporary block list, or Gmail is rate-limiting your sender. Check Google Postmaster Tools for your domain's reputation. Also verify your SPF record allows all the IPs your SMTP provider actually uses (some providers rotate sending pools and you need an `include:` directive, not a hard-coded IP). splitforms users on custom SMTP should also confirm DKIM is signing every message.