# Webhook event types

Every webhook body has the same envelope. Signing is described on [Webhooks](https://clitrail.com/docs/webhooks).

| Type | Sent when |
| --- | --- |
| `cli.install_completed` | An installation reported `install_completed`. Once per installation. |
| `cli.first_run` | An installation reported `first_run`. Once per installation. |
| `cli.install_started` | An installation reported `install_started`, when you selected that event. Once per installation. Webhooks are the only destination for it. |
| `test.ping` | You chose **Send test**. `data` is empty and `id` starts with `clt_test_`. |

## Envelope

| Field | Description |
| --- | --- |
| `id` | Stable event ID, also sent as `webhook-id`: `clt_` and 40 hex characters. |
| `type` | One of the types above. |
| `timestamp` | When the install was recorded, ISO 8601. |
| `data.website_id` | Your website ID. |
| `data.event_id` | The event ID the hook sent. |
| `data.installation` | SHA-256 of a pseudonymous installation ID. Stable across events from one installation. |
| `data.install_path` | The [install path](https://clitrail.com/docs/install-paths) ID the install counted toward. |
| `data.attribution.resolution` | `matched`, `ambiguous`, `unmatched` or `probable`. |
| `data.attribution.method` | `receipt`, `handoff`, `reconstructed`, or `null` when nothing was found. Installs matched by the network matching of earlier versions say `network`. |
| `data.attribution.confidence` | `high` or `medium` for reconstructed installs, otherwise `null`. |
| `data.attribution.policy` | The website's attribution policy. |
| `data.attribution.unattributed_reason` | `safari` or `external` when nothing matched; see [Unattributed installs](https://clitrail.com/docs/unattributed). Otherwise `null`. |
| `data.attribution.signals` | Reconstructed installs only: each signal compared, as `{ signal, points, match, detail }`. See [Reconstruction](https://clitrail.com/docs/reconstruction). |
| `data.attribution.touch` | The credited visit, or `null`. |
| `data.attribution.journey` | Every visit found, with the earlier visits its revisits replaced, oldest first. Empty when unmatched. |

## Touch

| Field | Description |
| --- | --- |
| `page_url` | The page visited, origin and path. |
| `referrer` | The page's referrer, origin and path, or `null`. |
| `source_referrer` | The external referrer where the session began, or `null`. |
| `channel` | The [channel](https://clitrail.com/docs/channels). |
| `utm` | The session's UTM values, or `null`. |
| `visited_at` | When the visit was recorded, ISO 8601. |
| `gpc` | `true` when the visit was made with Global Privacy Control. |
| `identifiers` | Only with **Include captured identifiers**: `{ ga4, google_ads, meta, tiktok, x, custom }` as captured. |
