Growth & Marketing16 min read

Account Verification Flow: Reduce Fake Signups

Design an account verification flow that blocks fake signups, catches risky emails, and keeps legitimate users moving through onboarding.

B
The Bounceable Team
Signup gate filtering fake accounts from valid email signups

A good account verification flow stops bad signups before they pollute your product, CRM, and email program. It also lets real users get started without turning signup into an obstacle course.

What an account verification flow should accomplish

An account verification flow should prove email ownership, reduce signup abuse, protect deliverability, and keep friction low for legitimate users.

You are not just checking a box. You are deciding who can enter your product, how much access they get, and whether your sending reputation takes unnecessary damage.

Confirm the user controls the email address

The core job is simple: confirm that the person signing up can receive email at that address.

That matters because the email address often becomes:

  • The login identifier.
  • The password reset destination.
  • The billing contact.
  • The lifecycle messaging channel.
  • The account recovery path.

If you skip ownership verification, anyone can create an account using someone else’s address. That creates support tickets, complaint risk, and trust issues.

A standard post-submit confirmation link still works well. The user enters an email address. You send an account verification email. They click a signed, time-limited link. You mark the account as verified.

Reduce fake accounts, bots, and disposable email signups

Signup forms attract noise. Some of it is harmless. Some of it is expensive.

Common patterns include:

  • Bot-created accounts.
  • Free-trial abuse.
  • Promo abuse.
  • Marketplace spam.
  • Fake leads sent into sales tools.
  • Disposable email signups used to avoid accountability.

Your flow should catch obvious abuse before it reaches your database or sending system. Disposable email detection is especially useful here. Burner domains exist to receive one message and disappear. They rarely belong in a healthy product account base.

Protect sender reputation by avoiding bad addresses

Every confirmation email you send can help or hurt your reputation.

If you send to invalid addresses, you generate bounces. If you send to people who did not sign up, you generate complaints. If you send repeated verification messages to dead mailboxes, you train mailbox providers to distrust your mail.

<2%common bounce-rate target for healthy email programs

You do not need perfection. You do need control. Keep confirmation email bounces low. Avoid sending to addresses that are clearly undeliverable. Watch for sudden spikes by source, campaign, partner, or geography.

Minimize friction for legitimate users

Security that blocks good users will get bypassed, ignored, or removed.

Your signup verification should be quiet when the email looks good. Fix obvious typos inline. Explain blocks clearly. Let users correct mistakes without restarting the form.

The best email verification flow feels like this:

  1. The user types an address.
  2. You catch obvious errors immediately.
  3. You send one clean verification email.
  4. The user clicks.
  5. They continue where they left off.

Where to verify the email address in signup

You should verify email quality before form submission and verify email ownership after submission.

Those are different checks. Do both.

Pre-submit checks for syntax, typos, disposable domains, and domain risk

Pre-submit checks happen while the user is still on the signup form.

Run these before you create a full account or send mail:

  • Syntax validation.
  • Domain format validation.
  • MX record lookup.
  • Disposable domain detection.
  • Email typo correction.
  • Domain risk checks.
  • Basic role account detection.

This is where you catch name@gmial.com and suggest name@gmail.com. It is also where you block user@temporary-mail-example.com before it enters your funnel.

Do not rely only on frontend validation. JavaScript helps the user. Server-side verification protects your system.

Post-submit confirmation email for ownership verification

Post-submit verification confirms control.

After the address passes your quality rules, create the user record and send a confirmation email. Keep the message short. Make the button obvious. Avoid adding marketing content.

A simple flow:

  1. User submits signup form.
  2. Your server verifies the email address.
  3. If acceptable, create an unverified account.
  4. Send the account verification email.
  5. User clicks the link.
  6. Your server validates the token.
  7. Mark the user as verified.

When to block immediately versus allow with limited access

Not every bad-looking address deserves the same response.

Use a verdict-based approach:

Email resultExampleRecommended action
DeliverableValid mailbox on a normal domainSend verification email and allow normal onboarding
Typo detectedalex@gmial.comShow suggested correction before submit
DisposableBurner domainBlock or require a permanent email
UndeliverableNo MX or rejected mailboxBlock and ask for a different address
RiskyCatch-all domain or uncertain SMTP resultAllow limited access and require verification
UnknownMail server timeout or greylistingAllow limited access, retry verification, monitor bounces
Role accountinfo@company.comAllow, warn, or route based on product type

Treat verification as a policy layer, not a single yes/no check. Store the reason behind each decision so support and fraud teams can understand what happened.

How to handle B2B, PLG, marketplace, and free-trial flows differently

Your signup context changes the rules.

B2B SaaS: Work domains matter. You may allow role accounts for team inboxes, but you may want to flag free providers for sales routing.

