> ## Documentation Index
> Fetch the complete documentation index at: https://webhooks.docs.growcrm.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Team

> Payload reference for team.created, team.updated and team.deleted webhooks.

# Team

> New to webhooks? Start with **[Getting started](/getting-started)** (envelope, delivery, retries)
> and **[Verification](/verification)** (confirming a request came from Grow CRM). Those conventions
> apply to every event below and are not repeated here.

Team members expose three keys: `team.created`, `team.updated`, `team.deleted`. There is no
`.sundry` or `.activity` — every change to a team member arrives as `team.updated`, and team members
have no child records.

These events cover **team members only**. Client contacts are not included.

## What the payload does and does not contain

The payload is a deliberate, fixed whitelist of profile fields. Credentials and security material —
password hashes, session and password-reset tokens, two-factor secrets, last-known IP address,
payment-gateway customer ids — are **never** included, and cannot be exposed by a future change to
the underlying record.

Personal preferences (theme, language, notification and filter settings) are also excluded, as they
are local UI state rather than shared record data.

## The team member object

`.created` and `.updated` carry this shape — flat for `.created`, nested under `team_member` for
`.updated`:

```json theme={null}
{
  "id": 7,
  "uniqueid": "d8k2m4pa",
  "first_name": "Dana",
  "last_name": "Okafor",
  "email": "dana@example.com",
  "phone": "+1 555 0142",
  "position": "Senior Developer",
  "status": "active",
  "account_owner": "no",
  "role": { "id": 2, "name": "Staff" },
  "dates": { "created": "2026-07-31T09:00:00" }
}
```

| Field           | Type         | Notes                                                                                                           |
| --------------- | ------------ | --------------------------------------------------------------------------------------------------------------- |
| `id`            | integer      | The user id.                                                                                                    |
| `uniqueid`      | string       | `unique_id`.                                                                                                    |
| `first_name`    | string       |                                                                                                                 |
| `last_name`     | string       |                                                                                                                 |
| `email`         | string       | Cleared when the member is deleted — see `team.deleted` below.                                                  |
| `phone`         | string\|null |                                                                                                                 |
| `position`      | string\|null | Job title.                                                                                                      |
| `status`        | string       | `active`, `suspended` or `deleted`.                                                                             |
| `account_owner` | string       | `yes` or `no`.                                                                                                  |
| `role`          | object       | `{ id, name }` — the member's permission role.                                                                  |
| `dates`         | object       | Raw database value, so `created` is `Y-m-d H:i:s`, not the ISO-with-microseconds format used by most resources. |

## `team.created`

Fires when a team member is added. `data` is the full team member object above.

The new member is also emailed a generated password at this point; that password is never included
in the payload.

```json theme={null}
{
  "event": "team.created",
  "id": 7,
  "created": "2026-07-31T09:00:00+00:00",
  "data": {
    "id": 7,
    "uniqueid": "d8k2m4pa",
    "first_name": "Dana",
    "last_name": "Okafor",
    "email": "dana@example.com",
    "phone": null,
    "position": "Senior Developer",
    "status": "active",
    "account_owner": "no",
    "role": { "id": 2, "name": "Staff" },
    "dates": { "created": "2026-07-31 09:00:00" }
  }
}
```

## `team.updated`

Fires on any change to a team member. `data.change` tells you which; `data.team_member` is the full
object.

| `change` | Fires when                                                                                                                                                             |
| -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `edited` | The team member edit form is saved. Covers profile fields, role changes and status changes — the form saves them together, so they are not separately distinguishable. |

Compare `role` and `status` against your own copy if you need to react specifically to a permission
change or a suspension.

```json theme={null}
{
  "event": "team.updated",
  "id": 7,
  "created": "2026-07-31T09:15:00+00:00",
  "data": {
    "change": "edited",
    "team_member": { "id": 7, "status": "suspended", "role": { "id": 2, "name": "Staff" }, "...": "..." }
  }
}
```

A team member changing their **own** preferences does not fire an event.

## `team.deleted`

Fires after a team member is removed. `data` is just the id.

Deletion is a **soft delete**: the account row is kept for referential integrity, its status set to
`deleted`, and its email, password, role and avatar cleared. Treat `team.deleted` as final — the
member cannot log in again and will not appear in the team list.

```json theme={null}
{
  "event": "team.deleted",
  "id": 7,
  "created": "2026-07-31T09:30:00+00:00",
  "data": { "id": 7 }
}
```
