DEV Community

mnotr
mnotr

Posted on • Originally published at mxcheck.dev

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.

The numbers

  • 60% of form submissions use fake or mistyped emails
  • 2% bounce rate threshold before spam filtering kicks in
  • ~5ms to validate an email via API (faster than a page load)

Why emails bounce

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
  • 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

  1. Syntax errors: Malformed addresses that aren't valid email format
  2. Non-existent domains: Domains with no DNS records or no MX records
  3. Disposable addresses: Throwaway emails from services like Mailinator that expire in minutes
  4. Typos: Common misspellings of popular domains (gmial.com, yaho.com, outlok.com)
  5. Role accounts: Generic addresses like info@, admin@, noreply@ that often don't accept mail

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.

  • 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. Run every address through validation and remove hard bounces before they damage your sender score.

Implementation: real-time validation at signup

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);
});
Enter fullscreen mode Exit fullscreen mode

Backend (verify before saving)

import mxcheck from "mxcheck";

app.post("/signup", async (req, res) => {
  const result = await mxcheck(req.body.email);

  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"
    });
  }

  // Email is validated, proceed with account creation
});
Enter fullscreen mode Exit fullscreen mode

The ROI of email validation

Say you have a SaaS with 1,000 signups per month:

  • Without validation: ~15% of emails are invalid. 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. Open rates drop for ALL users.
  • 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.

Email validation isn't a cost center. It's insurance for your entire email channel.

Best practices

  1. Validate at the point of entry. Don't wait until send time. Catch bad emails when the user can still fix them.
  2. Show typo suggestions. "Did you mean user@gmail.com?" converts a lost user into a saved one.
  3. Block disposable emails for paid features. Free tier with disposable is fine. Paid features should require a real address.
  4. Don't over-block. A valid email that scores low might still be worth accepting. Use the score, not just the boolean.
  5. 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.


MXCheck - Free email validation API. 3,000 requests/month free. npm install mxcheck

Top comments (0)