PLG products: Conversion matters. Let users explore with limited access while waiting for verification. Gate collaboration, exports, sending, or publishing until verified.

Marketplaces: Trust and safety matter. Verify before messaging, listing, booking, or payouts.

Free trials: Abuse matters. Block disposable domains. Step-up verify risky email address results before provisioning costly resources.

Email checks to run before sending a confirmation email

Before you send a confirmation email, check whether the address is likely real, reachable, and acceptable for your product.

This is where real-time email verification for signups saves you from sending to bad addresses in the first place.

Syntax and MX checks

Start with basics.

Syntax checks catch malformed input:

  • Missing @.
  • Invalid characters.
  • Missing domain.
  • Invalid top-level domain format.
  • Spaces or pasted junk.

MX checks confirm that the domain has mail exchange records. If a domain cannot receive mail, do not send a confirmation email.

Syntax alone is not enough. asdf123@gmail.com has valid syntax. It may still be fake, abandoned, or undeliverable.

Disposable or throwaway domain detection

Disposable email detection catches domains built for temporary inboxes.

You should usually block these at signup, especially for:

  • Free trials.
  • Coupon offers.
  • Community accounts.
  • Marketplaces.
  • Products with usage costs.
  • Referral programs.
  • Lead forms feeding sales teams.

Keep the message direct:

Please use a permanent email address. Temporary email addresses are not supported.

Avoid accusing the user of fraud. Just explain the requirement.

Role account detection such as info@ or support@

Role accounts are shared inboxes like:

  • info@
  • support@
  • sales@
  • admin@
  • billing@
  • help@

They are not always bad. In B2B, they may be legitimate. In consumer products, they may be suspicious or hard to associate with one person.

Use them as a signal, not an automatic block.

Good policy options:

  • Allow role accounts for company workspaces.
  • Block role accounts for personal identity products.
  • Require extra verification for financial or marketplace actions.
  • Route role-account leads differently in your CRM.

Catch-all and SMTP mailbox probing

Catch-all domains accept mail for any local part. That means real@company.com and not-a-person-123@company.com may both appear accepted at the domain level.

Catch-all detection helps you avoid false confidence.

SMTP probing can check whether the mailbox appears deliverable without sending a message. Some servers provide clear answers. Others hide the result, throttle checks, or return temporary failures.

That is why you should treat catch-all and SMTP results as risk signals. Not every uncertain result is bad. But you should not treat it the same as a confirmed deliverable mailbox.

Typo suggestions like gmial.com to gmail.com

Email typo correction improves conversion and deliverability at the same time.

Common examples:

  • gmial.comgmail.com
  • gamil.comgmail.com
  • hotnail.comhotmail.com
  • yaho.comyahoo.com
  • outlok.comoutlook.com

Show the suggestion before submit:

Did you mean alex@gmail.com?

Let the user accept the fix with one click. Do not silently rewrite the address. Silent correction can create account access issues.

Risk scoring and verdict-based rules

A practical verification API should return a verdict and the reasons behind it.

For example, a response might look like this:

{
  "email": "alex@gmial.com",
  "verdict": "risky",
  "risk_score": 72,
  "checks": {
    "syntax": "valid",
    "mx": "valid",
    "disposable": false,
    "role": false,
    "catch_all": false,
    "smtp": "unknown"
  },
  "suggestion": "alex@gmail.com",
  "reasons": ["possible_typo", "smtp_unknown"]
}

With Bounceable, you can run these checks in real time and use the verdict to decide whether to block, allow, or step up verification. The important part is not the tool name. It is the policy you enforce from the result.

How to design verification states and user access

Design verification states as part of your account model, not as a temporary signup flag.

If verification status lives only in a one-off token table, your product will drift. Support will not know who is verified. Growth teams will not know which users failed. Fraud teams will not know which accounts look risky.

Unverified, verified, risky, and blocked states

Use clear states.

A simple model:

StateMeaningAccess
UnverifiedEmail accepted, ownership not confirmedLimited
VerifiedUser clicked a valid verification linkNormal
RiskyEmail has concerning signalsLimited or step-up required
BlockedEmail is not acceptableNo account or no progression

Store supporting fields too:

  • Verification timestamp.
  • Verification email sent timestamp.
  • Last resend timestamp.
  • Verification token expiry.
  • Risk verdict.
  • Risk reasons.
  • Source or campaign.
  • IP and user agent, if allowed by your privacy policy.

Limited-access onboarding before verification

Limited access reduces friction without giving away the store.

You can let unverified users:

  • Complete profile setup.
  • View a demo workspace.
  • Configure preferences.
  • Invite no one yet.
  • Save draft content.
  • Explore read-only product areas.

