A signup risk model fails in two predictable ways. Either it is asked to make the final call, so one bad generation blocks a paying customer, or it is fed everything and asked for an opinion, so its output drifts between signups and cannot be audited. The fix is to split the jobs. The model does one job: map a compact, fixed feature set to a number and a short explanation. Your application does the other: decide what that number means for this signup, using error rates you have measured.
Device fingerprints supply the raw material. A fingerprint is a set of hardware, software and network attributes combined into a stable identifier, and the useful ones stay stable across sessions for a single device while still varying between devices (Sumsub). Server-side storage matters: device IDs held in your own database survive cookie clearing, incognito sessions and browser switches in a way that cookies do not (Stytch).
Email patterns fill the other half. Domain age, disposable or catch-all status, MX and SPF configuration, and reputation all say something about how far a signup deserves investigation, and tooling exists to score an address before you send any mail to it (Abstract API). The scoring prompt should see both families of signals together, because the interesting cases are the conflicts.
The decisive insight: a model asked "is this fraud?" answers confidently and inconsistently. A model asked "score these named features on a 0 to 100 scale and list the three features that drove the score" produces something you can calibrate, log and argue with. That is the gap between a demo and a system.



