# Events & Webhook Explorer

Browse the webhook event catalog with sample payloads, and verify signatures interactively.

<!-- docs-source -->
Source: https://learning.monetizekit.app/docs/guides/events
<!-- /docs-source -->

## Verify a signature

MonetizeKit signs each delivery: HMAC-SHA256 over `"{timestamp}.{rawBody}"` using your endpoint secret, sent as `X-MonetizeKit-Signature`. Paste your values to compute and verify it — see the [Webhooks guide](/docs/guides/webhooks) for registering an endpoint and processing retried deliveries idempotently, and the [Caching and Edge Evaluation guide](/docs/guides/caching) for using these same events as cache-invalidation triggers.

## customers

`customer.created`

A new customer was created in the workspace.

```json
{
  "id": "evt_sample_00000000",
  "type": "customer.created",
  "workspace_id": "ws_example",
  "created_at": "2026-06-14T00:00:00.000Z",
  "data": {
    "customerId": "cust_123",
    "customerName": "Acme Corp",
    "customerEmail": "ops@acme.test"
  }
}
```

`customer.updated`

A customer's attributes or plan changed.

```json
{
  "id": "evt_sample_00000000",
  "type": "customer.updated",
  "workspace_id": "ws_example",
  "created_at": "2026-06-14T00:00:00.000Z",
  "data": {
    "customerId": "cust_123",
    "changes": [
      "plan"
    ]
  }
}
```

## subscriptions

`subscription.created`

A customer subscribed to a plan.

```json
{
  "id": "evt_sample_00000000",
  "type": "subscription.created",
  "workspace_id": "ws_example",
  "created_at": "2026-06-14T00:00:00.000Z",
  "data": {
    "customerId": "cust_123",
    "subscriptionId": "sub_123",
    "planId": "plan_pro"
  }
}
```

`subscription.updated`

A subscription changed status, plan, or term.

```json
{
  "id": "evt_sample_00000000",
  "type": "subscription.updated",
  "workspace_id": "ws_example",
  "created_at": "2026-06-14T00:00:00.000Z",
  "data": {
    "subscriptionId": "sub_123",
    "status": "active",
    "planId": "plan_pro"
  }
}
```

`subscription.canceled`

A subscription was canceled.

```json
{
  "id": "evt_sample_00000000",
  "type": "subscription.canceled",
  "workspace_id": "ws_example",
  "created_at": "2026-06-14T00:00:00.000Z",
  "data": {
    "subscriptionId": "sub_123",
    "canceledAt": "2026-06-14T00:00:00.000Z"
  }
}
```

## catalog

`plan.created`

A new plan was created (not yet published).

```json
{
  "id": "evt_sample_00000000",
  "type": "plan.created",
  "workspace_id": "ws_example",
  "created_at": "2026-06-14T00:00:00.000Z",
  "data": {
    "planId": "plan_pro",
    "status": "draft",
    "version": 1
  }
}
```

`plan.updated`

A plan's definition changed (features, pricing, or limits).

```json
{
  "id": "evt_sample_00000000",
  "type": "plan.updated",
  "workspace_id": "ws_example",
  "created_at": "2026-06-14T00:00:00.000Z",
  "data": {
    "planId": "plan_pro",
    "version": 2
  }
}
```

`plan.published`

A plan version was published.

```json
{
  "id": "evt_sample_00000000",
  "type": "plan.published",
  "workspace_id": "ws_example",
  "created_at": "2026-06-14T00:00:00.000Z",
  "data": {
    "planId": "plan_pro",
    "status": "published",
    "version": 3
  }
}
```

`plan.archived`

A plan was archived and can no longer be assigned to new customers.

```json
{
  "id": "evt_sample_00000000",
  "type": "plan.archived",
  "workspace_id": "ws_example",
  "created_at": "2026-06-14T00:00:00.000Z",
  "data": {
    "planId": "plan_legacy",
    "status": "archived",
    "version": 4
  }
}
```

`feature.updated`

A feature definition changed.

```json
{
  "id": "evt_sample_00000000",
  "type": "feature.updated",
  "workspace_id": "ws_example",
  "created_at": "2026-06-14T00:00:00.000Z",
  "data": {
    "featureId": "feat_seats",
    "key": "seats"
  }
}
```

`feature.deleted`

A feature definition was deleted.

```json
{
  "id": "evt_sample_00000000",
  "type": "feature.deleted",
  "workspace_id": "ws_example",
  "created_at": "2026-06-14T00:00:00.000Z",
  "data": {
    "featureId": "feat_legacy",
    "key": "legacy_feature"
  }
}
```

## usage

`usage.threshold`

A customer crossed a soft or hard usage budget threshold.

```json
{
  "id": "evt_sample_00000000",
  "type": "usage.threshold",
  "workspace_id": "ws_example",
  "created_at": "2026-06-14T00:00:00.000Z",
  "data": {
    "customerId": "cust_123",
    "meterId": "meter_api",
    "thresholdValue": 100000,
    "currentUsage": 100250
  }
}
```

## credits

`credit.granted`

Credits were granted to a customer wallet.

```json
{
  "id": "evt_sample_00000000",
  "type": "credit.granted",
  "workspace_id": "ws_example",
  "created_at": "2026-06-14T00:00:00.000Z",
  "data": {
    "customerId": "cust_123",
    "amount": 500,
    "reason": "manual_grant"
  }
}
```

`credit.depleted`

A customer's credit balance reached zero.

```json
{
  "id": "evt_sample_00000000",
  "type": "credit.depleted",
  "workspace_id": "ws_example",
  "created_at": "2026-06-14T00:00:00.000Z",
  "data": {
    "customerId": "cust_123",
    "balance": 0
  }
}
```

## entitlements

`entitlement.changed`

A customer's effective entitlement for a feature changed (plan, add-on, or override).

```json
{
  "id": "evt_sample_00000000",
  "type": "entitlement.changed",
  "workspace_id": "ws_example",
  "created_at": "2026-06-14T00:00:00.000Z",
  "data": {
    "customerId": "cust_123",
    "featureKey": "seats",
    "allowed": true,
    "effectiveValue": 25
  }
}
```

## Activation funnel

Beyond the webhook events above, the embed SDK posts activation-funnel telemetry to the ingestion beacon `POST /api/v1/events/funnel` as visitors move through your pricing widget. Send `widget_view` when the pricing table mounts and `checkout_started` when the upgrade call-to-action is clicked; the `activated` stage is derived server-side from the MRR movement ledger and is never posted by the widget. The request body carries `event` (`widget_view` or `checkout_started`), `sessionId` (a stable anonymous id per widget mount), and an optional `planId`; a successful call returns `201` with the recorded event id. Authenticate this beacon with a browser-embedded publishable key — the one write that accepts one — which is exempt from the per-key scope check because it records only an anonymous, workspace-scoped funnel-telemetry row (plus the standard first-API-call activation telemetry the API layer records for any authenticated request) and touches no tenant business data or configuration. See [Authentication](/docs/getting-started/authentication) for the publishable-key exception.