Skip to content

How one signup becomes allow, challenge or deny

Below is a decision recorded from the live API, replayed a signal at a time. Nothing about the person is unusual on its own. The answer comes from what happens when five ordinary observations turn out to describe the same someone.

Follow a signupRead the docs
A magnifying glass examining a yellow trial ticket, with a previously used ticket beneath it.
01 / Follow the evidenceA recorded decision, from the live API

Step 1 of 7

A signup arrives

A new address, a browser with no history, an IP you have not sold to before. It looks like any other Tuesday.

POST /api/v1/decisionsRecorded request
{
"email": "d.mercer+t7@mailinator.com",
"ip": "45.83.220.7",
"visitorToken": "…"
}

The token comes from the browser snippet and is good for five minutes.

02 / Understand the signals

Five families, because one signal is never enough

A single repeat is usually innocent. Households share a laptop, offices share an IP, and people genuinely forget which address they signed up with last year. Every signal OneTrial reads belongs to one of five families, and the answer depends far more on how many families agree than on how loud any one of them is.

That is also the protection against false positives. A shared office network on its own moves a signup very little. The same network, plus a device that finished a trial last month, plus an address that canonicalizes onto an existing account, is a different claim entirely.

Five complementary clues joined to one ticket.
Payment

Card fingerprints from your own Stripe account, so one card cannot quietly start a second trial. The number itself never reaches us.

Device

A device hint computed in the browser, plus a signed token that survives a cleared cookie jar. Treated as a hint, never as proof.

Email

The address canonicalized: plus tags stripped, dots folded where the provider ignores them, disposable domains recognised.

Network

The subnet rather than the address, whether the IP belongs to a datacenter, VPN or Tor exit, and where in the world it resolves.

Behaviour

How the form was filled: the pace, whether the visitor arrived cold, and whether the hour matches earlier abuse in the same cluster.

03 / Make the connection
Three paper account records joined by yellow clips; a separate record remains unconnected.

What linking means, and what it does not

Two accounts are linked when they share something that identifies a person rather than a place: a card fingerprint, a device token, a canonicalized address. Weaker hints, like a subnet, need company before they link anything, because a coffee shop is not a person.

Linking stops at the accounts directly connected to the signup and the ones connected to those. It does not crawl outward until half your customer base is one cluster, which is how graph based tools end up denying an entire university.

Everything decays. A trial consumed eighteen months ago says less about today than one consumed last week, and the older evidence fades rather than being deleted, so a returning real customer is not treated as a repeat offender forever.

04 / Decide what happens next

The answer is yours, never the visitor's

Your server receives the verdict, the score and the reason codes. The visitor receives a trial, a request for one proof, or a paid plan. They never see a score, a reason, or which signal gave them away, because anyone told exactly why they were blocked knows exactly what to change next time.

{
"decision": "challenge",
"score": 53,
"reasons": ["D_DEVICE_REPEAT", "N_IP24_REPEAT"],
"challengeOptions": ["card", "email"],
"challengeUrl": "https://onetrial.dev/c/9f3c1a"
}
The real response carries a weight on every reason. Those numbers, and the two lines that turn a score into a verdict, belong to your dashboard and your API rather than to this page.
Related reading: what free trial abuse costs you, how to detect multiple accounts from one person, and stopping coupon and promo abuse.