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

# Projects

> Payload reference for project.created, project.updated, project.sundry, project.activity and project.deleted webhooks.

# Projects

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

Projects expose all five keys plus an import key: `project.created`, `project.updated`,
`project.deleted`, `project.sundry`, `project.activity`, `project.imported`.

## The project object

Every key except `.deleted` carries this shape, either flat (`.created`) or nested under `project`
(`.updated`/`.sundry`):

```json theme={null}
{
  "id": 305,
  "title": "Website Redesign",
  "description": "Full site rebuild.",
  "status": "in_progress",
  "active_state": "active",
  "progress": 40,
  "client": { "id": 12, "name": "Acme Inc" },
  "category": { "id": 2, "name": "Design" },
  "dates": {
    "start": "2026-07-01",
    "due": "2026-09-01",
    "created": "2026-06-28T10:00:00.000000Z",
    "updated": "2026-07-16T08:12:00.000000Z"
  },
  "assigned": [ { "id": 34, "name": "John Smith" } ],
  "tags": ["priority"]
}
```

| Field          | Type             | Notes                                                                                                                                                  |
| -------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `id`           | integer          | `project_id`.                                                                                                                                          |
| `title`        | string           |                                                                                                                                                        |
| `description`  | string\|null     |                                                                                                                                                        |
| `status`       | string           |                                                                                                                                                        |
| `active_state` | string           | `active` or `archived`.                                                                                                                                |
| `progress`     | integer          | 0–100.                                                                                                                                                 |
| `client`       | object           | `{ id, name }`.                                                                                                                                        |
| `category`     | object           | `{ id, name }`.                                                                                                                                        |
| `dates`        | object           | `start`, `due` are raw dates (date only); `created`, `updated` are ISO 8601 with microseconds (`Project` recasts these via `CREATED_AT`/`UPDATED_AT`). |
| `assigned`     | array            | `[{ id, name }]`, one per assigned user.                                                                                                               |
| `tags`         | array of strings |                                                                                                                                                        |

## `project.created`

Fires when a project is created, **including via clone**. `data` is the full project object above.

```json theme={null}
{
  "event": "project.created",
  "id": 305,
  "created": "2026-07-16T08:00:00+00:00",
  "data": {
    "id": 305,
    "title": "Website Redesign",
    "description": null,
    "status": "not_started",
    "active_state": "active",
    "progress": 0,
    "client": { "id": 12, "name": "Acme Inc" },
    "category": { "id": 1, "name": "Default" },
    "dates": { "start": null, "due": null, "created": "2026-07-16T08:00:00.000000Z", "updated": "2026-07-16T08:00:00.000000Z" },
    "assigned": [],
    "tags": []
  }
}
```

## `project.updated`

Fires on a significant change. `data.change` tells you which; `data.project` is the full object.

| `change`       | Fires when                                     |
| -------------- | ---------------------------------------------- |
| `edited`       | The main project edit form is saved.           |
| `status`       | The project's status changes.                  |
| `progress`     | The project's progress percentage changes.     |
| `assigned`     | The project's assigned user(s) change.         |
| `automation`   | The project's automation settings are updated. |
| `active_state` | The project is archived or restored.           |

```json theme={null}
{
  "event": "project.updated",
  "id": 305,
  "created": "2026-07-16T08:05:00+00:00",
  "data": {
    "change": "progress",
    "project": { "id": 305, "progress": 40, "...": "..." }
  }
}
```

## `project.sundry`

Fires on a minor, cosmetic field edit. `data.field` names it; `data.project` is the full object (same
shape as `.updated`, just a lower-significance discriminator).

| `field`       | Fires when                                      |
| ------------- | ----------------------------------------------- |
| `description` | The project's description is edited on its own. |
| `category`    | The project's category is changed.              |

```json theme={null}
{
  "event": "project.sundry",
  "id": 305,
  "created": "2026-07-16T08:07:00+00:00",
  "data": {
    "field": "category",
    "project": { "id": 305, "category": { "id": 2, "name": "Design" }, "...": "..." }
  }
}
```

