How to Reduce Email Bounce Rate with Validation
A high email bounce rate destroys deliverability. Once your bounce rate exceeds 2%, email providers start routing your messages to spam. Above 5%, you risk getting your sending domain blacklisted entirely.
The fix is simple: validate email addresses before they enter your system. This guide explains why emails bounce, how validation prevents it, and how to implement it in your application.
Why emails bounce
There are two types of bounces:
Hard bounces (permanent)
- Invalid domain: The domain doesn't exist or has no mail servers (no MX records)
- Invalid mailbox: The domain exists but the specific address doesn't (e.g., nobody@gmail.com)
- Typos: user@gmial.com, user@hotnail.com — real people with wrong addresses
Soft bounces (temporary)
- Full mailbox: The recipient's inbox is full
- Server down: The receiving mail server is temporarily unavailable
- Message too large: The email exceeds the recipient's size limit
Hard bounces are the ones that hurt your sender reputation. They're also the ones you can prevent with validation.
What email validation catches
A proper validation check catches most hard bounce causes before you ever send an email:
- Syntax errors: Malformed addresses that aren't valid email format
- Non-existent domains: Domains with no DNS records or no MX records
- Disposable addresses: Throwaway emails from services like Mailinator that expire in minutes
- Typos: Common misspellings of popular domains (gmial.com, yaho.com, outlok.com)
- Role accounts: Generic addresses like info@, admin@, noreply@ that often don't accept mail or aren't monitored
Where to validate: signup vs. send time
At signup (recommended)
Validate the email the moment a user enters it. If it's invalid, show an error immediately. If it's a typo, suggest the correction. This is the best approach because:
- The user is still on the page and can fix their email
- You never store a bad address in the first place
- Response time is fast enough for real-time UX (~5ms)
Before sending a campaign
If you have an existing list, validate it in bulk before sending. This is a cleanup operation — run every address through validation and remove hard bounces before they damage your sender score.
Implementation: real-time validation at signup
Here's how to add email validation to a signup form that gives users instant feedback:
Frontend (show feedback as they type)
const emailInput = document.getElementById("email");
const feedback = document.getElementById("email-feedback");
let timeout;
emailInput.addEventListener("input", () => {
clearTimeout(timeout);
const email = emailInput.value.trim();
if (!email || !email.includes("@")) return;
// Debounce: wait 500ms after user stops typing
timeout = setTimeout(async () => {
const res = await fetch(
`https://mxcheck.dev/api/validate?email=${encodeURIComponent(email)}`
);
const data = await res.json();
if (data.suggestion) {
feedback.textContent = `Did you mean ${data.suggestion}?`;
feedback.style.color = "#eab308";
} else if (!data.valid) {
feedback.textContent = data.reason || "Invalid email";
feedback.style.color = "#ef4444";
} else if (data.checks.disposable) {
feedback.textContent = "Please use a permanent email address";
feedback.style.color = "#ef4444";
} else {
feedback.textContent = "Email looks good";
feedback.style.color = "#22c55e";
}
}, 500);
});
Backend (verify before saving)
// Express.js middleware
async function validateEmail(req, res, next) {
const { email } = req.body;
const check = await fetch(
`https://mxcheck.dev/api/validate?email=${encodeURIComponent(email)}`
);
const result = await check.json();
if (!result.valid) {
return res.status(400).json({
error: "Invalid email",
reason: result.reason,
suggestion: result.suggestion
});
}
if (result.checks.disposable) {
return res.status(400).json({
error: "Disposable emails are not allowed"
});
}
// Attach validation result for downstream use
req.emailValidation = result;
next();
}
app.post("/signup", validateEmail, (req, res) => {
// Email is validated, proceed with account creation
});
Stop bounces before they happen
MXCheck validates syntax, MX records, disposable domains, and catches typos. 3,000 free checks per month.
Get Free API KeyThe ROI of email validation
Let's do quick math. Say you have a SaaS with 1,000 signups per month:
- Without validation: ~15% of emails are invalid (industry average). That's 150 bad addresses per month.
- You send a welcome email, a follow-up, and a weekly digest. That's 600+ bounces per month from new signups alone.
- Your bounce rate climbs past 2%. Gmail starts flagging your emails as spam. Your open rates drop for ALL users, not just the bad ones.
- Cost of an email validation API: $0-29/month depending on volume.
- Cost of a damaged sender reputation: months of remediation, potential domain blacklisting, and lost revenue from emails that never reach inboxes.
Email validation isn't a cost center. It's insurance for your entire email channel.
Best practices
- Validate at the point of entry. Don't wait until send time. Catch bad emails when the user can still fix them.
- Show typo suggestions. "Did you mean user@gmail.com?" converts a lost user into a saved one.
- Block disposable emails for paid features. Free tier with disposable is fine. Paid features should require a real address.
- Don't over-block. A valid email that scores low (e.g., role account at a real domain) might still be worth accepting. Use the score, not just the boolean.
- Re-validate periodically. Domains expire. Mail servers change. Re-validate your list quarterly.
Summary
Email bounces are preventable. Validate addresses at signup with a syntax check, MX record lookup, and disposable detection. It takes one API call, adds ~5ms of latency, and protects your sender reputation from day one.