End-user identity
End users never sign in to the console. They arrive through a channel — Slack, Teams, a web widget, email — and Cobalt maps that inbound identity to a single canonical person so the agent knows who it’s talking to, applies the right policy, and (when allowed) acts on their behalf.The model
- Canonical user — one stable record per real person in your tenant. All history, memory, and authorization decisions hang off it.
- Channel identity — a typed identifier that links a canonical user to one
channel, e.g.
slack:T01234/U987,teams:<tenant>/<aad-object-id>,email:alice@acme.com,web:<session>. A person accumulates several.
How a person gets resolved
Cobalt resolves identity in a strict order — higher sources win:- Directory provisioning (SCIM) — if you’ve set up SCIM, people already exist with verified emails. Most channel identities then resolve automatically by email. This is the happy path — no rules, no review.
- Verified signals — a cryptographic proof of ownership (e.g. an OAuth flow that returns a verified email) links a channel identity with no admin involvement, even without SCIM.
- Identity rules — admin-defined, deterministic rules (match a field → resolve to a person, with an optional transform) for environments where SCIM and verified signals don’t cover everyone. Evaluated in order, first match wins. Most fully-SCIM’d tenants never need these.
- Manual linking — an admin links a provisional identity to a person from the review queue. The fallback for edge cases.
The review queue
Anything the automatic paths can’t settle confidently lands in the review queue (Settings → Identity) for an admin. The queue is organized by what happened:- Pending Confirmation — a rule matched with low confidence. Nothing was linked; the item waits for you. Approve links the identity to the suggested person, Reject leaves it provisional.
- Medium Review — a rule matched with medium confidence. The identity was linked immediately so the conversation wasn’t blocked; the item is a post-hoc check. Reject it if the link looks wrong, then fix it from the person’s page.
- Conflicts — a rule matched multiple people (ambiguous), or an email was re-claimed after being released. There’s often no single suggestion here — use Assign to pick the right person explicitly.
- The All tab additionally shows rarer items, such as a blocked OAuth merge or a user who exhausted their phone-verification attempts.
- Email claim/release — once an email is linked to a person it’s reserved for them; it can’t silently jump to a different person without an admin (or an authoritative SCIM event) releasing it first.
- Phone OTP — phone numbers get reassigned by carriers, so phone-based linking always requires a one-time-code confirmation, and re-verifies periodically.
The person record
Every canonical person has a page (open them from the queue, a conversation, or the directory) with two tabs:- Identities — every channel identity linked to them. From here you can link a provisional identity manually (email links go through the claim guard; phone always requires the OTP flow), unlink one (it reverts to provisional — nothing is deleted), or release an email address so a different person can claim it.
- Authorized systems — the per-user integration authorizations they’ve granted (each connection, its scopes, when it was authorized and when it expires). Revoke one and the next time the agent needs that system for them, they’re simply asked to authorize again.
Deprovisioning a person
When someone leaves, Deprovision on their page retires them in one step: Cobalt previews exactly what will happen — how many channel identities will be deactivated, integration authorizations revoked, and email addresses released — and asks you to type a confirmation before proceeding. The cascade is all-or-nothing: if any step fails, no changes are applied and you can retry. Revocations at the external vendors complete asynchronously; the page shows a notice until they’re done. (SCIM-managed tenants rarely need this — an IdP deactivation does the same thing automatically.)How each channel identifies users
Slack and Teams identities are resolved by directory lookup and are
attribution-grade (good enough to stamp who did something), but not
high-trust enough to act as the user — see trust tiers.
Web widget — no second sign-in
When you embed the widget in an app the user is already signed in to, don’t make them log in again. Pick the identity mode that fits the host:
Reach for Embedded token or Federated for embedded widgets — both are
silent. Interactive Hosted sign-in is only for the standalone hosted page.
Configure the mode on the channel — see Web widget.
Trust tiers
When a connection acts on an external system, it declares how the user’s identity is used:- Service account — all users share one identity; the end user’s identity isn’t forwarded. Same result for everyone.
- Attribution — the agent uses a tenant credential but stamps the resolved
user on the record (e.g. ServiceNow
caller_id). Any verified identity qualifies. - Trusted impersonation — the agent acts as the user. Because a wrong identity here means unauthorized access, only the strongest verification methods qualify: OAuth, SCIM, and federated IdP tokens. Notably, an embedded token or a Slack/Teams directory lookup is attribution-grade only — it can stamp identity but cannot impersonate.
Related
- Populate the directory: SCIM provisioning.
- Identify widget users: Web widget.
- Per-channel setup: Channels.
