Signed sign-ins
A sign-in from the browser or an app tells Apex "this visitor is jane@acme.co." Anyone can send that message, so on its own Apex can't tell your real sign-in from someone typing Jane's email into the console. Signed sign-ins let your server vouch for it.
How it works
- Apex gives each workspace a sign-in secret. Find it under Settings, Workspace, Signed sign-ins. Only workspace admins can see it.
- When someone signs in, your server signs their email with the secret and hands the result (
userHash) to the page or app. - The page or app passes
userHashtoidentify(). Apex checks it and attaches the sign-in to the right person.
The secret never leaves your server. The hash only works for that one email.
What Apex does with each sign-in
| Sign-in | Signature not required | Signature required |
|---|---|---|
| Signed, hash matches | Attached to the person | Attached to the person |
| Signed, hash does not match | Held | Held |
| Not signed | Attached to the person | Held |
A held sign-in never changes a person already in Apex: their devices, traits, and history stay as they were. A new email still becomes a new person, kept out of journeys, partner credit, and scoring until a signed sign-in confirms them. A hash that does not match also shows as an issue on Set up Apex, since it usually means the secret was rotated or the email was changed before signing.
Turn on Require signed sign-ins once every place you call identify() sends a hash.
Sign on your server
The hash is HMAC-SHA256 of the email, lowercased and trimmed, with the secret as the key, written as hex.
Pass it to identify
userHash is sent with the sign-in only. It is never saved as a trait.
A signed form submit also counts as a lead for Meta and LinkedIn, even from an app, where there is no website for Apex to check.
Rotating the secret
Rotate from the same settings card if the secret leaks. The old secret stops working immediately, so any sign-in your server signs with it is held until you deploy the new one. If Require signed sign-ins is off, unsigned sign-ins keep working in the meantime.
Apps and app keys
Do not put the sign-in secret, a server key, or a personal key in a mobile app. Use an app key (apex_pk_…, the App key preset under Settings, Organization, API keys) for the app's own traffic, and fetch userHash from your backend at sign-in. An app key lets a sign-up add a new person but never changes someone already in Apex, never counts revenue, and never sends anything to ad platforms.
Next steps
- Identity in the SDK
- Identity API
- Server Events for purchases and anything else you need Apex to trust