Engineering17 min read

Real-Time Email Verification for Signup Forms

Use real-time email verification to block bad signups, reduce bounces, and protect sender reputation before emails enter your database.

B
The Bounceable Team
Laptop signup form with a magnifying glass checking an email address

Real-time email verification checks an address while the user is still in your signup flow. You use it to catch typos, fake addresses, disposable domains, and undeliverable mailboxes before they pollute your product, CRM, and email program.

What Real-Time Email Verification Means

Real-time email verification means you check an email address at the point of capture, before you rely on it.

For a signup form, that usually means you verify the address during form submission. In some flows, you also run a lighter check after the user leaves the email field. The goal is simple: decide whether the address is safe enough to accept, send to, or store as a new user identity.

A real-time email verification API can run several checks in one request:

  • Is the format valid?
  • Is the domain real?
  • Does the domain have mail servers?
  • Is the domain disposable?
  • Does the mailbox appear deliverable?
  • Is the address a role account like support@ or info@?
  • Is there a likely typo, such as gmial.com instead of gmail.com?
  • What is the overall bounce or fraud risk?

Real-time verification vs. batch cleaning

Batch cleaning happens after capture. You upload or process a list and remove bad addresses before a campaign, product email, or CRM sync.

Real-time verification happens before the address enters your system or before you trigger the first email.

Both have a place.

ApproachWhen it runsBest forMain limitation
Real-time verificationDuring signup or form submitSignup forms, lead forms, trials, waitlists, gated contentMust fit within UX and latency limits
Batch list cleaningAfter addresses are already storedLegacy lists, imports, inactive segments, CRM cleanupBad data may already have triggered automations or polluted reports

For signup form email verification, real-time usually gives you the highest leverage. You stop bad addresses before they become accounts, leads, trials, or lifecycle contacts.

Common use cases

You should consider real-time checks when an email address drives identity, access, billing, sales routing, or automation.

Common examples:

  • SaaS signup: verify email before signup completion or before sending the first confirmation email.
  • Free trials: reduce fake signups and disposable email abuse.
  • Lead forms: keep unreachable contacts out of your CRM.
  • Waitlists: avoid inflated demand numbers from fake addresses.
  • Gated content: block disposable email signups when you require a business or reachable email.
  • Partner portals: flag role accounts and risky domains before approval.

Why Verify Emails Before They Enter Your System

You verify emails before signup so bad addresses do not trigger bounces, fake accounts, broken onboarding, or wasted sales work.

The first email you send often matters. It may be a confirmation link, magic login link, trial activation message, or welcome email. If that email hard bounces, you already paid the cost. You also added a bad identity to your system.

Prevent hard bounces before your first send

A hard bounce tells mailbox providers that you tried to send to an address that does not exist or cannot receive mail. Occasional bounces happen. Persistent high bounce rates damage sender reputation.

A common operating target is to keep bounce rates below about 2%. Lower is better, especially for new domains, new IPs, or high-volume product mail.

Real-time verification helps you stop obvious failures before they hit your ESP or transactional email provider.

Reduce fake, disposable, and typo-based signups

Bad signups usually fall into a few buckets:

  • Typos: user@gmial.com, name@hotmial.com, person@yaho.com
  • Disposable addresses: burner inboxes created to bypass trials or access gated content
  • Fake domains: domains with no MX records or invalid DNS
  • Random strings: bot-generated addresses that pass basic regex checks
  • Unreachable mailboxes: valid-looking addresses that fail mailbox-level checks

Typos are worth special handling. A user who typed gmail.con probably wants to continue. Give them a quick fix, not a hard block.

Disposable addresses are different. If your product requires account recovery, billing notifications, compliance messages, or sales follow-up, a burner address is a risk.

Protect sender reputation and CRM quality

Your CRM, CDP, data warehouse, and lifecycle tools all depend on the email field. If you let bad addresses in, every downstream system inherits the mess.

That can cause:

  • Higher bounce rates
  • Lower activation reporting accuracy
  • Duplicate or fake accounts
  • Broken lead routing
  • Inflated trial counts
  • Sales reps working unreachable leads
  • Poor audience quality for remarketing and lifecycle automation

