How to Stop Fake SaaS Signups

Published 2026-08-17 · Reviewed by Engineering / Technical Team
Quick answer

Stopping fake SaaS signups with email risk scoring means checking the address server-side before account creation, using the signup context so scoring weights match what actually matters at signup (disposable domains, generated-looking local parts, brand-new domains), and routing the decision — allow through immediately, block outright, or send to a secondary check like email confirmation — rather than trying to build a single perfect filter.

Check server-side, at account creation — not client-side, not after the fact

Client-side checks are trivially bypassed by anyone submitting the form programmatically, which is exactly who you're trying to catch. The check needs to happen on your server, as part of the signup request, before the account is created — not as a batch job that runs afterward and flags accounts you've already provisioned resources for.

Use the signup context, not generic

The API's context parameter changes which signals matter. In the signup context specifically, disposable-domain, randomized-local-part signals, and brand-new-domain signals are all weighted up relative to generic — because those are exactly the patterns automated account creation produces, while a role-based address (which matters a lot for a B2B lead form) is largely irrelevant here. Passing context: "signup" isn't cosmetic — it changes the actual score.

A routing framework, not a single filter

The decision field does the routing work for you — allow, review, or block — but what you do with each matters:

DecisionTypical score rangeSuggested action
allow0–29Create the account immediately, no friction
review30–79Create the account, but require email confirmation before granting full access (trial credits, API access, etc.)
block80–100Reject at signup with a clear error, or route to manual review for high-value accounts

The review band is doing the most important work here. It's tempting to treat anything non-zero as suspicious and block it, but that band exists specifically to avoid a binary allow/block decision — most real signups will land somewhere in it, and hard-blocking the entire band will cost you real customers. Email confirmation is a cheap, low-friction secondary check that resolves most of the ambiguity: someone using a throwaway or generated address usually never confirms it.

What not to do

  • Don't block every free-provider signup (Gmail, Outlook) — that's most of your legitimate user base, not your fraud
  • Don't treat "review" the same as "block" — you'll reject real customers along with the fraud
  • Don't run only a fast-mode check for a high-value action (a paid plan, not a free trial) — the confidence value tells you when a check was too shallow to lean on
  • Don't check once and never again — if you allow account creation before email confirmation completes, the risk state at signup and at confirmation can differ if you re-check

What this looks like in code

signup.ts
const result = await fetch("https://api.emailriskradar.com/v1/email/check", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.EMAIL_RISK_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ email, mode: "standard", context: "signup" }),
}).then((r) => r.json());

if (result.decision === "block") {
  return reject("This email address can't be used to sign up.");
}

const account = await createAccount({ email, needsConfirmation: result.decision === "review" });

if (result.decision === "review") {
  await sendConfirmationEmail(account);
  // Grant full trial access only after confirmation completes
}

At higher signup volume

If you're processing a backlog of existing accounts rather than checking at signup time, the bulk endpoint accepts a batch of addresses and processes them asynchronously, with results available by polling a job status endpoint or delivered to a webhook when the batch completes — useful for retroactively scoring an existing user base rather than only new signups.

FAQ

Will email risk scoring stop all fake signups?

No single check does. It removes the large volume of naive, low-effort abuse (disposable domains, generated addresses, scripted account creation) cheaply. Determined, well-resourced abuse typically needs additional layers beyond email — this is one input, not a complete fraud system.

Should I block signups or just flag them?

It depends on the decision band. Block-range scores are usually safe to reject outright; review-range scores are better routed to a secondary check like email confirmation than blocked outright, to avoid rejecting real users.

Does this replace CAPTCHA or rate limiting?

No — they solve different problems. CAPTCHA and rate limiting slow down automated submission volume; email risk scoring evaluates the specific address being submitted. They're complementary, not substitutes.

How fast is a signup-time check?

Standard mode (live DNS, no SMTP) typically returns well within the time budget of a normal signup request. Full mode adds a live SMTP handshake, which is slower and better suited to a background or async flow than a synchronous signup-blocking check.

See how this looks against a real address, or start checking your own traffic.

We use Google Analytics to understand site traffic, and only load it if you accept — nothing runs before you choose. Signing in still stores a strictly necessary session token regardless. See the Privacy Policy for details.