user.created Event
Emitted when a new dashboard User is created for a client on a Listo
instance. A "user" here is a person who can sign in to the Listo dashboard
on behalf of the client — distinct from a worker (an employee or
contractor receiving payroll). For workers see worker.onboarded.
The event is emitted after the creation flow finishes assigning the
user's default manager and initial role, so status, manager, and
role are populated (not just null placeholders).
| Property | Value |
|---|---|
| Type | user.created |
| Data version | 1 |
| Entity | entity.type = "user", entity.id = data.userId |
| Fan-out | One delivery per matching subscription on the user's parent client |
| Payload shape | Same shape as user.updated |
Sample delivery
POST /your/webhook/path HTTP/1.1
Host: hooks.your-domain.com
Content-Type: application/json
User-Agent: ListoGlobal-Gateway/1.0
webhook-id: lglsoevt_uZK1mPLqRH4NbVcD8
webhook-timestamp: 1746180123
webhook-signature: v1,sQzr2nLY8uBp9q+kTaZf3oXyJVm6rE0wHxaP7wcKv4U=
{
"id": "lglsoevt_uZK1mPLqRH4NbVcD8",
"type": "user.created",
"specVersion": 1,
"dataVersion": 1,
"occurredAt": "2026-05-02T10:42:03.512Z",
"entity": { "type": "user", "id": "lglsousr_uXYZxLtq9ABvCdEf2" },
"data": {
"userId": "lglsousr_uXYZxLtq9ABvCdEf2",
"clientId": "lglsocli_uZIIHfKqYBwyaRGGs",
"email": "[email protected]",
"firstName": "Kalin",
"lastName": "Sasaki",
"fullName": "Kalin Sasaki",
"status": "INVITED",
"manager": null,
"role": {
"id": "5c1f0c2e-7c0e-4f1a-9b3d-2a1b6e4d8f90",
"name": "Admin"
},
"createdAt": "2026-05-02T10:42:00.000Z",
"links": {
"self": "/v1/instance-integrations/inst_abc123xyz/clients/lglsocli_uZIIHfKqYBwyaRGGs/users/lglsousr_uXYZxLtq9ABvCdEf2"
}
}
}data schema
data schema| Field | Type | Description |
|---|---|---|
userId | string | Public user ID (lglsousr_…). Same value as entity.id. |
clientId | string | Public client ID this user belongs to (lglsocli_…). |
email | string | Email address from the user's credential. Lower-cased by Listo. |
firstName | string | null | First name as captured at user creation. |
lastName | string | null | Last name. |
fullName | string | null | Full name (Listo's combined string — typically "firstName lastName"). |
status | string | Account status: ACTIVE, INACTIVE, INVITED, or DELETED. A freshly created user is typically INVITED. |
manager | object | null | The user's assigned manager at creation, or null. See below. |
role | object | null | The user's access role at creation (accessRoles[0]), or null. See below. |
createdAt | ISO-8601 UTC | When the user record was created in Listo. |
links.self | string | Path to fetch the current state of this user. Already substituted with your instanceIntegrationId before signing. |
manager object
manager object| Field | Type | Description |
|---|---|---|
id | string | Public user ID of the manager (lglsousr_…). |
firstName | string | null | Manager's first name. |
lastName | string | null | Manager's last name. |
fullName | string | null | Manager's full name. |
email | string | Manager's email. |
role object
role object| Field | Type | Description |
|---|---|---|
id | string | Internal access-role id. Not a public ID — access roles have no public ID. |
name | string | Role name (e.g. Owner, Admin, or a custom role name). Match on name for portability. |
Snapshot semantics
email, firstName, lastName, fullName, status, manager, and
role are a snapshot at emit time. Edits between emit and handler-run
are not reflected. Refetch via links.self if you need current state:
GET https://gateway.listoglobal.com{links.self}
x-api-key: <your-key>
createdAt is the immutable creation timestamp — it does not drift on
re-fetch.
To track later edits to a user's profile, status, manager, or role, listen
for user.updated,
which carries the same shape.
Ordering and duplication
- Duplicates are normal. Dedupe on
webhook-id. - Order is not guaranteed. Two
user.createdevents for the same
client may arrive out ofoccurredAtorder. Auser.updatedfor the
same user may even arrive before itsuser.created— upsert onuserId. - A
user.createdfor a brand-new client may arrive before the
correspondingclient.createdevent
reaches you. Don't assume the parent client already exists in your
store; either upsert speculatively, or refetch the client from
clients/{clientId}when handling user events.
Common patterns
"Provision SSO / RBAC on user creation"
user.created is the right hook to sync a new dashboard user into your
own identity provider, grant role-based access, or send a welcome email
sequence. The embedded role and manager let you provision without an
extra API round-trip.
"Track headcount by client"
Persist (clientId, userId, createdAt) triples keyed by webhook-id.
Aggregate as needed — you'll have an at-least-once stream that, after
deduplication, is a complete log of user creations within the
subscription's lifetime.
Updated about 1 month ago