Real-time checks are cheaper than cleanup. They also produce cleaner analytics because you record rejection and risk reasons at capture time.

Checks to Run in Real Time

A good real-time workflow combines fast local checks with deeper server-side verification.

You do not need every check for every product. But you should understand each layer and decide how much confidence your signup flow needs.

Syntax and normalization

Start with syntax. This catches obvious input errors without an API call.

You should:

  • Trim leading and trailing spaces
  • Lowercase the domain part
  • Reject missing @
  • Reject invalid domain characters
  • Reject addresses that exceed length limits
  • Normalize Unicode domains when your stack supports it

Do not rely on a perfect regex. Email syntax has edge cases. For product signup, you usually want a practical parser that catches common mistakes and avoids rejecting valid addresses unnecessarily.

Typo detection and correction suggestions

Typo detection compares the submitted domain against common providers and known misspellings.

Examples:

  • gmial.com → gmail.com
  • hotnail.com → hotmail.com
  • outlok.com → outlook.com

Treat these as suggestions. The user may own a custom domain that looks similar to a major provider. Your UI should say, “Did you mean name@gmail.com?” rather than silently changing the address.

Domain and MX validation

Domain validation checks whether the domain exists. MX validation checks whether it has mail exchange records.

A domain without MX records may still receive mail through fallback A records, but most production systems treat missing MX as risky or undeliverable. Your verification provider should handle these details.

This check catches domains like:

  • example.invalid
  • expired domains
  • parked domains with no mail setup
  • typo domains with no DNS records

Disposable domain detection

Disposable domain detection identifies throwaway providers. These domains change constantly, so static lists age quickly.

If you need to block disposable email signups, use a provider that updates its list continuously. Also decide your policy by form type.

For example:

FlowDisposable policy
Public newsletterAllow or tag as low quality
Free SaaS trialBlock or require alternate email
Paid accountAllow if billing succeeds, but flag risk
Gated B2B contentBlock when business email is required
Community forumRate-limit or require confirmation

Disposable does not always mean malicious. But it often means you cannot rely on the inbox later.

SMTP deliverability probing

SMTP probing checks whether the receiving mail server appears willing to accept mail for the address.

This can improve confidence, but it is not perfect. Some servers use greylisting. Some block probes. Some accept all recipients. Some behave differently during real message delivery.

Use SMTP results as one signal in a broader verdict. Do not expose raw SMTP responses to users.

Catch-all and risky domain handling

A catch-all domain accepts mail for any local part. That means abc123@domain.com may appear valid even if no real person owns it.

For catch-all domains, mailbox-level certainty drops. A good verification service will flag catch-all behavior and may still run additional probing. Your app should usually treat these addresses as risky, not automatically invalid.

Risky does not mean blocked. It means you should decide what extra friction makes sense.

Role account detection and risk scoring

Role accounts include addresses like:

  • info@company.com
  • support@company.com
  • admin@company.com
  • sales@company.com
  • billing@company.com

They may be valid. They may also be shared, automated, or poor for user identity. If your product needs a person-level account, you may want to warn or require a personal work address.

Email risk scoring helps combine all checks into a simpler decision. Instead of wiring your app to every raw signal, you branch on a verdict such as:

  • deliverable
  • risky
  • undeliverable
  • unknown

That keeps your signup logic clear.

Where to Place Verification in the Signup Flow

Place formatting feedback in the client, but run authoritative signup verification on the server.

This gives users quick feedback while keeping your API keys, policy logic, and risk signals protected.

Client-side validation for immediate feedback

Use client-side validation for basic input quality:

  • Empty field
  • Missing @
  • Obvious invalid format
  • Spaces in the address
  • Confirm email fields that do not match, if you use them

Keep this fast and simple. Client-side validation improves email verification UX because users see fixable mistakes before submit.

But never trust it. Bots can bypass it. Users can disable JavaScript. Attackers can call your backend directly.

Server-side verification before account creation or email send

Run the real verification on your backend.