## `project.activity`

Fires when a child record on the project changes. Projects produce the widest range of activity
types of any resource — comments, files, notes, checklists and milestones all arrive here.

| `type`              | `action`                                        | Item shape                                                                                                                                                  |
| ------------------- | ----------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `comment`           | `added`, `deleted`                              | `{ id, text, author, created }` — `author` is the commenter's first name only.                                                                              |
| `attachment`        | `added`, `deleted`                              | `{ id, uniqueid, filename }` — files uploaded to the project's Files tab. The delete event reads the record before removal, so the full shape is available. |
| `note`              | `added`, `updated`, `deleted`                   | `{ id, title, text, created }`                                                                                                                              |
| `checklist`         | `added`, `updated`, `deleted`, `status_changed` | `{ id, text, status, created }`                                                                                                                             |
| `checklist_comment` | `added`, `deleted`                              | `{ id, checklist_id, text, author, created }`                                                                                                               |
| `milestone`         | `added`, `updated`, `deleted`                   | `{ id, title, color, created }`                                                                                                                             |

```json theme={null}
{
  "event": "project.activity",
  "id": 305,
  "created": "2026-07-16T08:10:00+00:00",
  "data": {
    "type": "comment",
    "action": "added",
    "item": { "id": 601, "text": "Kickoff scheduled for Monday.", "author": "Jane", "created": "2026-07-16T08:10:00.000000Z" }
  }
}
```

### Checklists

`status_changed` is a checklist-specific action, fired when an item is ticked or un-ticked. It exists
so you can react to progress without diffing state — `item.status` is `pending` or `completed`.

```json theme={null}
{
  "event": "project.activity",
  "id": 305,
  "created": "2026-07-31T08:20:00+00:00",
  "data": {
    "type": "checklist",
    "action": "status_changed",
    "item": { "id": 77, "text": "Sign off wireframes", "status": "completed", "created": "2026-07-30 14:00:00" }
  }
}
```

Comments left on a checklist item come through as `checklist_comment`, kept separate from `comment`
so a note on one checklist item is never mistaken for a comment on the project. `checklist_id` names
the item it belongs to.

Reordering checklist items does not fire an event, and importing a checklist fires nothing per item.

### Notes

Two kinds of note never fire: notes marked **private** (the CRM restricts those to their author, so
they are not pushed to subscribers), and personal notes attached to a user rather than a project.

### Milestones

Reordering milestones does not fire an event.

```json theme={null}
{
  "event": "project.activity",
  "id": 305,
  "created": "2026-07-31T08:25:00+00:00",
  "data": {
    "type": "milestone",
    "action": "added",
    "item": { "id": 14, "title": "Phase 2 — build", "color": "info", "created": "2026-07-31 08:25:00" }
  }
}
```

## `project.deleted`

Fires after the project is deleted. `data` is just the id — the record no longer exists to describe.

```json theme={null}
{
  "event": "project.deleted",
  "id": 305,
  "created": "2026-07-16T08:15:00+00:00",
  "data": { "id": 305 }
}
```

## `project.imported`

Fires when a bulk project import finishes. Imported projects do **not** fire `project.created` — see
**[Imports](/events#imports)** for the batch shape, batching rules and the fields common to every
import event.

Each project record in the batch carries:

| Field       | Type          |
| ----------- | ------------- |
| `id`        | integer       |
| `title`     | string        |
| `client_id` | integer\|null |
| `created`   | string        |

```json theme={null}
{
  "event": "project.imported",
  "id": "8f3ka92m",
  "created": "2026-07-31T10:00:00+00:00",
  "data": {
    "import_ref": "8f3ka92m",
    "imported_by": 3,
    "batch": 1,
    "batch_count": 1,
    "totals": { "imported": 120, "skipped": 0, "errors": 2 },
    "records": [
      { "id": 305, "title": "Acme website rebuild", "client_id": 12, "created": "2026-07-31 10:00:00" }
    ]
  }
}
```
