SaaS signup fraud prevention
Fake signups are cheap to create and expensive to serve. This is what the abuse actually looks like, which signals separate it from real users, where the check belongs in your flow, and how to set thresholds without turning away customers.
Four problems that look like one
"Signup fraud" covers four distinct behaviours. They need different responses, and a defence tuned for one will miss the others.
Free tier abuse
One person, many accounts, each staying inside the free limits. Real inboxes on real domains, so an email blocklist never sees them. The tell is infrastructure: the same datacenter range, or a residential proxy pool cycling addresses.
Read moreBot registrations
Automated signups that inflate your numbers, consume trial resources and poison your analytics. Almost always datacenter-originated, and almost always faster through the form than a human could be.
Read moreDisposable email signups
Throwaway mailboxes from people who never intend to be reachable. The easiest to catch and the most commonly overcounted, because catching them feels like solving the problem when it is the shallowest layer.
Read moreAccount takeover attempts
A known account arriving from an unfamiliar place. The signup check and the login check are the same check, applied at a different moment.
Read moreWhy one signal is never enough
Every individual check has a population it cannot see, and each one has a false positive problem that only shows up at scale.
| Signal alone | What it misses |
|---|---|
| Disposable email list | Anyone using a real inbox, which is most abuse above trivial scale |
| VPN detection | Residential proxies, which look like ordinary consumer connections |
| Datacenter IP blocking | Nothing much, but it blocks legitimate corporate and privacy-conscious users too |
| Email verification loop | Anyone patient enough to click a link, and it costs you conversion on every real user |
| Captcha | Solver services, and it taxes every legitimate signup to catch a minority |
The useful move is not finding a better single signal. It is combining weak signals into one score, so a corporate VPN on its own is unremarkable but a corporate VPN plus a disposable address plus a country mismatch is not. Residential proxies are the clearest example of why any single check eventually fails.
Where the check belongs
After the form is submitted, before the account is created. Earlier and you are scoring an incomplete picture. Later and you have already provisioned something you are about to delete.
POST /register
|
├── validate the form
├── score the signup ← here
| allow → create the account
| challenge → create it, require email verification first
| block → refuse, log, do not provision
└── create the account
The three-way outcome is the part that protects conversion. A binary allow or block forces a choice between letting abuse through and refusing real users, and real users do sit behind corporate VPNs. The middle band is where you put friction instead of a wall.
One call, one decision
Fidro combines the email and IP signals into a single score and returns the decision, so your signup handler branches on one field rather than implementing the scoring itself.
curl -X POST https://fidro.io/api/validate \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"email": "user@example.com", "ip": "203.0.113.42"}'
{
"risk_score": 82,
"recommendation": "block",
"checks": {
"disposable_email": true,
"vpn": true,
"datacenter": true,
"proxy": false,
"tor": false,
"bad_isp": false,
"bad_ip": false,
"invalid_email": false,
"location_match": false
}
}
allow below 50,
challenge from 50 to 79,
block at 80 and above.
The checks object is the
reasoning, so you can override the thresholds where your risk appetite differs.
What a score of 73 actually means
walks through a real borderline case.
Setting thresholds without guessing
Start by blocking nothing. Run the scoring in log-only mode for a fortnight, look at what your known-good signups score, and set the block threshold above that. You will usually find real users cluster well below 50 and abuse sits above 80, which leaves a middle band worth challenging rather than refusing.
The failure mode to avoid is tuning on fraud caught rather than customers lost. Both numbers matter and only one of them is easy to see. Tuning fraud thresholds covers the arithmetic, and preventing fake signups without killing conversion covers what it costs when you get it wrong.
Going deeper
Questions
What counts as signup fraud in SaaS?
Four things, usually. Free tier abuse, where one person creates many accounts to keep using a free plan. Bot registrations that inflate your numbers and consume resources. Disposable email signups from people who never intend to be reachable. And account takeover attempts, where the signal is a familiar account arriving from an unfamiliar place. They share a shape: cheap to create, expensive to serve, and invisible if you only validate the email format.
Where should the fraud check go in a signup flow?
After the form is submitted and before the account is created. Checking earlier means scoring an incomplete picture; checking later means you have already provisioned resources for an account you are about to delete. The call needs the email and the IP, both of which you have at submit time.
Will blocking fraud hurt my conversion rate?
It will if you only have a block decision. A binary allow or block forces you to choose between letting fraud through and turning away real users, and real users do sit behind corporate VPNs. A third outcome, challenge, is what makes the tradeoff manageable: send the ambiguous middle to email verification or a captcha rather than rejecting it.
Is checking for disposable email addresses enough?
No. A disposable email list catches the laziest abuse and nothing else. Someone running free tier abuse at any scale uses real inboxes on real domains, and the signal that catches them is the IP: a datacenter range, a residential proxy, or the same address behind many accounts. Email and IP signals catch different populations, which is why scoring them together works better than either alone.
What threshold should I block at?
Start by blocking nothing. Run the scoring in log-only mode for a fortnight, look at what scores your known-good signups get, and set the block threshold above that. Most teams find their real users cluster well below 50 and the abuse sits above 80, which leaves a middle band worth challenging rather than refusing.
Score your first signup
200 requests a month free, no card. Enough to wire it into a real signup flow and watch what it does before you commit to anything.