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).

PropertyValue
Typeuser.created
Data version1
Entityentity.type = "user", entity.id = data.userId
Fan-outOne delivery per matching subscription on the user's parent client
Payload shapeSame 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

FieldTypeDescription
userIdstringPublic user ID (lglsousr_…). Same value as entity.id.
clientIdstringPublic client ID this user belongs to (lglsocli_…).
emailstringEmail address from the user's credential. Lower-cased by Listo.
firstNamestring | nullFirst name as captured at user creation.
lastNamestring | nullLast name.
fullNamestring | nullFull name (Listo's combined string — typically "firstName lastName").
statusstringAccount status: ACTIVE, INACTIVE, INVITED, or DELETED. A freshly created user is typically INVITED.
managerobject | nullThe user's assigned manager at creation, or null. See below.
roleobject | nullThe user's access role at creation (accessRoles[0]), or null. See below.
createdAtISO-8601 UTCWhen the user record was created in Listo.
links.selfstringPath to fetch the current state of this user. Already substituted with your instanceIntegrationId before signing.

manager object

FieldTypeDescription
idstringPublic user ID of the manager (lglsousr_…).
firstNamestring | nullManager's first name.
lastNamestring | nullManager's last name.
fullNamestring | nullManager's full name.
emailstringManager's email.

role object

FieldTypeDescription
idstringInternal access-role id. Not a public ID — access roles have no public ID.
namestringRole 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.created events for the same
    client may arrive out of occurredAt order. A user.updated for the
    same user may even arrive before its user.created — upsert on userId.
  • A user.created for a brand-new client may arrive before the
    corresponding client.created event
    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.


Did this page help you?