How to stop fake signups and spam accounts without punishing real users.
How to stop fake signups and spam accounts: layer device, network and behaviour evidence, verify on your server, and add friction only where the risk is.

To stop fake signups, stop treating the signup form as one gate and treat it as a moment to collect evidence. Check the device and the network at the instant of submission, read the result on your own server, and add friction in proportion to the risk, so real people sail through and scripts and serial account creators run into walls.
This guide covers how fake account detection works in practice, what Fingerly reports that helps, a step by step way to wire it into a signup flow, and how to clean up the fake accounts you already have.
Why do fake signups happen at all?
Because an account is worth money to someone who is not your customer. Spam signups create accounts to post links, send messages or scrape member lists. Bonus hunters create dozens of accounts to claim a welcome offer, a free trial or a referral reward. Resellers and fraud rings create accounts in bulk to hold inventory, test stolen cards or build a pool of aged accounts to sell.
Signup fraud and sign-up abuse are cheap to run and expensive to ignore. They inflate your user counts, burn your email and SMS budget, pollute your analytics, and quietly drain promotions that were meant for real customers. For a startup, the damage often shows up as a funnel that looks healthy until you notice that nobody converts or ever comes back.
Why do email checks and CAPTCHAs fall short?
Each one tests a single thing that is cheap to fake. An email address costs nothing to create, and disposable inboxes make confirmation links trivial. A CAPTCHA tests whether a visitor can solve a puzzle, which services and scripts now do at scale, and it taxes every real customer for the sake of the few who are not. Rate limits per IP address fail too, because abusers spread their attempts over many addresses.
The useful comparison is device fingerprinting vs CAPTCHA. A CAPTCHA asks the visitor to prove something. Device intelligence observes the session and reports what it finds, with no puzzle, no prompt and nothing for a person to do. Fingerly never asks the visitor for anything, which makes it a friction-free CAPTCHA alternative: your application decides whether any challenge is needed at all.
What evidence separates a fake signup from a real one?
Four kinds of evidence are worth reading together, because abusers can disguise one of them but rarely all four. Fingerly reports the first three on every identification, and the fourth comes from your own data.
- The device: a visitor ID that recognises the same browser or app install across signups, even after cookies are cleared or a private window is used, so you can count how many accounts one device has created.
- The environment: browsers driven by automation, clients that declare themselves a bot or scraper, virtual machines, modified browsers, and in native apps emulators, simulators and cloned apps.
- The network: VPNs, datacenter and residential proxies, Tor exits, and a location that disagrees with the device. These are reasons to look closer, not verdicts.
- Your own history: how many accounts, trials and redemptions already belong to that visitor ID, and what those accounts did next.
The findings are weighted into a suspect score with a level of low, medium or high. You can change what each signal is worth, and a weight of zero still records that the signal fired, so you keep the evidence while you decide how much it should count.
How do you add this to a signup flow?
Run the check when the visitor submits the form, tag it, and decide on your server before the account exists. These steps are the whole integration.
- Identify on submit with the browser or native SDK, tagged with the action, such as signup. If identification fails, carry on and send no request ID rather than blocking the person.
- Send the request ID to your backend with the form fields, and nothing else from the SDK.
- Server-side verification: read the stored event by request ID with a secret key. Check that it exists, carries the signup tag, is recent (two minutes is a good window) and has not been used before.
- Count accounts per visitor ID in your own database and apply your limit, then combine the count with the suspect level.
- Choose a response: allow, challenge or block. Record the request ID and visitor ID beside the decision so you can explain it later.
Treat anything the browser sends as untrusted, including a score. The decision belongs to your server, because a script can send whatever it likes to your form.
What should you do when a signup looks suspicious?
Match the response to the evidence, and prefer responses a real customer can pass. A hard refusal teaches an attacker which signal tripped. A quiet downgrade teaches nothing.
- Low level, first account on the device: allow.
- Medium level, or a second account on one device: step-up verification, such as a phone number or a second email check, before benefits are granted.
- Automation, a device farm or an emulator: create the account on hold, without free credit or trial access, and send it to manual review if you have the people for it.
- High level, or three or more accounts from one device in a window you choose: refuse without explaining why, or create the account with no benefits.
- No usable identification: ask for verification, because the device cannot be counted.
Shared devices are ordinary. Families share a tablet, shops share a till and students share a lab computer, so two accounts on one device is rarely abuse, while twenty is never a household. Choose limits that fit your product, and prefer verification and review over outright refusal.
How do you find the fake accounts you already have?
Start from the visitor ID, if you stored it with each account. Group accounts by visitor ID and sort by size: the biggest groups are your abusers. Look at which of them share a network, signed up in bursts, never verified a payment method or only ever claimed an offer. Because Fingerly can notify you through webhooks when an identification reaches the high level, you can also keep your own copy of the events you may want months later.
For the accounts you already hold, trust and safety teams usually choose the gentlest action that works: remove the benefits, require verification at next login, and only then suspend. Abuse prevention is cheaper when the cleanup is reversible.
How do you keep real customers out of the blast radius?
Observe before you enforce. Log what the policy would have done for a week or two, read the sessions it would have stopped, and tune the weights on your own traffic before turning on friction. Keep an appeal route, tell people why a promotion was limited in the terms, and never let a missing score default to a refusal. Detection fails open, and your policy can still require a verification step for any request that arrives without one.
Pricing is pay as you go, from $0.0025 per identification, so you can start on the one flow that bleeds most, a signup form or a free trial, and widen from there.