Good insertion points:

  1. User submits signup form.
  2. Backend normalizes the email.
  3. Backend calls the verification API.
  4. Backend applies your policy.
  5. Backend creates the account, blocks the request, or returns a safe user-facing message.
  6. Backend sends confirmation or welcome email only when policy allows.

For many apps, the best point is right before account creation. For others, you may create a limited pending account first, then require email confirmation before activation.

Progressive friction

Do not treat every non-perfect result the same.

Use progressive friction:

  • Deliverable: continue with no interruption.
  • Typo suspected: show a correction prompt.
  • Disposable: block when your policy requires durable email.
  • Undeliverable: ask for a different address.
  • Risky: allow signup but require confirmation before product access.
  • Unknown: allow or queue a fallback path, depending on your risk tolerance.

This keeps conversion healthy. You only add friction when the risk justifies it.

Avoid exposing sensitive details

Do not tell users, “SMTP rejected RCPT TO” or “this domain is catch-all with high fraud risk.”

That helps attackers tune their attempts.

Use safe messages:

  • “Please enter a valid email address.”
  • “We could not verify that inbox. Try another email.”
  • “Temporary email addresses are not allowed for this signup.”
  • “Did you mean name@gmail.com?”

Log the detailed reason internally. Show the user only what they need to fix the issue.

Handling Verdicts Without Hurting Conversion

Handle verification verdicts with policy, not panic.

If you block too much, you lose good users. If you allow everything, you defeat the point. The right behavior depends on your product, acquisition channel, and abuse profile.

Accept deliverable emails automatically

If the verdict is deliverable, let the user continue. Do not add extra prompts. Do not show “verified” banners unless they help the user.

You should still send a confirmation email when your product requires proof of inbox ownership. Verification tells you the address appears deliverable. It does not prove the user controls it.

Prompt users to fix typos

If the API returns a typo suggestion, make it a one-click correction.

Example copy:

Did you mean alex@gmail.com?

Buttons:

  • “Use suggested email”
  • “Keep what I entered”

If the original address also looks undeliverable, you can be stricter:

That email does not look reachable. Did you mean alex@gmail.com?

Block disposable or undeliverable addresses when policy requires it

For high-abuse flows, block disposable and undeliverable addresses before account creation.

Use direct copy:

  • “Temporary email addresses are not allowed. Use a permanent email address.”
  • “We could not verify that inbox. Enter a different email address.”

Avoid shaming language. Users may not know their company domain has a mail issue. Keep it factual.

Allow risky or unknown emails with extra confirmation steps

Risky and unknown results need nuance.

You can:

  • Create a pending account
  • Require email confirmation before access
  • Limit trial abuse-sensitive features
  • Add CAPTCHA or rate limiting
  • Route the signup for review
  • Tag the record for lifecycle suppression until confirmed

For B2B lead forms, you may accept risky emails but mark them as lower confidence in the CRM. For product accounts, you may require confirmation before the user can invite teammates or start sending messages.

Log decisions for analytics and support

Store the verification outcome with the signup attempt.

Useful fields:

  • Normalized email domain
  • Verdict
  • Risk score or risk band
  • Disposable flag
  • Catch-all flag
  • Role account flag
  • Typo suggestion shown
  • Final policy decision
  • User-facing message code
  • Timestamp
  • Request ID from your verification provider, if available

Do not store unnecessary raw SMTP transcripts or sensitive diagnostics unless you have a clear need and retention policy.

API Design Considerations for Developers

Design the integration so verification failures do not become signup outages.

A real-time email verification API sits in your critical path. Treat it like any other dependency: set timeouts, handle errors, cache safely, and decide fallback behavior.

Latency budgets and async fallbacks

Your signup flow should feel responsive. Set a clear latency budget for verification, often in the low hundreds of milliseconds to a couple of seconds depending on your market and form type.

If verification exceeds your timeout, choose a fallback:

  • Fail open and require email confirmation
  • Create a pending account and verify asynchronously
  • Ask the user to try again
  • Queue manual review for high-value forms

