Halo.
Different accounts.
Same person.
Another email. Another free trial.
Not necessarily another customer.
Connect the identities at signup. Check their spending after. Protect the value you meant to give away.
Find your duplicates Or investigate a sampleThree accounts. Three free trials?
Email aliases and device signals, considered together.
“It was eye opening to see the number of duplicate accounts in our platform.”— Founder of TinyKnot
An inbox isn't
an identity.
One clue is just a clue.
Together, they tell a different story.
j.smith+trial@gmail.com
NORMALIZED EMAILjsmith@gmail.com
Dots, plus aliases and equivalent domains can make one inbox look like many. Halo normalizes them before comparison.
See the full evidenceIs this really a new customer?
Check signup signals. Return a score and reasons. Let your application allow, review or flag.
Should this request get more value?
Check the cost against a linked identity's allowance. Return allow, throttle, downgrade or block.
Free for them.
Not for you.
Put a number on the duplicates.
Before you put a limit on your users.
Recovery assumes an 87% catch rate, not measured performance. Credit value is not necessarily your actual cost. Use shadow mode to review real traffic before blocking.
See it in your own trafficYour auth stays.
Halo plugs in.
Create a workspace. Get your key.
Send the signup. Read the evidence.
- 01
Your workspace. Your signals.
Sign in and create a workspace with its own API key and isolated customer data.
- 02
One server-side request.
Send the signup signals you have. Add browser telemetry when appropriate and with consent.
- 03
Observe before you enforce.
Start in shadow mode. Review the decisions before changing your signup experience.
const response = await fetch(
"https://www.tryhalo.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,
ip: request.ip,
device_fingerprint: deviceHash,
mode: "shadow",
}),
}
);
if (!response.ok) throw new Error("Halo check failed");
const { verdict, risk_score, signals } = await response.json();No magic.
Just more context.
Will Halo block a real customer?
False positives are possible with any risk system. Halo returns evidence and a decision; your application controls the response. Start in shadow mode and review your own traffic before enforcing.
What happens after signup?
Your application can call the egress verification endpoint before an expensive action. Halo checks the cost against the linked identity's allowance and returns a recommendation. Your application implements the throttle, model change or block.
Do I need to change my authentication?
No. Keep your existing authentication. Your server sends signup signals to Halo using a workspace API key.
Is my customer data shared?
Identity data is scoped to your workspace, not pooled across customers. Access is limited by workspace membership. The default retention process anonymizes older identities after 90 days and deletes them after twice that window.
