Who’s in the directory
Most identities are added for you:
Customer Identity is a per-app setting under Settings → Authentication. Turn it on for
customer-facing apps so that a customer who signs in to two of your apps is one person. Leave it off
for staff tools that shouldn’t add their users as customers.
Identity types
Every identity is one of three types. The type decides how it nests and whether it can be linked to a channel.- Account: the top of a tier. An account never has a parent and is never linked to a channel. It holds groups and people and anchors their shared data.
- Group: a collective such as a LINE group or room. A group nests under an account (or another group) and can be linked to the channel’s group or room id.
- Person: an individual. A person nests under a parent (or stands alone) and can be linked to one or more channel identifiers or logins: a LINE user id, an email, a phone number and so on.
How scope works
Identities nest into tiers through memberships: an account holds groups, a group holds people. Read scope flows upward. A subject reads its own data plus every ancestor’s, and never its members’ or its siblings’. Given the tree above:- Sam reads Sam’s data, the Acme support chat’s data, and Acme Inc.’s data (the full path up to the root).
- Dana reads Dana’s data and Acme Inc.’s data, but not Sam’s or the support chat’s.
- Acme Inc. reads only its own data; it has no parent.
An identity’s Memberships section shows its effective read scope: the subject plus all of
its ancestors, resolved into a flat list. That list is exactly what a scoped agent run can read,
so check it to confirm a customer is set up correctly before you point an agent at them.
Channel links
A channel link ties an external identifier or login to a person or group, so inbound messages and sign-ins resolve to the right identity. Accounts are never channel-linked.
A link marked verified is proof that the identifier belongs to that person. An email or phone
recorded without proof (typed in by reception, captured by a booking form) stays unverified, and
the same unverified email or phone can be recorded on several people, such as a family sharing one
number. App logins, dashboard logins and channel ids each belong to one identity only.
Inbound messages add identities automatically. When a message arrives on a connected channel,
Stardeck finds the sender by their channel link, or creates an identity on the spot: a person
for a direct message or a group for a group or room chat. For live channels you usually tidy,
link and organize the identities that arrive rather than create them by hand.
Managing identities
Create an identity
1
Open Identities
Go to Identities in your dashboard and click
New Identity.
2
Pick a type
Choose Account, Group, or Person.
3
Add details
Give it a display name and, optionally, an external reference: your own customer key, so you
can match the identity to a record in another system.
4
Optionally set a parent
For a group or person, you can choose the account or group it belongs to. Setting a parent moves
read scope, so it requires the govern permission (see Permissions).
Edit attributes
Click an identity to open it. You can rename it, set its external reference, and edit its attributes: free-form fields such as a position, a loyalty tier or a preferred language. Your apps read and write the same attributes (see Using identities from your app).Attach a channel link
Open an identity and add a link under Channel links: pick the kind (LINE, email, phone and so on), enter the external id, and mark it verified if you’re sure it belongs to that person. This is how you connect a known customer to the channels they message you from.Organize memberships
An identity’s Memberships control where it sits in the tier graph:- Belongs to: the parents it reads up from. Add a parent to widen its read scope; remove one to narrow it.
- Members: the identities that belong to it.
Merge
If the same customer ends up as two identities (for example, they messaged from two channels before you linked them), merge redirects one into a surviving identity of the same type. The merged identity’s channel links and scope move onto the survivor. Merging needs the govern permission, is audited, and can’t be undone automatically.Archive
Archiving retires an identity without deleting its history. An archived identity resolves to no read scope, so a conversation pointed at it reads no data.Team members in the directory
Every member of your organization is a person in the directory, linked to their dashboard login. Their display name andemail attribute follow their team account: when they change their name or
email, or an admin edits their managed account,
the directory updates.
While someone is on your team, those two fields are read-only here, in the dashboard and to your
apps. Team members change their own name and email in their Stardeck account; an admin edits an
organization-managed account from Settings → Members.
Their other attributes stay editable. Once someone leaves the organization, their name and
email are editable again.
When you create an account for someone who is already in the directory, such as a customer who
joins your staff, pick them in the Person column of
Create accounts so the
new login joins their existing profile instead of creating a second person.
Your apps don’t see people who are only team members: they’re left out of the SDK’s list and
search. Someone who is both a team member and an app user is included.
Connecting customers to their profile
Reception often creates a customer’s profile before the customer has an account: a walk-in, a phone booking, an imported list. When that customer later signs in to one of your apps, a profile connection joins their login to the profile that already holds their history. Stardeck hosts the whole flow. Your app asks for a link, and the customer confirms on a Stardeck page.- Email or phone invitation: the app sends a link to an email or phone already recorded on the profile. The customer proves they own it, then connects.
- Profile invite link: for a profile with no email or phone on record, such as a new staff member known only by name. The app shows the link in person, as a QR code or a printed slip. Nothing is verified: whoever opens the link and signs in gets that profile, so never send one to an address you’re not sure of.
Permissions
Identity management is controlled by organization permissions (see Members & Roles):
The manage/govern split exists because anything that changes an identity’s place in the tier graph
changes what an agent can read. A teammate with only
identities:manage can keep the directory tidy,
but can’t widen or narrow a customer’s read scope.
Using identities with AI agents
Customer-facing agents that read data scoped to an identity are in early access. To try them,
email support@stardeck.ai.
identities:manage. The
View person button opens the identity’s details without leaving the conversation.
Using identities from your app
Apps read and write the directory throughintegrations.identities in the integrations-sdk
package. The package’s SKILL.md has the full API, including profile connections; this section
covers attributes.
Profile attributes
Attributes live on the identity’sprofile object. Set them when you create the identity:
update replaces the whole profile. It doesn’t merge. Read the identity, change what you need,
and write the full object back:
email attribute is
refused (see Team members in the directory). Writing the existing
values back unchanged is fine, and a profile that leaves out email keeps the team member’s current
email.
Finding people by attribute
Passattributes to search:
- Matching is exact, and every key must match.
- Values are compared with their JSON type:
"5"doesn’t match5. - Values must be a string (up to 500 characters), number or boolean. Objects, arrays and
nullare rejected. - You can filter on up to 10 keys, each 1–100 characters.
attributescombines withquery, which matches the display name or the external id of any link (an email, phone or channel id).- Pagination works the same way with or without
attributes: passnextCursorback ascursor.limitis 1–100 and defaults to 50.
Keeping internal data private
Scope decides which customer an agent can read. It doesn’t decide what about that customer the agent may show. A support record often holds both: the order and its status are fine to share with the customer; the margin, your private notes and a churn flag are not. Stardeck draws this line on the data store, not in your app’s code. A scoped agent reads the store directly, so any filtering you write in your app never runs for it. A customer-facing agent (one replying to the customer) sees only the data you’ve marked client-facing; a staff agent (one of your own team’s agents, scoped to a customer to help them) sees the whole record. You separate the two in one of two ways.A staff-only store
Keep internal data in its own data store and turn on Staff-only store in the store’s General settings. A customer-facing assistant can never be granted a staff-only store, so it can’t read anything in it; your staff agents still can. Point both stores at the same customer (the same identity), and a staff agent reads across both while a customer-facing agent reads only the client-facing store. Use this when your internal data already lives in its own tables: private notes, risk scores, financial detail.Column and row visibility on a shared store
When client and internal data share a table (the same record has a public status and a private note), tag the sensitivity instead of splitting the table. In the store’s General settings, turn on Enforce client/internal visibility, then:- Column tiers: mark each column Client or Internal. A customer-facing agent reads only the Client columns; Internal ones are hidden, and can’t be searched or sorted on either.
- Row visibility: for each table, pick the column that decides whether a row is visible to the customer (for example, a “visible to client” checkbox your app already sets). A customer-facing agent reads only the rows where it’s on. A table left Not configured stays hidden from customer-facing agents entirely.
- Default tier: un-tagged columns fall back to the store default. Leave it Internal so a new column stays private until you deliberately mark it Client.
Staff agents are never filtered: they read every column and row for the customer they’re scoped
to. Only customer-facing agents get the trimmed view, so one shared table can serve both. The
customer sees their slice; your team sees the whole record.
Next steps
- Data Stores: reference identities from your tables so agents and apps read per-customer data.
- Inviting people: add team members and app users, who appear in the directory.
- Members & Roles: grant your team the identity permissions.
- LINE: connect a channel whose inbound messages add and link identities.