Do not let a slow dependency hang the form indefinitely.

Fail-open versus fail-closed

Your fallback should match the risk of the flow.

ScenarioSuggested fallback
Low-risk newsletter signupFail open, tag as unverified
Public free trial with abusePending account, require confirmation
Invite-only productFail closed or manual review
Paid checkoutAllow if payment succeeds, verify before marketing sends
Internal admin provisioningFail closed

Fail-open protects conversion. Fail-closed protects quality. Most signup forms need something in between.

Caching results and recheck windows

Cache verification results to reduce latency and API calls. But do not cache forever.

Email deliverability changes. Domains expire. Mailboxes get disabled. Disposable domain lists update.

Practical approach:

  • Cache clean deliverable results for a short to moderate window.
  • Recheck risky, unknown, and disposable results sooner.
  • Recheck before major campaigns or reactivation sends.
  • Recheck when an address bounces.

Hash emails at rest where possible. At minimum, protect verification logs like other user data.

Rate limits, retries, and timeout handling

Implement predictable request behavior:

  • Use a short timeout.
  • Retry only on transient errors.
  • Add jitter to retries.
  • Do not retry validation failures.
  • Return stable error messages to the frontend.
  • Monitor provider errors separately from user input errors.

If a user submits the same email multiple times, debounce on the frontend and deduplicate on the backend.

Protect API keys

Never call a secret-backed verification API directly from browser code. Users can inspect the request and steal the key.

Instead:

  1. Browser submits the form to your backend.
  2. Backend calls the verification provider.
  3. Backend applies policy.
  4. Backend returns a safe decision to the browser.

If you need instant field-level checks, create your own backend endpoint with authentication, rate limiting, abuse controls, and minimal response details.

Example Verification Logic

A clean email verification workflow branches on verdict, risk signals, and your product policy.

Here is illustrative TypeScript-style pseudocode. The API shape is generic. Adapt it to your provider and framework.

type Verdict = "deliverable" | "risky" | "undeliverable" | "unknown";

async function handleSignup(input: SignupInput) {
  const email = normalizeEmail(input.email);

  const basicError = validateBasicEmail(email);
  if (basicError) {
    return formError("email", "Enter a valid email address.");
  }

  const verification = await verifyEmailWithTimeout(email, {
    timeoutMs: 1500
  });

  if (verification.status === "timeout" || verification.status === "provider_error") {
    // Do not block all signups because a dependency is slow.
    return createPendingAccount(input, {
      email,
      emailVerificationState: "needs_confirmation",
      reason: "verification_unavailable"
    });
  }

  if (verification.typoSuggestion) {
    return formPrompt("email_suggestion", {
      message: `Did you mean ${verification.typoSuggestion}?`,
      suggestedEmail: verification.typoSuggestion
    });
  }

  if (verification.disposable) {
    return formError(
      "email",
      "Temporary email addresses are not allowed. Use a permanent email address."
    );
  }

  switch (verification.verdict as Verdict) {
    case "deliverable":
      return createAccountAndSendConfirmation(input, email);

    case "risky":
      return createPendingAccount(input, {
        email,
        emailVerificationState: "needs_confirmation",
        reason: verification.catchAll ? "catch_all_domain" : "risky_email"
      });

    case "undeliverable":
      return formError(
        "email",
        "We could not verify that inbox. Enter a different email address."
      );

    case "unknown":
      return createPendingAccount(input, {
        email,
        emailVerificationState: "needs_confirmation",
        reason: "unknown_deliverability"
      });
  }
}

A typical normalized verification response might look like this:

{
  "email": "alex@gmail.com",
  "verdict": "deliverable",
  "risk_score": 0.08,
  "disposable": false,
  "role": false,
  "free_provider": true,
  "catch_all": false,
  "typo_suggestion": null
}

For a typo, you might receive:

{
  "email": "alex@gmial.com",
  "verdict": "undeliverable",
  "risk_score": 0.91,
  "disposable": false,
  "typo_suggestion": "alex@gmail.com"
}

For a disposable signup attempt:

