How to Prevent SaaS Free Trial Abuse with Email Verification
The math on free trial abuse is straightforward and unpleasant. If your trial gives users 14 days of access, and creating a new account takes 60 seconds, a motivated person can run indefinite free access by cycling through disposable email addresses. Your product analytics show thousands of trial signups and a conversion rate that looks terrible. Your infrastructure runs hot serving accounts that will never pay. Your sales team wastes cycles chasing leads that resolve to temp inboxes that expired three weeks ago.
This is not a fringe problem. Research from the fraud prevention space finds that roughly a third of freemium accounts use disposable email domains - not curious users kicking the tires, but deliberate abusers systematically avoiding payment.
Email verification at signup is the fastest and cheapest fix. Not the OTP email confirmation that confirms the user can receive email - that is a separate and complementary check. This is SMTP-level verification that happens before the account is even created, blocking addresses from known disposable services, detecting gibberish patterns, and flagging role accounts and alias tricks before they pollute your user database.
How Trial Abusers Exploit Signup Flows
Understanding the attack patterns helps you design a better defense. Trial abusers use several approaches, roughly in order of sophistication:
Disposable email services. Services like Mailinator, 10MinuteMail, Guerrilla Mail, and dozens of others provide temporary inboxes that receive email long enough to click a verification link, then expire. A database of known disposable email domains can block these, but new services launch constantly. An API that maintains an up-to-date blocklist handles this far better than a static list you update manually.
Free webmail accounts. Creating a new Gmail, Outlook, or Yahoo account is free and takes about two minutes. It creates a "real" email that passes most verification checks - not disposable, not gibberish, technically valid. The right response here is not to block all free webmail (that would prevent most legitimate signups), but to be aware that a high ratio of free webmail accounts in your trial base is a signal worth monitoring, especially if conversion rates from those accounts are poor.
Gmail plus-addressing. Gmail (and several other providers) allows users to add a + suffix to their address: user+trial1@gmail.com, user+trial2@gmail.com, and so on. All of these deliver to the same inbox. If your uniqueness constraint checks the full address string, a single Gmail user can create unlimited accounts by varying the suffix.
Privacy relay services. Apple's Hide My Email, SimpleLogin, Firefox Relay, and similar tools generate unique forwarding addresses that all route to a single real inbox. These are legitimate privacy tools used by real users who do not want to share their actual email - but they are also used to create multiple trial accounts.
What Email Verification Catches (and What It Doesn't)
The Bulk Email Checker API verifies addresses through several layers. For trial abuse prevention, the most relevant response fields are:
isDisposable: true- The domain or service is a known temporary email provider. Hard block this at signup.isGibberish: true- The local part of the address (before the @) matches patterns associated with random character generation. Bot-created accounts almost always have gibberish local parts.status: "failed"- The mailbox does not exist on the domain's mail server. Blocks mistyped addresses and most fake-but-formatted addresses.isRoleAccount: true- The address is a shared role inbox (info@, admin@, support@). For SaaS signups, these rarely convert to paying users and are worth flagging.isFreeService: true- The address is from a free email provider like Gmail, Yahoo, or Outlook. Useful as a data point for trial policy decisions, not necessarily for blocking.
What it does not catch automatically: Gmail plus-address aliases (all pass as valid), privacy relay services (many pass as valid), and freshly created accounts on legitimate providers. These require additional logic on your end, which the next sections cover.
The Plus-Addressing Problem
Plus-addressing (also called subaddressing) is the biggest email trick SaaS abusers use that basic verification does not stop. The API sees user+trial2@gmail.com as a valid address - because technically it is. Gmail delivers it to the same inbox as user@gmail.com.
The fix is to normalize email addresses on your backend before checking uniqueness. Strip the plus suffix and any dots in the local part (Gmail ignores dots too) before comparing against existing accounts:
"An account with this email already exists."];
}
Signup Verification: API Implementation
Here is a complete signup verification function for a SaaS application. It combines the Bulk Email Checker API call with the plus-address normalization check, returning a structured decision for your signup controller:
BEC_API_KEY,
"email" => $email,
]);
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 8,
CURLOPT_SSL_VERIFYPEER => true,
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// API unavailable - fail open, allow signup, flag for review
if ($httpCode !== 200 || $response === false) {
return [
"allowed" => true,
"reason" => "api_unavailable",
"risk_score" => 50, // Unknown risk - flag for manual review
];
}
$r = json_decode($response, true);
if (!$r) {
return ["allowed" => true, "reason" => "parse_error", "risk_score" => 50];
}
$status = $r["status"] ?? "unknown";
// --- Hard blocks (reject signup) ---
if (!empty($r["isDisposable"])) {
return [
"allowed" => false,
"reason" => "disposable_email",
"risk_score" => 100,
"message" => "Disposable email addresses are not permitted for free trials. Please use your work or personal email.",
];
}
if (!empty($r["isGibberish"])) {
return [
"allowed" => false,
"reason" => "gibberish_email",
"risk_score" => 95,
"message" => "That email address doesn't look right. Please use a valid email to sign up.",
];
}
if ($status === "failed") {
$suggested = $r["emailSuggested"] ?? null;
return [
"allowed" => false,
"reason" => "invalid_mailbox",
"risk_score" => 90,
"message" => $suggested
? "That email address appears to be invalid. Did you mean $suggested?"
: "That email address could not be verified. Please check it and try again.",
];
}
// --- Soft flags (allow but track) ---
$riskScore = 0;
$flags = [];
if (!empty($r["isRoleAccount"])) {
$riskScore += 30;
$flags[] = "role_account";
}
if (!empty($r["isFreeService"])) {
$riskScore += 10; // Minor signal; many real users have Gmail
$flags[] = "free_service";
}
if ($status === "unknown") {
$riskScore += 15; // Catch-all domain
$flags[] = "catchall_domain";
}
// Check for plus-addressing (not blocked, but tracked)
[$local] = explode("@", strtolower($email));
if (strpos($local, "+") !== false) {
$riskScore += 40;
$flags[] = "plus_address";
}
return [
"allowed" => true,
"reason" => "passed",
"risk_score" => min($riskScore, 100),
"flags" => $flags,
"api_result" => $r,
];
}
// --- Usage in signup controller ---
$email = trim($_POST["email"] ?? "");
$result = saas_verify_signup_email($email);
if (!$result["allowed"]) {
// Return 422 with the user-facing message
http_response_code(422);
echo json_encode(["error" => $result["message"]]);
exit;
}
// Create the account, but store risk metadata
$riskScore = $result["risk_score"];
$flags = implode(",", $result["flags"] ?? []);
// Store in your users table:
// INSERT INTO users (email, email_risk_score, email_flags, ...) VALUES (?, ?, ?, ...)
Policy Decisions: What to Block vs. What to Allow
Not every SaaS product should use the same blocking policy. The right thresholds depend on your growth model.
Product-led growth, self-serve signups: Block disposable and gibberish only. Allow free webmail, allow catch-all, allow role accounts with a flag. Your growth depends on low friction - any over-blocking hurts conversion more than it saves infrastructure.
High-value B2B SaaS, sales-assisted trials: Block disposable, gibberish, and failed. Flag free webmail as lower-priority leads. Require work email if you want to enforce it - but accept that you will lose some genuine users who prefer Gmail for trial signups.
Infrastructure or API products with meaningful cost per trial user: Block disposable, gibberish, failed, and consider blocking role accounts. Require work email explicitly. Your cost of serving a trial user is real, so the threshold for what counts as "legitimate" can be tighter.
Layering Verification With Other Signals
Email verification alone does not catch every abuser. Sophisticated users create legitimate-looking accounts on real email domains. A layered approach combines email quality signals with behavioral signals:
Email verification (first gate): Block disposable, gibberish, and invalid addresses at signup. Store risk score and flags for all accounts.
Email confirmation (second gate): Send a confirmation link or OTP that the user must click to activate the trial. This confirms they can receive email at the address they provided. Disposable services typically expire before the user completes this step - even if one slips past the API check.
Risk-score gating: Use the risk score from verification to gate trial features. A score above 60 (plus-address, role account, free service combined) could trigger a "trial activation pending review" flow rather than immediate full access. Low-risk accounts get instant access.
Usage monitoring: After the trial starts, watch for pattern signals - multiple accounts from the same IP range, identical usage patterns across accounts, accounts that activate and immediately start maximum-intensity usage without any exploration phase. These suggest programmatic abuse that bypassed signup verification.
Frequently Asked Questions
Should I require a work email for free trial signups?
It depends on your target customer and growth model. Requiring work email reduces abuse effectively but also reduces signup volume - many legitimate users, especially developers evaluating tools personally, prefer Gmail for trials. If your average contract value is high and you have sales following up on trials, requiring work email makes sense. If you rely on self-serve volume to drive paid conversion, the friction cost may outweigh the fraud prevention benefit.
Is email verification enough to stop all trial abuse?
No, and any vendor who says otherwise is overselling. Email verification blocks the easiest and most common abuse vector - disposable and invalid addresses. Motivated abusers using fresh Gmail accounts require additional behavioral signals to detect. Combine verification with email confirmation, rate limiting per IP, and usage monitoring for a complete defense. The Bulk Email Checker API is your first gate, not your only gate.
Will blocking disposable emails hurt conversion rates?
It removes low-quality signups that were unlikely to convert anyway. Your raw signup count will drop, but your trial-to-paid conversion rate should improve because the remaining trials represent genuine prospects. More importantly, your analytics become accurate again - you are measuring conversion from real users rather than from a mix of real users and indefinitely-extended trial abusers.
How do I handle privacy relay email addresses like Apple Hide My Email?
Apple Hide My Email addresses end in @privaterelay.appleid.com and are legitimate - they are used by real customers who do not want to share their primary address. Treat these like catch-all unknowns: allow the signup, store the flag, and accept that follow-up communication will work (Apple forwards it) but you cannot normalize or deduplicate against other Apple relay addresses from the same user. SimpleLogin and similar services use varying domains - the API's disposable detection catches many of the abusive relay services while allowing legitimate privacy-focused ones through.
Can I use the Bulk Email Checker API to verify existing trial accounts in bulk?
Yes. Export your trial user list, run it through the bulk verification tool or via the API in a batch script, and apply the same decision logic retroactively. Accounts with isDisposable: true or status: failed that are past their trial period without converting are safe to suppress from email marketing and mark for cleanup. Use the pay-as-you-go credits for a one-time cleanup, or the unlimited plan for ongoing real-time verification at scale.
Clean Your Funnel Before It Gets Expensive
Trial abuse is one of those problems that compounds quietly. The accounts accumulate, the infrastructure costs mount, and the conversion metrics look increasingly confusing until you pull the thread and realize a large fraction of your signups were never real.
Email verification at signup is the cheapest intervention available. At a fraction of a cent per verification call, the cost of checking every signup is negligible compared to the cost of serving fake accounts, chasing ghost leads, and making growth decisions based on polluted data.
Start with the hard blocks - disposable and gibberish - and watch your trial quality improve immediately. Then add the plus-address normalization and email confirmation flow, and you have addressed the vast majority of abuse patterns without adding meaningful friction for legitimate users.
Stop Bouncing. Start Converting.
Millions of emails verified daily. Industry-leading SMTP validation engine.