Gate actions with higher abuse or security risk:

  • Sending messages.
  • Publishing content.
  • Exporting data.
  • Inviting team members.
  • Creating API keys.
  • Starting paid usage.
  • Accessing marketplace communication.
  • Redeeming promotions.

This keeps signup smooth while protecting the parts attackers want.

Verification links should expire.

Common windows range from 15 minutes to 24 hours, depending on risk and user context. Shorter windows work for sensitive products. Longer windows work for lower-risk SaaS onboarding.

Use signed, single-use tokens. Invalidate old tokens when you send a new verification email. Do not expose raw user IDs or predictable values in the link.

How many resend attempts to allow

Allow resends, but cap them.

A reasonable pattern:

  • Allow one immediate resend after a short delay.
  • Then require a cooldown.
  • Limit total resends per account and per IP.
  • Show the last destination address in masked form.
  • Let the user edit the email address if they made a typo.

Example message:

We sent a verification link to a***@example.com. You can request another email in 60 seconds.

How to prevent resend abuse

Resend endpoints are easy to abuse because they send email.

Protect them with:

  • Per-account rate limits.
  • Per-IP rate limits.
  • CAPTCHA or challenge after repeated attempts.
  • Device or session checks.
  • Suppression after hard bounces.
  • Monitoring for repeated sends to the same domain.
  • Backoff after mailbox provider throttling.

Do not keep sending verification messages to an address that already bounced hard.

What to do with risky or disposable emails

You should block obvious disposable emails and apply step-up controls to uncertain addresses.

This is where your policy needs to be explicit. If you leave it vague, every team will handle edge cases differently.

Hard block obvious disposable domains

Disposable domains are usually not worth accepting.

A hard block is appropriate when:

  • The domain is known disposable.
  • The address is malformed.
  • The domain has no valid mail records.
  • The mailbox is confirmed undeliverable.
  • The same user or IP cycles through many burner domains.

Keep the UX calm:

Temporary email addresses are not supported. Please use a permanent email address.

Soft block or step-up verify catch-all and unknown addresses

Catch-all and unknown results need more nuance.

You can:

  • Allow the account but keep it unverified.
  • Require email click before product access.
  • Require SSO for company domains.
  • Ask for a second factor.
  • Route the signup to manual review.
  • Delay provisioning of costly resources.
  • Suppress nonessential lifecycle email until verified.

This protects conversion when mail servers are ambiguous.

Show clear user-facing error messages

Bad error messages create support tickets.

Avoid this:

Invalid email.

Use this instead:

We could not verify that this email can receive messages. Please check for typos or use another address.

For typos:

Did you mean alex@gmail.com?

For blocked disposable domains:

Please use a permanent email address. Temporary inboxes are not supported.

For resend throttles:

You requested several verification emails. Please wait a few minutes before trying again.

Log risk reasons for support and fraud review

Support needs to know why someone was blocked.

Log structured reasons like:

  • disposable_domain
  • invalid_mx
  • mailbox_undeliverable
  • possible_typo
  • catch_all_domain
  • smtp_timeout
  • role_account
  • resend_rate_limited

This lets your team distinguish a real false positive from obvious abuse. It also helps you tune rules over time.

Deliverability best practices for verification emails

Verification emails are transactional mail, and you should treat them like production infrastructure.

If users cannot receive the message, they cannot activate. If mailbox providers distrust the message, your signup funnel leaks.

Use a dedicated transactional sending stream

Send verification email from a transactional stream, not your marketing platform.

Use a stable From domain and From address. Keep the sending pattern consistent. Do not mix promotional campaigns with verification messages on the same stream if you can avoid it.

A common pattern:

  • Marketing: news.example.com
  • Transactional: mail.example.com
  • From address: no-reply@mail.example.com or accounts@example.com

Set up SPF, DKIM, and DMARC

Authentication is not optional.

Set up:

  • SPF to authorize your sending provider.
  • DKIM to sign messages.
  • DMARC to tell receivers how to handle unauthenticated mail.

Also align your visible From domain with your authenticated domain. Misalignment can hurt trust, especially at large mailbox providers.

Keep the message short and action-focused

A strong account verification email has one job.

Include:

  • Product or company name.
  • Short explanation.
  • One primary button or link.
  • Expiry note.
  • Support path if the user did not sign up.

Example structure:

Confirm your email address

Click the link below to finish creating your account.

Verify email

This link expires in 30 minutes.
If you did not request this, you can ignore this message.

Do not turn a verification message into a newsletter.

Avoid:

  • Multiple promotional links.
  • Coupon language.
  • Large images.
  • Link shorteners.
  • Attachments.
  • Misleading subject lines.
  • Overly excited punctuation.

