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.

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.
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:
- The user types an address.
- You catch obvious errors immediately.
- You send one clean verification email.
- The user clicks.
- 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:
- User submits signup form.
- Your server verifies the email address.
- If acceptable, create an unverified account.
- Send the account verification email.
- User clicks the link.
- Your server validates the token.
- 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 result | Example | Recommended action |
|---|---|---|
| Deliverable | Valid mailbox on a normal domain | Send verification email and allow normal onboarding |
| Typo detected | alex@gmial.com | Show suggested correction before submit |
| Disposable | Burner domain | Block or require a permanent email |
| Undeliverable | No MX or rejected mailbox | Block and ask for a different address |
| Risky | Catch-all domain or uncertain SMTP result | Allow limited access and require verification |
| Unknown | Mail server timeout or greylisting | Allow limited access, retry verification, monitor bounces |
| Role account | info@company.com | Allow, 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.com→gmail.comgamil.com→gmail.comhotnail.com→hotmail.comyaho.com→yahoo.comoutlok.com→outlook.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:
| State | Meaning | Access |
|---|---|---|
| Unverified | Email accepted, ownership not confirmed | Limited |
| Verified | User clicked a valid verification link | Normal |
| Risky | Email has concerning signals | Limited or step-up required |
| Blocked | Email is not acceptable | No 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.
When to expire verification links
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_domaininvalid_mxmailbox_undeliverablepossible_typocatch_all_domainsmtp_timeoutrole_accountresend_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.comoraccounts@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.
Avoid spammy wording and excessive links
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 addressConfirm your accountFinish 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:
| Condition | Action |
|---|---|
| Deliverable | Send verification email |
| Typo suggestion | Ask user to confirm or edit |
| Disposable | Block |
| Undeliverable | Block |
| Risky catch-all | Send verification email, limit access |
| Unknown SMTP | Send once, monitor bounce, limit access |
| Role account | Apply 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.


