Skip to main content

Email typos at signup: catch gmial.com before your welcome email bounces

· 4 min read
Signitize
Email checks for signup forms

A user types [email protected], clicks Sign up and waits for a verification email that never arrives. They don't come back. You lose a real user, and the bounce counts against your sender reputation.

Typos are the most common bad address at signup, and unlike fake addresses, the person behind them actually wants your product. Catching them is pure gain.

The three kinds of typo​

TypoExampleWhat happens
Misspelled domain that doesn't exist[email protected]Hard bounce
Misspelled domain that does exist[email protected]Mail may go to a stranger's server, or bounce
Misspelled username[email protected]Reaches someone else, or bounces

Each needs a different tool, so the answer is three layers.

Layer 1: "Did you mean" in the browser​

The fastest fix is a suggestion while the user is still on the form: Did you mean [email protected]? A small list of popular domains covers most typos:

const DOMAINS = ['gmail.com', 'yahoo.com', 'outlook.com', 'hotmail.com', 'icloud.com', 'aol.com', 'proton.me']

function distance(a, b) {
const row = Array.from({ length: b.length + 1 }, (_, i) => i)
for (let i = 1; i <= a.length; i++) {
let previous = row[0]
row[0] = i
for (let j = 1; j <= b.length; j++) {
const current = row[j]
row[j] = Math.min(row[j] + 1, row[j - 1] + 1, previous + (a[i - 1] === b[j - 1] ? 0 : 1))
previous = current
}
}
return row[b.length]
}

function suggestEmail(email) {
const [local, domain] = email.trim().toLowerCase().split('@')
if (!local || !domain || DOMAINS.includes(domain)) return null
const match = DOMAINS.find((known) => distance(domain, known) <= 2)
return match ? `${local}@${match}` : null
}

suggestEmail('[email protected]') // null

Show the suggestion as a link the user can click; never change the address silently. Someone whose address really is at a similar-looking domain must be able to keep it. Use your own signup data to extend the list with the providers your users actually have.

Layer 2: reject addresses that can never receive mail​

On the server, reject what can't possibly work:

  • the domain doesn't exist (gmaill.con);
  • the domain publishes a "null MX", meaning it accepts no mail;
  • no mail server resolves for the domain;
  • the username breaks the provider's rules, such as [email protected] (Gmail only allows letters, numbers and periods) or a three-letter Gmail username.

Signitize returns deliverable: false in all these cases, in the same call that checks for disposable domains and duplicate aliases:

{ "email": "[email protected]", "disposable": false, "deliverable": false }

Reject with a message that points at the fix:

This email address cannot receive mail. Please check it for typos.

What this layer does not catch: typo domains that exist and accept mail. Some common misspellings of big providers are registered by third parties and have mail servers, so they look deliverable. That is why layer 1 matters, and why layer 3 is still required.

Layer 3: the verification email​

Only a verification email proves that the mailbox exists and belongs to the person. It also catches username typos ([email protected]), which no check can recognize: the address is valid, it just belongs to someone else.

Make it easy to recover from a typo here too:

  • show the address on the "check your inbox" page, with a Change email link;
  • let users resend the email, with a short cooldown;
  • don't unlock free credits or trial perks until the link is clicked.

Why not ask mail servers if the mailbox exists?​

Some validators connect to the mail server and ask whether maria@ exists without sending a message. It looks attractive and works poorly at signup: Gmail, Outlook and Yahoo accept every address at that stage, many servers deliberately answer "yes" to everything, and servers that do this repeatedly get blocked. Signitize does not probe mailboxes; the verification email is the reliable test.

Summary​

  1. Suggest corrections in the browser for common provider typos.
  2. Reject addresses that can never receive mail on the server.
  3. Verify by email, and make changing the address easy.

Layer 2 takes one API call. Get a free API key (2,500 checks a month) and see the Quickstart.