Use a plain subject line:

  • Verify your email address
  • Confirm your account
  • Finish setting up your account

Monitor confirmation email bounces and complaints

Track deliverability for the verification stream separately.

Watch:

  • Hard bounces.
  • Soft bounces.
  • Deferrals.
  • Spam complaints.
  • Blocks by domain.
  • Delivery latency.
  • Click-through to verification.
  • Resend volume.

If bounces spike, check recent signup sources first. A new paid campaign, affiliate, integration, or bot attack often shows up there before it shows up anywhere else.

Metrics to track after launch

Track verification quality, user friction, and downstream business impact.

Do not stop at “emails sent” and “emails clicked.” Those are useful, but incomplete.

Verification completion rate

This is the share of started signups that become verified accounts.

Segment it by:

  • Signup source.
  • Device.
  • Country.
  • Domain type.
  • Email verdict.
  • Free provider versus business domain.
  • New versus returning user.

A sudden drop may mean delivery problems, broken links, confusing UX, or over-aggressive blocking.

Disposable signup rate

Track the percentage of signup attempts using disposable domains.

Segment by:

  • Campaign.
  • Referrer.
  • IP range.
  • Promo code.
  • Affiliate partner.
  • Trial plan.
  • Geography.

A high disposable signup rate often points to incentive abuse or low-quality acquisition.

Bounce rate on confirmation emails

This is one of the cleanest indicators of email quality at the front door.

If your confirmation email bounce rate rises, your pre-send checks are missing bad addresses or one source is sending junk traffic.

Resend rate

A high resend rate can mean:

  • The message went to spam.
  • Delivery is slow.
  • The user mistyped their address.
  • The UI did not make the next step clear.
  • Bots are abusing the resend endpoint.

Look at resend rate by domain. If one mailbox provider stands out, investigate delivery to that provider.

Time to verify

Measure the time between signup and successful verification.

Short time-to-verify usually means the message arrived quickly and the user understood the action. Long delays may point to inbox placement issues or unclear onboarding.

False positive support tickets

Track users who were blocked but later proved legitimate.

Use this to tune rules. For example, you may decide to stop blocking some role accounts in B2B flows, or to allow certain catch-all domains with limited access.

Activation and retention by verification status

Compare outcomes for:

  • Verified users.
  • Unverified users.
  • Risky users.
  • Users who corrected a typo.
  • Users who were allowed after an unknown result.
  • Users blocked for disposable domains.

This tells you whether your signup verification policy improves the business, not just the form.

Implementation checklist

Build the flow as a set of clear decisions, stored signals, and abuse controls.

Here is a practical checklist you can use before launch.

Add real-time email verification at signup

Run server-side checks before sending the confirmation email.

At minimum, check:

  • Syntax.
  • MX records.
  • Disposable domain.
  • Typo suggestion.
  • Role account.
  • Catch-all status.
  • SMTP result when available.
  • Risk verdict.

A simple API call may look like this:

curl -X POST "https://api.example.com/verify-email" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email":"alex@gmial.com"}'

Use the response to drive policy. Do not send confirmation emails to addresses you already know cannot receive them.

Store verification status and risk signals

Persist the decision.

Store:

  • Email address.
  • Normalized email.
  • Verification state.
  • Risk verdict.
  • Risk score, if used.
  • Risk reasons.
  • Suggested correction.
  • Verification timestamps.
  • Send and resend counts.
  • Bounce status.

This makes the system auditable and easier to debug.

Trigger confirmation email only for acceptable addresses

Create rules before you launch.

For example:

ConditionAction
DeliverableSend verification email
Typo suggestionAsk user to confirm or edit
DisposableBlock
UndeliverableBlock
Risky catch-allSend verification email, limit access
Unknown SMTPSend once, monitor bounce, limit access
Role accountApply product-specific rule

Bounceable can help here by returning deliverability verdicts, disposable domain signals, catch-all flags, role account detection, and typo suggestions in one real-time check.

Apply rate limits and abuse controls

Protect every endpoint in the flow:

  • Signup submit.
  • Email verification check.
  • Confirmation email send.
  • Resend verification email.
  • Verification link click.
  • Email address change.

Use layered limits by account, IP, email, domain, device, and session. Add stronger controls when patterns look automated.

Review risky patterns weekly

Do not set the policy once and forget it.

Review:

  • Top blocked domains.
  • Top disposable domains.
  • Sources with high risky rates.
  • Confirmation bounce spikes.
  • False positive tickets.
  • Domains with repeated unknown results.
  • Resend abuse patterns.
  • Activation by verification status.

Then tune. Tighten rules where abuse is obvious. Loosen rules where good users get caught.

Catch bad addresses before they bounce.
Verify your list free

Frequently asked questions

Keep reading