The identity graph for free trials

One person.
A hundred free trials.
Not on your watch.

Halo links accounts across email aliases, phone numbers, devices and networks, then answers one question on your signup route: is this a new customer, or the same person again?

5-minute install No card required Live API key on signup 40ms p95
Identity graph linking duplicate free trial signups into a single cluster
POST /v1/check flagged · risk 92
3 accounts · 1 real person · $147 in free credits saved

Built for teams losing millions to duplicate free signups

PaneraStarbucksClaudeLovableClayOrigami

What Halo does

Every signup goes in. One verdict comes out.

You already collect an email, maybe a phone, an IP and a device cookie. Halo takes those raw fields, canonicalizes them, compares them against every identity you've ever seen, and returns a decision your signup route can act on immediately.

clear

Brand-new person. Grant the trial, no friction.

review

Suspicious overlap. Send to manual review or step-up verification.

flagged

Same person as an existing account. Deny the promo.

Input — three separate 'customers'
j.smith@gmail.com · 24.16.8.91 · dfp_9a2c
jsmith+free@gmail.com · 24.16.8.91 · dfp_9a2c
james.smith2@googlemail.com · 88.2.44.10 · dfp_9a2c
Halo canonicalizes and links
email·dotsemail·aliasdomain·equivdeviceipname-key
Output — one person
{
  "verdict": "flagged",
  "risk_score": 92,
  "cluster_id": "cluster_a3f2",
  "cluster_size": 3,
  "signals": ["email_normalized","device","ip"]
}
Run this yourself in the live demo
Rows of ghosted duplicate account silhouettes with one real person highlighted

How it works

Ship it before lunch.

01

Drop in one call

A single POST from your signup route. No SDK, no schema changes, no queue.

02

Halo builds the graph

Each signup is canonicalized and matched against every prior identity in your workspace.

03

Act in ~40ms

clear · review · flagged, with the exact signals that fired so your team can defend the call.

The ROI

Every duplicate trial is margin you already paid for.

Free promos are a customer-acquisition budget. When one person claims it ten times, you're not acquiring a customer — you're buying a stranger lunch. Move the sliders to your numbers.

Abusive events / mo
1,200
Caught by Halo
1,044
Recovered / mo
$15,660

Illustrative: assumes an 87% catch rate. Run a week of shadow mode and we replace every number here with your measured data before you block anything.

A fan of identical loyalty punch cards with one highlighted
$187,920

recovered per year at your numbers.

The signals

Six ways we catch the same person twice.

Email normalization

j.smith+free@gmail.com and jsmith@googlemail.com collapse to one identity. Dots, plus-aliases, domain equivalents.

Phone matching

Country code, formatting and leading zeros canonicalized. Burner and VoIP ranges flagged.

Device fingerprint

Stable browser/device hash that survives cookies, incognito and IP rotation.

Behavioral linkage

Signup cadence, name-key similarity, IP + ASN, geolocation drift. Weighted, not brittle.

Explainable risk score

Every flag ships with the exact signals that fired. No black boxes — defensible to your team.

40ms p95

Runs on the hot path of signup. Never blocks a real user; never lets a duplicate through.

Install

One call. No SDK.

Halo is a single HTTP endpoint. It works from Next.js, Rails, Django, Cloudflare Workers — anything that speaks JSON. You get a decision, a cluster ID, and the exact signals that fired.

  • No queues. No dashboards to babysit.
  • Idempotent — safe to call from every signup, login or checkout.
  • Every response is explainable and audit-logged.
const res = await fetch("https://halo.dev/api/public/v1/check", {
  method: "POST",
  headers: {
    "content-type": "application/json",
    "x-api-key": process.env.HALO_KEY,
  },
  body: JSON.stringify({
    email: user.email,
    phone: user.phone,
    ip: req.ip,
    device_fingerprint: req.cookies.hlo_dfp,
  }),
});

const { verdict, risk_score, cluster_id, signals } = await res.json();
if (verdict === "flagged") return denyTrial();

Vs. legacy fraud tools

Built for the trial funnel, not the bank vault.

Legacy fraud stacks are excellent at stopping stolen credit cards. They are overkill — and priced accordingly — for stopping the same person from claiming three free lattes.

HaloLegacy fraud stack
Setup time5 minutesWeeks of integration
Email dot/alias normalizationBuilt inDIY
Explainable per-signal riskYesBlack-box score
Built for promo & trial abuseYesPayment fraud first
Price to startFreeEnterprise sales call

Questions, answered.

Will this block real customers?

No. Halo returns a score and the signals behind it — you decide the thresholds. Most teams only hard-block at flagged (60+) and route review to a lightweight verification step.

What data do I have to send?

Email alone works. Adding phone, IP and a device fingerprint roughly doubles the catch rate.

Where does the data live?

In your own isolated workspace, scoped by API key. Identities are never shared or pooled across customers.

How long does integration take?

One POST request on your signup route. Teams are typically live in under five minutes.

Stop paying strangers to be your best customer.

Spin up a workspace, drop in one API call, watch the duplicates appear.