{
  "email": "trial-user@temporary-example.test",
  "verdict": "risky",
  "risk_score": 0.87,
  "disposable": true,
  "typo_suggestion": null
}

The important part is not the exact schema. It is the policy boundary. Your backend should translate verification signals into a small set of product decisions.

Metrics to Track After Launch

Track conversion and quality together, or you will optimize the wrong thing.

Real-time verification should reduce fake signups and bounces without creating unnecessary friction for good users. You need both sides of the picture.

Form completion rate

Watch the percentage of users who start and finish the form.

Segment by:

  • Verification verdict
  • Device type
  • Country or region
  • Acquisition source
  • New versus returning users
  • Form version

If completion drops sharply after launch, inspect your messages and block rules. You may be too strict on unknown or catch-all domains.

Invalid email capture rate

Measure how many submitted emails fail verification. This tells you how much bad input your form receives.

Break it down by reason:

  • Syntax invalid
  • Domain invalid
  • No MX
  • Undeliverable mailbox
  • Typo suspected
  • Disposable domain
  • Risky catch-all
  • Unknown result

This helps you tune UX. A high typo rate may mean mobile users struggle with your form. A high disposable rate may point to trial abuse.

Disposable email attempts

Track disposable attempts as its own metric.

Look at:

  • Source campaign
  • Referrer
  • IP reputation signals
  • Account creation attempts per device
  • Trial activation rate
  • Upgrade rate

You may find that some channels send many disposable users but few real customers.

Welcome email bounce rate

This is one of the clearest quality metrics.

After launch, compare bounce rates before and after verification. Segment by transactional stream if possible:

  • Confirmation emails
  • Welcome emails
  • Magic links
  • Trial onboarding
  • Sales handoff emails

If bounces remain high, check whether you fail open too often or allow risky addresses without confirmation.

Confirmation email success rate

Track whether users receive and click confirmation emails.

Useful measures:

  • Confirmation email delivered
  • Confirmation link clicked
  • Time to confirmation
  • Resend requests
  • Confirmation failures by verdict

Risky or unknown addresses should show lower confirmation rates. If deliverable addresses also underperform, investigate email content, authentication, sending domain reputation, or inbox placement.

Verification changes user behavior. Support may see new ticket types.

Watch for:

  • Users blocked by company domains
  • Valid users rejected as disposable
  • Typo correction confusion
  • Confirmation emails not received
  • Shared inbox or role account complaints

Feed these cases back into your policy. Allowlist known customer domains when appropriate. Adjust copy when users misunderstand the action they need to take.

Using Bounceable for Real-Time Verification

Bounceable gives you the core signals you need to verify emails during signup without building the mail-checking stack yourself.

You can use Bounceable as a real-time email verification API from your backend. It returns deliverability verdicts such as deliverable, risky, undeliverable, and unknown, plus signals you can use in signup policy.

For developer-focused signup flows, the useful pieces are:

  • REST API: call verification from your server during form submission.
  • Disposable detection: catch burner domains from a constantly updated domain list.
  • Catch-all handling: identify domains that accept any address and probe the mailbox over SMTP.
  • Deliverability verdicts: branch your workflow without wiring product logic to every raw check.
  • Typo suggestions: help users fix common provider misspellings.
  • Risk scoring: apply progressive friction instead of a simple pass/fail.
  • Role and free provider detection: tag addresses for lifecycle, RevOps, or account policy.
  • Integrations: connect verification through Zapier, Pipedream, or Apify when you do not want to write a custom integration.

A good rollout plan is simple:

  1. Add server-side verification to one signup form.
  2. Start in observe-only mode for a few days.
  3. Log verdicts and suggested decisions, but do not block.
  4. Review false positives, disposable attempts, and bounce rates.
  5. Turn on typo prompts.
  6. Block only the categories your policy clearly requires.
  7. Add pending-account handling for risky and unknown results.
  8. Recheck metrics weekly until behavior stabilizes.

Start with the free tier. Test your actual signup traffic. No credit card is required.

Catch bad addresses before they bounce.
Verify your list free

Frequently asked questions

Keep reading